创建和启动
下载、安装并启动一个运行 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,然后连续按PQ键。 
更改容器名:
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 。