下面使用 CentOS 7 系统介绍Docker:
centos7下安装docker:
yum -y install docker
一、Docker 镜像
Docker 运行容器前需要本地存在对应的镜像,如果镜像不存在本地,Docker会从镜像仓库下载( 默认是Docker Hub 公共注册服务器中的仓库 )
查看系统镜像docker images从官方源搜索镜像 (前提 物理机可以连通外网)docker search 镜像名下载镜像docker pull 镜像名上传镜像docker push 镜像名删除本地镜像docker rmi 镜像名把本机镜像备份为 tar 包docker save 镜像名 > 镜像名.tar把备份的 tar 包导入到本地镜像docker load < 镜像名.tar查看镜像制作历史docker history查看镜像底层信息docker inspect修改镜像名称和标签docker tag
这里用 busybox 练习
# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZE# docker search busybox# docker pull busybox# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest f9b6f7f7b9d3 6 days ago 1.143 MB在列出的信息中 可以看到几个字段信息来自于哪个仓库,比如 busybox镜像标记,比如 latest它的 ID 号 唯一创建时间镜像大小# docker save busybox > busybox.tar# ls busybox.tarbusybox.tar# docker rmi busybox# docker load < busybox.tar779f37a09c89: Loading layer 1.355 MB/1.355 MBLoaded image: busybox:latest# docker imagesREPOSITORY TAG IMAGE ID CREATED SIZEbusybox latest f9b6f7f7b9d3 6 days ago 1.143 MB# docker history busyboxIMAGE CREATED CREATED BY SIZE COMMENTf9b6f7f7b9d3 6 days ago /bin/sh -c #(nop) CMD ["sh"] 0 B<missing> 6 days ago /bin/sh -c #(nop) ADD file:3e663b99b5cb560010 1.143 MB
镜像的实现原理
Docker 使用Union FS 将这些不同的层结合到一个镜像中去。
通常 Union FS 有两个用途, 一方面可以实现不借助 LVM、RAID 将多个 disk 挂到同一个目录下,另一个更常用的就是将一个只读的分支和一个可写的分支联合在一起,LiveCD正是基于此方法可以允许在镜像不变的基础上允许用户在其上进行一些写操作。Docker 在 AUFS上构建的容器也是利用了类似的原理。
二、Docker 容器
容器是独立运行的一个或一组应用,以及它们的运行态环境。
对应的虚拟机可以理解为模拟运行的一整套操作系统(提供了运行态环境和其他系统环境)和跑在上面的应用。
容器常用命令列表:
– docker run //运行容器– docker ps //查看容器列表– docker stop //关闭容器– docker start //启动容器– docker restart //重启容器– docker attach|exec //进入容器– docker inspect //查看容器底层信息– docker top //查看容器进程列表– docker rm //删除容器
启动容器
启动容器有两种方式,一种是基于镜像新建一个容器并启动,另外一个是将在终止状态的容器重新启动.
新建并启动
命令主要为docker run
例如 下面命令输出一个'Hello world' 之后终止容器# docker run centos /bin/echo 'Hello world'Hello world下面的命令则启动一个 bash 终端,允许用户进行交互。# docker run -it centos /bin/bash[root@b45c34328e05 /]#echo Hello worldHello world[root@b45c34328e05 /]# lsanaconda-post.log dev home lib64 media opt root sbin sys usrbin etc lib lost+found mnt proc run srv tmp var[root@b45c34328e05 /]# exitexit-t 选项 让Docker分配一个伪终端 并绑定到容器的标准输入上-i 选项 则让容器的标准输入保持打开
启动已终止容器
可以利用 docker start 命令 直接将一个已经终止的容器启动运行
使用 docker ps 命令查看容器信息终止状态的容器可以用 docker ps -a 看到# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb45c34328e05 centos "/bin/bash" 47 seconds ago Exited (0) 40 seconds ago sharp_carson# docker start b45c34328e05b45c34328e05# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb45c34328e05 centos "/bin/bash" About a minute ago Up 5 seconds sharp_carson
后台运行
需要让Docker在后台运行而不是直接把执行命令的结果输出在当前宿主机下
可以docker run 添加 -d 参数来实现 启动后会返回唯一的 id
使用 docker ps 命令查看容器信息终止状态的容器可以用 docker ps -a 看到# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb45c34328e05 centos "/bin/bash" 47 seconds ago Exited (0) 40 seconds ago sharp_carson# docker start b45c34328e05b45c34328e05# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb45c34328e05 centos "/bin/bash" About a minute ago Up 5 seconds sharp_carson
终止容器
可以使用 docker stop 来终止一个运行中的容器
当Docker 容器中指定的应用终结时,容器也自动终止,用户通过exit 命令 或者 Ctrl + d 来退出终端时,所创建的容器立刻终止。
# docker stop 3a5f3a5f# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESb45c34328e05 centos "/bin/bash" 45 minutes ago Up 44 minutes sharp_carson# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3a5f25a93754 centos "/bin/sh -c 'while tr" 15 minutes ago Exited (137) 42 seconds ago happy_goldstine# docker restart 3a5f3a5f# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES3a5f25a93754 centos "/bin/sh -c 'while tr" 16 minutes ago Up 4 seconds happy_goldstinecentos "/bin/sh -c 'while tr" 16 minutes ago Up 4 seconds happy_goldstine
此外,docker restart 命令会将一个运行态的容器终止,然后再重新启动它
进入容器
在使用 -d 参数时,容器启动会进入后台。某些时候需要进入容器进行操作
attach 命令
# docker run -idt centos7cc5abd320d6e67cc8df2388e840bb168715afd3331364514be91e42be0d7304# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7cc5abd320d6 centos "/bin/bash" 7 seconds ago Up 4 seconds high_lamarr# docker attach 7cc[root@7cc5abd320d6 /]#[root@7cc5abd320d6 /]# exitexit# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES7cc5abd320d6 centos "/bin/bash" 3 minutes ago Exited (0) 13 seconds ago high_lamarr
但是使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执操作了。exit 会导致容器关闭
exec 命令
进入容器,退出时不会关闭容器
# docker run -idt centosf433775528d9616212145b73cc10a04b5b8c0f383c9cd002fe1f6dc984462313# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf433775528d9 centos "/bin/bash" 7 seconds ago Up 5 seconds berserk_bassi# docker exec -it f4 /bin/bash[root@f433775528d9 /]#[root@f433775528d9 /]# exitexit# docker psCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf433775528d9 centos "/bin/bash" 3 minutes ago Up 3 minutes berserk_bassi-i ,-t , -d 参数-i 选项 则让容器的标准输入保持打开-t 选项 让Docker分配一个伪终端 并绑定到容器的标准输入上-d 选项 在后台执行一个进程。可以看出,如果一个命令需要长时间进程,使用-d参数会很快返回。# docker exec -i f4 /bin/bashdateTue Jan 23 12:15:21 UTC 2018echo $?0exit# docker exec -t f4 /bin/bash[root@f433775528d9 /]# date^C# docker exec -it f4 /bin/bash[root@f433775528d9 /]# dateTue Jan 23 12:18:21 UTC 2018[root@f433775528d9 /]# exitexit
删除容器
可以使用 docker rm 来删除一个处于终止状态的容器
# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMESf433775528d9 centos "/bin/bash" 29 minutes ago Up 29 minutes berserk_bassi7cc5abd320d6 centos "/bin/bash" 34 minutes ago Exited (0) 32 minutes ago high_lamarr# docker rm 7cc7cc# docker rm f43Error response from daemon: You cannot remove a running container f433775528d9616212145b73cc10a04b5b8c0f383c9cd002fe1f6dc984462313. Stop the container before attempting removal or use -f# docker rm -f f43f43
如果要删除一个运行中的容器,可以添加 -f 参数
清理所有处于终止状态的容器
如果数量太多要一个个删除可能会很麻烦,用
docker rm $( docker ps -aq )
可以全部处理掉。
文章转载自:https://blog.51cto.com/u_13558754/2064405 作者:Xuenqlve
后续将继续分享docker生产实践案例,敬请关注下方公众号!




