相比于传统: 部署很是慢 成本很是高 资源浪费 难于迁移和扩展 可能会被限定硬件厂商
因为物理机的诸多问题,后来出现了虚拟机python
一个物理机能够部署多个app,每一个app独立运行在一个VM里。mysql
可是虚拟化也是有局限性的,每个虚拟机都是一个完整的操做系统,要分配系统资源,虚拟机多道程度时,操做系统自己资源也就消耗殆尽,或者说必须扩容。linux
因为环境部署配置的麻烦,出现了如下程序员
特性 | 容器 | 虚拟机 |
---|---|---|
启动 | 秒级 | 分钟级 |
硬盘使用 | 通常为 MB | 通常为 GB |
性能 | 接近原生 | 弱 |
系统支持量 | 单机支持上千个容器 | 通常几十个 |
1)资源占用多web
虚拟机会独占一部份内存和硬盘空间。它运行的时候,其余程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然须要几百 MB 的内存才能运行。redis
(2)冗余步骤多sql
虚拟机是完整的操做系统,一些系统级别的操做步骤,每每没法跳过,好比用户登陆。docker
(3)启动慢django
启动操做系统须要多久,启动虚拟机就须要多久。可能要等几分钟,应用程序才能真正运行。json
(1)启动快
容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。因此,启动容器至关于启动本机的一个进程,而不是启动一个操做系统,速度就快不少。
(2)资源占用少
容器只占用须要的资源,不占用那些没有用到的资源;虚拟机因为是完整的操做系统,不可避免要占用全部资源。另外,多个容器能够共享资源,虚拟机都是独享资源。
(3)体积小
容器只要包含用到的组件便可,而虚拟机是整个操做系统的打包,因此容器文件比虚拟机文件要小不少。
总之,容器有点像轻量级的虚拟机,可以提供虚拟化的环境,可是成本开销小得多。
说的通俗点:Docker做用
解决环境部署问题,基于一个镜像文件,可以运行出容器示例,就不须要作环境部署。
更高效的利用系统资源 因为容器不须要进行硬件虚拟以及运行完整操做系统等额外开销,Docker 对系统 资源的利用率更高。 不管是应用执行速度、内存损耗或者文件存储速度,都要比传 统虚拟机技术更高效。所以,相比虚拟机技术,一个相同配置的主机,每每能够运 行更多数量的应用。
更快速的启动时间 传统的虚拟机技术启动应用服务每每须要数分钟,而 Docker 容器应用,因为直接 运行于宿主内核,无需启动完整的操做系统,所以能够作到秒级、甚至毫秒级的启 动时间。大大的节约了开发、测试、部署的时间。
一致的运行环境 开发过程当中一个常见的问题是环境一致性问题。因为开发环境、测试环境、生产环 境不一致,致使有些 bug 并未在开发过程当中被发现。 而 Docker 的镜像提供了除内 核外完整的运行时环境,确保了应用运行环境一致性,从而不会再出现 “这段代码 在我机器上没问题啊” 这类问题。
持续交付和部署 对开发和运维(DevOps)人员来讲,最但愿的就是一次建立或配置,能够在任意 地方正常运行。 使用 Docker 能够经过定制应用镜像来实现持续集成、持续交付、部署。开发人员 能够经过 Dockerfile 来进行镜像构建,并结合 持续集成(Continuous Integration) 系 统进行集成测试, 而运维人员则能够直接在生产环境中快速部署该镜像,甚至结合 持续部署(Continuous Delivery/Deployment) 系统进行自动部署。 并且使用 Dockerfile 使镜像构建透明化,不只仅开发团队能够理解应用运行环 境,也方便运维团队理解应用运行所需条件,帮助更好的生产环境中部署该镜像。
更轻松的迁移 因为 Docker 确保了执行环境的一致性,使得应用的迁移更加容易。Docker 能够在 不少平台上运行,不管是物理机、虚拟机、公有云、私有云,甚至是笔记本,其运 行结果是一致的。 所以用户能够很轻易的将在一个平台上运行的应用,迁移到另外一 个平台上,而不用担忧运行环境的变化致使应用没法正常运行的状况。
1.yum安装,配置yum仓库 -阿里云仓库,清华源仓库,163仓库, 问题是,docker的版本可能很低,有不少漏洞 -选择软件官方提供的yum仓库,版本都是最新的,可是可能下载较慢 -因为网速问题,学习阶段仍是使用阿里云的docker [root@xujunk ~]#yum install docker -y 2.rpm 不推荐 3.源码编译安装,很麻烦,若是没有特定需求,仍是选择yum
yum remove docker* docker-* -y
curl -sSL https://get.daocloud.io/daotools/set_mirror.sh | sh -s http://f1361db2.m.daocloud.io
systemctl status/start/stop docker
[root@xujunk ~]#docker images #列出当前全部的镜像文件 [root@xujunk ~]#docker run hello-world #运行镜像文件,生成docker容器实例,docker run命令,会自动下载不存在的镜像 #容器是随时建立,随时删除的,轻量级,每次docker run 都会生成新的容器记录 #docker容器进程,若是没有在后台运行的话,就会当即挂掉, (容器中必须有正在工做的进程) #运行一个一直活着的容器进程 docker run -d centos /bin/sh -c "while true;do echo '你个糟老头子,不听课,坏得很'; sleep 1;done"
docker rmi 镜像名字/镜像id #删除镜像文件 docker rm 容器id/容器进程名字 #删除容器记录 docker rmi -f #强制删除镜像文件 docker rm `docker ps -aq` #批量删除容器记录,只能删除挂掉的容器记录
#docker容器进程的启停命令 docker start 容器id docker stop 容器id
docker search 镜像文件名字 #搜索镜像文件 docker images #列出当前全部的镜像文件 docker ps #列出当前记录正在运行的容器进程 docker ps -a #列出全部的容器进程,以及挂掉的 docker logs 容器id #查看容器内的日志信息 docker logs -f 容器id #检测容器内的日志 docker ps -aq #列出全部容器id #进入容器空间内的命令 docker exec -it 容器id /bin/bash #进入容器空间内 -i 交互式命令操做 -t 开启一个新的终端 #退出容器 exit #运行一个ubuntu容器 docker run -it ununtu cat /etc/os-release #查看一个系统版本
1.ps -a #查看是否有用此镜像运行中的容器 2.docker stop 容器id #将启动中的容器关闭 2.docker ps -a #查看全部的容器进程,以及挂掉的 4.docker rm 容器id #删除残留容器 5.docker rmi 镜像文件名字 #删除镜像文件
#过程实现 #运行出容器实例 二次修改容器实例 提交容器实例为新的镜像 导出镜像 发给别人导入 1.docker run -it centos /bin/bash #进入一个纯净的centos容器空间内,此时是最小化安装的系统,没有vim 没有py3 2.在容器空间内 yum install vim ,而后退出容器 3.此时这个容器记录就是携带者 vim的容器记录了(能够理解为携带者程序依赖,或者python3等等) 4.提交这个容器为新的 镜像文件 311110e1ec56 docker commit 容器进程id 镜像文件的名字 docker commit 419 s21docker-centos-vim #e.g.:[root@xujunk ~]#docker commit 311110e1ec56 docker-centos-vim sha256:d1870159517111e3756f022fdc851a3c90b1bef6daf2c54b4d0a8a3da4224a1 5.导出docker镜像,成为一个压缩文件,能够发送给你的测试,运维同事了 docker save 镜像文件名/镜像id > /opt/centos-vim.tar.gz [root@xujunk ~]#docker save d18701595171 > /opt/centos-vim.tar.gz 6.此时能够发送文件,给别人导入了 #这里为了简便在本机进行操做,将原镜像文件删除 [root@xujunk ~]#docker rmi 镜像文件id docker load < 同事给你发的镜像文件 [root@xujunk ~]#docker load < /opt/centos-vim.tar.gz
1.下载一个flask的docker镜像 [root@xujunk ~]#docker pull training/webapp 2.运行docker镜像 docker run -d -P -d 后台运行 -P 随机端口映射 随机的宿主机的端口:容器内的端口(自动指定的,由代码指定) -p 指定端口映射 宿主机的7777:8500 3.建立一个容器空间,而后在里面执行 python app.py 命令 [root@xujunk ~]#docker run -d -P training/webapp python app.py 建立一个容器空间,而后在里面执行 python app.py 命令 [root@xujunk ~]#docker run -d -p 6000:5000 training/webapp python app.py 3.查看后台运行容器端口: [root@xujunk ~]#docker ps """ CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 1ff5a02461a2 training/webapp "python app.py" 2 minutes ago Up 2 minutes 0.0.0.0:32769->5000/tcp musing_tesla """ 4.访问这个容器应用 服务器ip:宿主机的映射端口 浏览器输入: 192.168.58.131:32768 5.进入容器空间内,查看代码
#FROM指令用于 指定容器用什么发行版 #制做base image 基础镜像,尽可能使用官方的image做为base image FROM scratch #使用base image FROM centos #带有tag的base image FROM ubuntu:14.04 #定义标签变量的 LABEL version=“1.0” #容器元信息,帮助信息,Metadata,相似于代码注释 LABEL maintainer="yc_uuu@163.com" #万能RUN指令,让容器本身去作些什么事 #对于复杂的RUN命令,避免无用的分层,多条命令用反斜线换行,合成一条命令! RUN yum update && yum install -y vim \ Python-dev #反斜线换行 RUN /bin/bash -c "source $HOME/.bashrc;echo $HOME” RUN yum install redis #自动安装redis WORKDIR /root #至关于linux的cd命令,改变目录,尽可能使用绝对路径!!!不要用RUN cd WORKDIR /test #若是没有就自动建立 WORKDIR demo #再进入demo文件夹 RUN pwd #打印结果应该是/test/demo - 小示例: """ WORKDIR /opt WORKDIR /tmp WORKDIR ../ """ #路径切换到根目录 # ADD命令用来 将宿主机的文件添加到容器空间内 #ADD存在压缩文件解压的功能,所以,仅仅添加文件到容器内,用COPY而不是ADD ADD and COPY ADD hello / #把本地文件添加到镜像中,吧本地的hello可执行文件拷贝到镜像的/目录 ADD test.tar.gz / #添加到根目录并解压 ENV #环境变量,尽量使用ENV增长可维护性 ENV MYSQL_VERSION 5.6 #设置一个mysql常量 示例:RUN yum install -y mysql-server=“${MYSQL_VERSION}”
1.建立一个文件: [root@xujunk opt]#mkdir s21docker [root@xujunk opt]#cd s21docker 2.编写flask代码文件 [root@xujunk s21docker]#vim s21flask.py """ from flask import Flask app=Flask(__name__) @app.route('/') def hello(): return "hello docker" if __name__=="__main__": app.run(host='0.0.0.0',port=8080) """ 3.准备Dockerfile (名字必须叫作 Dockerfile) """ FROM centos COPY CentOS-Base.repo /etc/yum.repos.d/ COPY epel.repo /etc/yum.repos.d/ RUN yum clean all RUN yum install python-setuptools -y RUN easy_install flask COPY s21flask.py /opt/ WORKDIR /opt EXPOSE 8080 CMD ["python","s21flask.py"] """ 4.在Dockerfile同级目录,准备好其余环境文件,代码文件:CentOS-Base.repo Dockerfile epel.repo s21flask.py [root@xujunk s21docker]#cp /etc/yum.repos.d/CentOS-Base.repo ./ [root@xujunk s21docker]#cp /etc/yum.repos.d/epel.repo ./ #查看s21docker目录下文件: [root@xujunk s21docker]#ls CentOS-Base.repo Dockerfile epel.repo s21flask.py 5.构建docker镜像 docker build -t xujunkai521/s21-flask-docker . docker build 编译Dockerfile -t 给镜像加上名字 ,镜像名字,以仓库地址开头,则能够推送到仓库中管理 . 找到当前的Dockefile文件 #会按照Dockerfile从上到下一步一步编译 6.构建完毕以后,查看镜像文件 [root@xujunk s21docker]#docker images 7.运行这个flask镜像文件,生成容器实例,代码就跑在容器中了 [root@xujunk s21docker]#docker run -d -p 9999:8080 指定你要运行的镜像id/名字 8.web端访问http://192.168.58.131:9999/ 成功访问
代码流程
1.登陆docker帐户 [root@xujunk s21docker]#docker login 2.修改docker镜像文件名字,以docker hub帐号开头 [root@xujunk s21docker]#docker tag docker.io/redis xujunkai521/redis 3.推送镜像到dockerhub仓库中,(注意这个是公共仓库) [root@xujunk s21docker]#docker push xujunkai521/redis
1.下载私有仓库镜像文件 [root@xujunk s21docker]# docker run -d \ -p 5000:5000 \ # 宿主机的端口(自定义,本身考虑去分配):容器内暴露的端口(django中写了 8000),flask 5000 -v /opt/data/registry:/var/lib/registry \ registry -p 表示端口映射 -v 表示宿主机路径和容器内路径的映射 2.修改docker的配置文件,支持推送非https的私有镜像 [root@xujunk s21docker]#cat /etc/docker/daemon.json ,内容以下 { "registry-mirrors": ["http://f1361db2.m.daocloud.io"], "insecure-registries": [ "192.168.58.131:5000" ] } 3.修改docker的启动文件,加载第二步,修改的配置文件 [root@xujunk s21docker]#vim /lib/systemd/system/docker.service #找到以下的[Service] 代码块,添加参数 [Service] EnvironmentFile= -/etc/docker/daemon.json 4.修改了docker配置文件,从新加载docker [root@xujunk s21docker]#systemctl daemon-reload 5.重启docker服务 [root@xujunk s21docker]#systemctl restart docker 6.因为重启了docker,须要从新运行私有仓库的容器进程 [root@xujunk s21docker]#docker run --privileged=true -d -p 5000:5000 -v /opt/data/registry:/var/lib/registry registry --privileged=true docker容器的安全机制:设置特权级运行的容器 7.创建完私有云,就上传一波文件吧! [root@xujunk s21docker]#docker tag docker.io/hello-world 192.168.58.131:5000/hello-666 #把hello-666镜像 上传到192.168.58.131:5000路径 [root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666 8.查看浏览器: http://192.168.58.131:5000/v2/_catalog
如何要把文件下拉下来,执行下面命令: [root@xujunk s21docker]#docker pull 192.168.58.131:5000/hello-666