特性 | Docker容器 | 虚拟机 |
---|---|---|
启动速度 | 秒级 | 分钟级 |
计算能力损耗 | 几乎无 | 损耗50%左右 |
性能 | 接近原生 | 弱于 |
系统支持量(单机) | 上千个 | 几十个 |
隔离性 | 资源限制 | 彻底隔离 |
Docker之因此拥有众多优点,跟操做系统虚拟化自身的特色是分不开的。传统虚拟机须要有额外的虚拟机管理程序和虚拟机操做系统。而Docker容器是直接在操做系统层面之上实现的虚拟化,如图所示:php
在CentOS系统下安装Docker能够有两种方式:linux
使用YUM仓库来安装。git
注意:目前Docker只能支持64位系统docker
1.仓库配置apache
[root@localhost ~]# vim /etc/yum.repos.d/docker.repo #建立docker仓库 添加如下内容: [docker-repo] name=Docker Repository baseurl=https://yum.dockerproject.org/repo/main/centos/7/ enabled=1 gpgcheck=1 gpgkey=https://yum.dockerproject.org/gpg
2.使用YUM安装Dockervim
[root@localhost ~]# yum install docker -y
3.启动Docker并设置为开机自启动centos
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0 [root@localhost ~]# systemctl start docker.service [root@localhost ~]# systemctl enable docker.service
4.检查Docker版本能够查看Docker服务安全
[root@localhost ~]# docker version Client: #docker客户端 Version: 1.13.1 API version: 1.26 Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64 Go version: go1.9.4 Git commit: dded712/1.13.1 Built: Tue Jul 17 18:34:48 2018 OS/Arch: linux/amd64 Server: #docker服务端 Version: 1.13.1 API version: 1.26 (minimum version 1.12) Package version: docker-1.13.1-68.gitdded712.el7.centos.x86_64 Go version: go1.9.4 Git commit: dded712/1.13.1 Built: Tue Jul 17 18:34:48 2018 OS/Arch: linux/amd64 Experimental: false
注解: 安装好的Docker系统有两个程序:Docker服务端和Docker客户端。其中Docker服务端是一个服务进程,管理着全部的容器。Docker客户端则扮演着Docker服务端的远程控制器,能够用来控制Docker的服务端进程。大部分状况下Docker服务端和客户端运行在一台机器上。
Docker运行容器前须要本地存在对应的镜像,若是不存在本地镜像Docker就会尝试从默认镜像仓库下载https://hub.docker.combash
1.搜索镜像服务器
命令格式:docker search 关键字
在使用下载镜像前,可使用docker search命令,搜索远端官方仓库中的共享镜像
[root@localhost ~]# docker search httpd #搜索关键字为httpd的镜像 INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED docker.io docker.io/httpd The Apache HTTP Server Project 1885 [OK] docker.io docker.io/hypriot/rpi-busybox-httpd Raspberry Pi compatible Docker Image with ... 41 docker.io docker.io/centos/httpd 19 [OK] docker.io docker.io/centos/httpd-24-centos7 Platform for running Apache httpd 2.4 or b... 14 docker.io docker.io/armhf/httpd The Apache HTTP Server Project 8 docker.io docker.io/macadmins/netboot-httpd use in combination with bruienne/bsdpy 6 [OK] docker.io docker.io/salim1983hoop/httpd24 Dockerfile running apache config 2 [OK] docker.io docker.io/epflidevelop/os-wp-httpd WP httpd 1 [OK] docker.io docker.io/fboaventura/dckr-httpd Small footprint http server to use with ot... 1 [OK] docker.io docker.io/lead4good/httpd-fpm httpd server which connects via fcgi proxy... 1 [OK] docker.io docker.io/tplatform/aws-linux-httpd24-php70 aws-linux-httpd24-php70 1 [OK] docker.io docker.io/tplatform/aws-linux-httpd24-php71-fpm aws-linux-httpd24-php71-fpm 1 [OK] ......//省略
参数注解: NAME:镜像名称 DESCRIPTION:描述信息 STARS :星级 OFFICIAL:是否官方建立 AUTOMATED:是否主动建立 默认的输出结果会按照星级评价进行排序,表示该镜像受欢迎程度,在下载镜像时,能够参考这一项,在搜索时还可使用-s或者--stars=x显示指定星级以上的镜像,星级越高表示越受欢迎。
2.获取镜像
搜索到符合需求的镜像,可使用docker pull命令从网络下载镜像到本地使用。
命令格式:docker pull 仓库名称 [:标签]
[root@localhost ~]# docker pull docker.io/httpd #下载镜像docker.io/httpd Using default tag: latest #最新版本 Trying to pull repository docker.io/library/httpd ... latest: Pulling from docker.io/library/httpd d660b1f15b9b: Pull complete aa1c79a2fa37: Pull complete f5f6514c0aff: Pull complete 676d3dd26040: Pull complete 4fdddf845a1b: Pull complete 520c4b04fe88: Pull complete 5387b1b7893c: Pull complete Digest: sha256:8c84e065bdf72b4909bd55a348d5e91fe265e08d6b28ed9104bfdcac9206dcc8 Status: Downloaded newer image for docker.io/httpd:latest #下载成功 从整个下载的过程能够看出,镜像文件由若干层(Layer)组成,称之为AUFS(联合文件系统),是实现增量保存与更新的基础,下载过程当中会输出镜像的各层信息。
注意: 若是下载镜像时不指定标签,则会默认下载仓库中最新版本的镜像,即选择标latest标签,也能够经过指定的标签来下载特色版本的某一镜像。这里的标签(tag)就是用来区分镜像版本的。
3.查看镜像信息
命令语法:docker images 仓库名称 :[标签]
[root@localhost ~]# docker images #查看本地全部镜像 REPOSITORY TAG IMAGE ID CREATED SIZE docker.io/httpd latest 11426a19f1a2 9 days ago 178 MB
参数注解: REPOSITORY:镜像属于的仓库 TAG :镜像的标记信息,标记同一仓库中的不一样镜像。 IMAGE ID :镜像的惟一ID号,惟一标识了该镜像。 CREATED :镜像建立时间 SIZE :镜像大小
用户还能够根据镜像的惟一标识ID号,获取镜像详细信息。
命令格式:docker inspect 镜像ID号
[root@localhost ~]# docker inspect 11426a19f1a2
为本地镜像添加新的标签
命令格式:docker tag 名称 :[标签] 新名称 :[新标签]
[root@localhost ~]# docker tag docker.io/httpd httpd:httpd [root@localhost ~]# docker images | grep httpd docker.io/httpd latest 11426a19f1a2 9 days ago 178 MB httpd httpd 11426a19f1a2 9 days ago 178 MB
4.删除镜像
删除镜像的操做方法有两种:使用镜像的标签删除镜像;使用镜像的ID删除镜像。
命令格式:docker rmi 仓库名称 : 标签
[root@localhost ~]# docker rmi 11426a19f1a2 #删除镜像的ID号 [root@localhost ~]# docker rmi httpd:httpd #删除镜像的标签 Untagged: httpd:httpd [root@localhost ~]# docker images | grep httpd docker.io/httpd latest 11426a19f1a2 9 days ago 178 MB
注意: 1)当一个镜像有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签,不会影响镜像文件,但当该镜像只剩下一个标签的时候就要当心了,再使用删除命令就会完全删除该镜像。 2)当使用docker rmi命令后面跟上镜像的ID号时,必须确保该镜像没有被容器使用才能进行,删除时系统会先删除掉指向该镜像的全部标签,而后删除该镜像文件自己。若是该镜像已经被容器使用,要先删除依赖该镜像的使用容器,再删除镜像。
5.存储镜像和载入镜像
命令格式:docker save -o 存储文件名 存储的镜像
[root@localhost ~]# docker save -o httpd docker.io/httpd #本地镜像存出文件为httpd [root@localhost ~]# ls -l httpd -rw-------. 1 root root 186415616 8月 10 11:24 httpd
载入镜像
命令格式:docker load < 存出文件 或者 docker --input 存出的文件
6.上传镜像
本地存储的镜像愈来愈多,就须要指定一个专门的地方存放这些镜像——仓库。目前比较方便的就是公共仓库,默认上传到Docker Hub官方仓库,须要注册使用公共仓库的帐号,可使用docker login命令来输入用户名、密码和邮箱来完成注册登陆。在上传镜像以前还须要对本地镜像添加新的标签,而后再使用docker push命令进行上传。
命令格式:docker push 仓库名称 : 标签
[root@localhost ~]# docker tag docker.io/httpd docke/httpd:centos7 #添加新标签 [root@localhost ~]# docker login #登陆 Username: docke Password: [root@localhost ~]# docker push docke/httpd:centos7 #上传镜像
镜像是只读模板,而容器会给这个只读模板一个额外的可写层。
1.容器的建立与启动
容器的建立就是将镜像加载到容器的过程。新建立的容器默认处于中止状态,不容许任何程序,须要在其中发起一个进程来启动容器,这个进程是该容器的惟一进程,当该进程结束的时候,容器也会彻底中止。中止的容器能够从新启动并保留原来的修改。
命令格式:docker create [选项] 镜像 运行的程序
1)建立新容器
-i 让容器的输入保持打开 -t 让Docker分配一个伪终端 [root@localhost ~]# docker create -it docker.io/httpd /bin/bash 96a826f750d53024dc63c3328c4ac45ae2a499b9ae613d700da38e7be99e452d #新容器的惟一ID
2)使用docker ps命令查看容器的运行状态,-a 列出系统最近一次启动的容器。
[root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96a826f750d5 docker.io/httpd "/bin/bash" 4 minutes ago Created happy_gates
参数注释: CONTAINER ID :容器的ID号 IMAGE :加载的镜像 COMMAND :运行的程序 CREATED :建立的时间 STATUS :目前所处的状态、端口映射
3)启动中止状态的容器
命令格式:docker start 容器的ID/ 名称
[root@localhost ~]# docker start 96a826f750d5 96a826f750d5 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 96a826f750d5 docker.io/httpd "/bin/bash" 9 minutes ago Up 13 seconds 80/tcp happy_gates
4)建立并启动容器,能够指向docker run 命令,等同于先执行docker create 命令,再执行docker start 命令。注意:只有后面的命令运行结束,容器就会中止。
[root@localhost ~]# docker run centos /usr/bin/bash -c ls / #建立、开启centos容器并查询镜像的根目录 anaconda-post.log bin dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var [root@localhost ~]# docker ps -a #查看容器的运行状态 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES db67843e7d92 centos "/usr/bin/bash -c ..." 31 seconds ago Exited (0) 30 seconds ago festive_goldberg ae4c24239956 httpd "/bin/bash" 6 minutes ago Up 5 minutes 80/tcp nervous_kalam
让容器再后台持续运行
[root@localhost ~]# docker run -d centose /usr/bin/bash -c "while true;do echo hello;done"
2.容器的运行与终止
命令格式:docker stop 容器的ID/ 名称
[root@localhost ~]# docker stop ae4c24239956 ae4c24239956 [root@localhost ~]# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES ae4c24239956 httpd "/bin/bash" 31 minutes ago Exited (0) 2 seconds ago nervous_kalam
3.容器的进入
命令格式:docker exec -it 容器 ID/ 名称 /bin/bash
进入正在运行的容器
[root@localhost ~]# docker exec -it ae4c24239956 /bin/bash #进入容器 用户能够经过所建立的终端来输入命令,经过exit命令退出容器: root@ae4c24239956:/usr/local/apache2# ls bin build cgi-bin conf error htdocs icons include logs modules root@ae4c24239956:/usr/local/apache2# exit exit
4.容器的导出与导入
用户能够将任何一个Docker容器从一台机器迁移到另外一台机器。在迁移的过程当中,首先须要将已经建立好的容器导出为文件,可使用docker export命令实现,不管这个容器是处于运行状态仍是中止状态都可导出。导出以后可将导出文件传输到其余机器,经过相应的导入命令实现容器的迁移。
命令格式:docker export 容器 ID/ 名称 > 文件名
导出ae4c24239956 容器到文件 centos7tar
[root@localhost ~]# docker export ae4c24239956 > centos7tar [root@localhost ~]# ls -l centos7tar -rw-r--r--. 1 root root 182633984 8月 11 18:23 centos7tar
导出的文件从A机器拷贝到B机器,以后使用docker import命令导入,成为镜像。
命令格式:cat 文件名 | docker import - 生成的镜像名称 : 标签
导入文件 centos7tar成为本地镜像
[root@localhost ~]# cat centos7tar | docker import - centos7:tes [root@localhost ~]# docker images | grep centos7 centos7 test 442bc7482423 5 minutes ago 174MB
5.容器的删除
命令格式:docker rm 容器ID/ 名称
[root@localhost ~]# docker rm ae4c24239956
注意: 若是要删除一个正在运行的容器,能够添加-f选项强制删除,但建议先将容器中止再作删除操做。
1.对CPU的控制
1)限制CPU使用速率
docker run --cpu-quota 20000 容器名 #CPU的使用率限定为20%
[root@localhost ~]# echo 20000 > /sys/fs/cgroup/cpu/docker/ae4c24239956ee20786a966cd4db9a459a459e2c47faaf03977ab88d03b7a834/cpu.cfs_quota_us
2)多任务按比例分享CPU
当有多个容器任务运行时,很难计算CPU的使用率。为了使容器合理使用CPU资源,能够经过--cpu-share选项设置CPU按比例共享CPU资源,这种方式还能够实现CPU使用率的动态调整。
好比:运行三个容器A、B、C,占用CPU资源的比例为1:1:2,能够这样执行:
docker run --cpu-share 1024 容器A docker run --cpu-share 1024 容器B docker run --cpu-share 2048 容器C
3)限制CPU的内核使用
在Docker中可使用--cpuset-cpus选项来使某些程序独享CPU内核,以便提升其处理速度。
若是服务器有16个内核,那么CPU的编号为0~15,使容器绑定1~5个内核使用,则:
docker run --cpuset-cpus 0,1,2,3,4 容器名
建议: 尽可能使用绑定内核的方式分配CPU资源给容器进程使用,而后再配合 --cpu-share选项动态调整CPU使用资源的比例。
2.对内存使用的限制
在Docker中能够经过docker run -m命令来限制容器内存使用量,相应的Cgroup配置文件为/sys/fs/cgroup/memory/memory.limit_in_bytes 。可是须要注意:一旦容器Cgroup使用的内存超过了限制的容量,Linux内核将会尝试收回这些内存,若是仍旧无法控制内存使用在限制范围以内,进程就会被杀死。
例如:限制容器的内存为512M
docker run -m 512m 容器名
3.对blkio的限制
若是是在一台服务器上进行容器的混合部署,那么会出现同时有几个程序写磁盘数据的状况,这时能够经过 --device-write-iops选项来限制写入的iops,相应的还有 --device-read-bps选项能够限制读取的iops。可是这种方法只能针对blkio限制的是设备(device),而不是分区。相应Cgroup写配置文件/sys/fs/cgroup/blkio/docker/容器ID/blkio.throttle.write_iops_device。
例如:限制容器的/dev/sda1 的写入iops为1MB
docker run --device-write-bps /dev/sda1:1mb 容器名