🍂落页
登 录

《Docker 实战》笔记

  • 速查表
  • 欢迎来到 Docker 的世界
  • 在容器中运行软件
  • 使用 Docker 安装软件
  • 使用存储和卷
  • 单主机网络
  • 通过资源控制来限制风险
  • 将软件打包到镜像中
  • 用 Dockerfile 构建镜像
🍂落页
TALAXY
在容器中运行软件
🍂落页
TALAXY

在容器中运行软件

在容器中运行软件
  • 创建和启动
  • 容器状态
  • PID 命名空间
  • 环境独立
  • 灵活的容器识别
  • 获取容器 ID
  • 容器依存
  • 只读文件系统
  • 注入环境变量
  • 建立持久的容器
  • 清除工作
  • 参考

创建和启动

下载、安装并启动一个运行 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 。

参考

docker container run - docs.docker.com

TALAXY 落于 2024年5月19日 。