一、容器的运行
1、运行容器
docker run
docker run ubuntu:12.04 pwd
容器启动时执行 pwd,返回的 / 是容器中的当前目录,运行完之后,自动退出容器
2、查看所有容器
docker ps -a
docker container ls -a
-a 显示所有状态的容器,状态为Up、Exited
3、保持容器长期运行
原理:容器的生命周期依赖于启动时执行的命令,只要该命令不结束,容器也就不会退出
-d 以后台方式启动容器
docker run -d ubuntu:12.04 /bin/bash -c "while true ; do sleep 1; done"
docker ps 中
CONTAINER ID 是容器的 “短ID”,前面启动容器时返回的是 “长ID”。短ID是长ID的前12个字符
NAMES 字段显示容器的名字,在启动容器时可以通过 --name 参数显示地为容器命名,如果不指定,docker 会自动为容器分配名字
容器的后续操作,需通过 “长ID”、“短ID” 或者 “名称” 来指定要操作的容器
容器常见用途是运行后台服务
docker run --name "my-httpd" -d httpd
--name 指定了容器的名字
容器运行的命令是httpd-foreground,通过 docker history 可知这个命令是通过 CMD 指定的
docker history httpd
二、进入容器
1、docker attach
docker run -d ubuntu:14.04 /bin/bash -c "while true ; do sleep 1; echo this is a test ; done"
通过 Ctrl+p 然后 Ctrl+q 组合键退出 attach 终端
2、docker exec
通过 docker exec 进入相同的容器
docker exec -it 9c627f2de965 bash
-it 以交互模式打开 pseudo-TTY,执行 bash,其结果就是打开了一个 bash 终端
进入到容器中,容器的 hostname 就是其 “短ID”
像在普通 Linux 中一样执行命令。ps -efl 显示了容器启动进程while 以及当前的 bash 进程
执行 exit 退出容器,回到 docker host
docker exec -it <container> bash|sh 是执行 exec 最常用的方式
3、attach VS exec
attach 与 exec 主要区别如下:
attach 直接进入容器 启动命令 的终端,不启动新进程
exec 在容器中打开新终端,并且可以启动新进程
若直接在终端中查看启动命令的输出,用 attach,其他情况使用 exec
若只是查看启动命令的输出,可用 docker logs 命令
docker logs -f 9c627f2de965
-f 作用与 tail -f 类似,持续打印输出
三、容器的分类
1、服务类容器 以 daemon 的形式运行,对外提供服务。比如 web server,数据库等。通过 -d 以后台方式启动这类容器是非常合适的。如果要排查问题,可以通过 exec -it 进入容器
2、工具类容器 通常提供一个临时的工作环境,通常以 run -it 方式运行
docker run -it busybox
wget www.baidu.com
exit
运行 busybox,run -it 的作用是在容器启动后就直接进入。通过 wget 验证了在容器中访问 internet。执行 exit 退出终端,同时容器停止。
工具类容器 多使用基础镜像,例如 busybox、debian、ubuntu 等
四、容器常用操作
1、stop/start/restart 容器
docker stop 可以停止Exited 运行的容器
容器在 docker host 中实际上是一个进程,docker stop 命令本质上是向该进程发送一个 SIGTERM 信号。如果想快速停止容器,可使用 docker kill 命令,其作用是向容器进程发送 SIGKILL 信号
对于处于停止状态的容器,可以通过 docker start 重新启动
docker start 会保留容器的第一次启动时的所有参数
docker restart 可以重启容器,其作用就是依次执行 docker stop 和docker start。
容器可能会因某种错误而停止运行。对于服务类容器,希望在这种情况下容器能够自动重启。启动容器时设置 --restart 就可以达到这个效果
docker run -d --restart=always httpd
--restart=always 意味着无论容器因何种原因退出(包括正常退出),就立即重启。该参数的形式还可以是 --restart=on-failure:3,意思是如果启动进程退出代码非0,则重启容器,最多重启3次
2、pause/unpause 容器
有时希望暂时让容器暂停工作一段时间,比如要对容器的文件系统打个快照,或者 dcoker host 需要使用 CPU,这时可以执行
docker pause 9c627f2de965
处于暂停状态的容器不会占用 CPU 资源,docker unpause 直接恢复运行
docker unpause 9c627f2de965
3、删除容器
使用 docker 一段时间后,host 上可能会有大量已经退出了的容器
这些容器依然会占用 host 的文件系统资源,如果确认不会再重启此类容器,可以通过 docker rm 删除
docker rm 一次可以指定多个容器,如果希望批量删除所有已经退出的容器,可以执行如下命令:
docker rm -v $(docker ps -aq -f status=exited)
对比一下:
docker rm 是删除容器,而 docker rmi 是删除镜像
4、容器各种状态之间是如何转换
5、先创建容器,稍后再启动
docker create httpd
docker ps -a
docker start 92aada49e11d
docker ps
6、只有当容器的启动进程 退出 时,--restart 才生效
退出包括正常退出或者非正常退出。这里举了两个例子:启动进程正常退出或发生 OOM,此时 docker 会根据 --restart 的策略判断是否需要重启容器。但如果容器是因为执行 docker stop 或docker kill 退出,则不会自动重启
详情请见,微信公众号