创建和启动
下载、安装并启动一个运行 NGINX 服务的容器:
docker run --detach --name web nginx:lastest
- 执行命令后会打印一个容器 ID ;
--detach
:在后台启动容器,可缩写为-d
;--name web
:设置容器名为 "web" 。
也可用 docker create
命令来创建容器,与 run
不同的是它不会自动运行容器:
docker create nginx
docker create
命令执行后同样会打印一个容器 ID 。
启动一个交互式容器:
docker run --interactive --tty --link web:web --name web_test busybox:1.29 /bin/sh
--interactive
或-i
:将容器的标准输入流 stdio 保持打开状态;--tty
或-t
:让 Docker 为容器分配终端,来与容器通信;/bin/sh
:指定容器中运行的程序;- 通过
exit
命令可以关闭交互式容器,并且会停止容器;如果想分离终端,可以按住Ctrl
,然后连续按P
Q
键。
更改容器名:
docker rename <旧容器> <新容器名>
容器状态
docker ps
查看正在运行的容器,会显示以下容器信息:
- 容器编号
- 使用的镜像
- 容器中执行的命令
- 容器自创建到现在的时间
- 容器已运行时间
- 暴露的网络端口
- 容器名称
docker ps -a
可查看所有容器,包括未运行的容器。
docker start
- 启动一个已创建的容器;docker stop
- 停止容器;docker restart
- 重启容器。
docker logs <容器>
查看容器日志,可用 --follow
或 -f
来实时监看日志:
docker logs --follow web
可用 docker exec
命令在容器里执行额外的命令:
docker exec <容器> <命令>
PID 命名空间
Docker 默认会为每个容器创建一个新的 PID 命名空间,这意味着容器之间的 PID 并不互通。
如果想创建没有 PID 命名空间的容器,可以将 --pid
设置为 "host" :
docker run --pid host busybox:1.29 ps
环境独立
Docker 通过 Linux 命名空间、资源限制、虚拟化网络等工具解决了许多冲突问题,比如:
- 两个程序绑定到同一网络端口;
- 两个程序使用想使用相同的临时文件名,但文件锁会防止你这么做;
- 两个程序想使用全局安装的多个链接库的不同版本;
- 两个进程想使用相同的 PID 文件;
- 第二个程序修改了环境变量,导致第一个程序中断;
- 多个进程在争夺内存或 CPU 时间...
灵活的容器识别
大多数 Docker 命令里既可以传入容器名,也可传入容器 ID ,比如:
docker stop web
# 或
docker stop 7dahsjw219udhfsi9j3jkbja...
同一台计算机上容器 ID 的前 12 个字符通常不会发生冲突,所以大多数 Docker 界面里容器 ID 都会被截断为前 12 个字符。在执行 Docker 命令时也可以如此标识容器:
docker stop 7dahsjw219ud
获取容器 ID
在自动化脚本里,通常会需要获取容器 ID 。一些命令中 Docker 会返回容器 ID ,我们可以用变量存起来:
CID=$(docker create nginx:latest) # 限于 POSIX 兼容的 shell 中使用
echo $CID
或者 Docker 提供了选项来将 CID 存入文件中:
docker create --cidfile /tmp/web.cid nginx
cat /tmp/web.cid
使用 --cidfile
要求对应的文件不存在。Docker 会自己创建此文件并将 CID 写入文件中。如果文件已存在会报错。
还有一些别的方法来获取容器 ID ,比如如果要获取最后创建的容器的 ID :
CID=$(docker ps --latest --quiet)
echo $CID
该命令获取的 CID 是截断的字符,如果想要获取完整的 CID ,可以在 docker ps
中使用 --no-trunc
选项。
容器依存
docker create
或 docker run
中可通过 --link
选项来连接另一个容器:
MAILER_CID=$(docker run -d dockerincation/ch2_mailer)
WEB_CID=$(docker run -d nginx)
AGENT_CID=$(docker run -d \
--link $WEB_CID:insideweb \
--link $MAILER_CID:insidemailer \
dockerinaction/ch2_agent)
只读文件系统
可以用 --read-only
选项来指定容器内根文件系统为只读:
# 先运行一个 MySQL 服务
docker run -d --name wpdb \
-e MYSQL_ROOT_PASSWORD=xxxxx \
mysql:5.7
# 运行一个 WordPress 服务
docker run -d --name wp \
--link wpdb:mysql \
-p 8000:80 \
--read-only \
-v /run/apache2/ \
--tmpfs /tmp \
wordpress:5.0.0-php7.2-apache
--port
或-p
:将主机端口 8000 引导到容器端口 80 ;--volumn
或-v
:从主机挂载一个可写目录;--tmpfs
:提供一个常驻内存的临时文件系统。
注入环境变量
可以通过 --env
选项给容器设置环境变量:
docker create \
--env WORDPRESS_DB_HOST=<数据库主机名>
--env WORDPRESS_DB_USER=<数据库用户名>
--env WORDPRESS_DB_PASSWORD=<数据库密码>
wordpress:5.0.0-php7.2-apache
建立持久的容器
Docker 容器有 6 种状态:已创建、运行中、重启中、暂停、删除中、退出。
当软件出现故障时,通常最重要的事就是尽快恢复服务。而 Docker 提供了故障重启的功能,通过 --always
设置,它有这些选项:
no
- 用不重启;on-failure[:max-retries]
- 当退出状态码非 0 时重启,可以设置一个最大尝试重启次数;unless-stopped
- 重启容器,除非容器是被明确停止,或者 Docker 本身被停止;always
- 无尽地尝试重启。
这块部分书中的解释与官方文档不太一致,见书 P43 。
清除工作
可以用 docker rm <容器>
来删除容器。
如果尝试删除处于"运行中"、"暂停"、"重启中"的容器,Docker 会报错。应当先用 docker stop
暂停。
如果要强制终止容器,尽管处于运行中等状态,可以用 docker rm -f
或 docker kill
。