精通 Docker Run:核心命令选项详解

学习最常用的 Docker run 标志:端口、卷、环境变量、容器名称、后台模式、重启策略和清理。

掌握 Docker Run:详解必备命令选项

docker run 从镜像创建新容器并启动它。该命令初看简单,但选项决定了容器如何连接网络、存储数据、接收配置以及重启后的行为。

当你已知要运行的镜像,但需要正确标志来实现实际部署时,可参考本指南。

基本语法

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

IMAGE 是镜像名称,例如 nginxpostgres:16COMMANDARG... 为可选,用于覆盖或扩展镜像的默认命令。

快速前台测试:

docker run hello-world

对于实际服务,通常需要添加选项。

使用 -d 在后台运行

默认情况下,Docker 将终端附加到容器输出。分离模式(detached mode)在后台运行容器:

docker run -d nginx

Docker 打印新容器 ID 并返回提示符。使用以下命令检查:

docker ps

从分离容器读取日志:

docker logs <container_id_or_name>

使用 -p 发布端口

容器拥有自己的网络命名空间。如果服务在容器内监听,发布端口以从宿主机访问:

docker run -d -p 8080:80 nginx

这将宿主机端口 8080 映射到容器端口 80,因此 http://localhost:8080 可访问 Nginx。

可以发布多个端口:

docker run -d -p 8080:80 -p 8443:443 nginx

若仅绑定到宿主机 localhost,包含宿主机 IP:

docker run -d -p 127.0.0.1:8080:80 nginx

这对于不希望暴露在所有宿主机接口上的本地工具很有用。

使用卷持久化数据

容器可写层不适合持久数据。当需要将特定宿主机路径挂载到容器时,使用绑定挂载:

docker run -d -p 8080:80 -v "$PWD/html:/usr/share/nginx/html:ro" nginx

这将从本地 html 目录提供文件。:ro 后缀使挂载在容器内只读。

当希望 Docker 管理存储位置时,使用命名卷:

docker run -d --name postgres -v pgdata:/var/lib/postgresql/data postgres:16

如果 pgdata 不存在,Docker 会创建它。使用以下命令检查卷:

docker volume ls

对于新项目,Docker 的 --mount 语法更详细但更清晰:

docker run -d --mount type=volume,src=pgdata,dst=/var/lib/postgresql/data postgres:16

使用 -e--env-file 传递配置

环境变量是配置容器化应用的常见方式:

docker run -d -e APP_ENV=production my-custom-app:latest

多次使用 -e 设置多个变量:

docker run -d -e DB_HOST=database.example.com -e DB_USER=app my-app:latest

对于多个变量,使用环境文件:

docker run -d --env-file ./app.env my-app:latest

避免将机密信息提交到 .env 文件中。环境变量易于从宿主机和具有足够权限的进程检查,因此对于敏感的生产值,请使用平台的密钥管理器。

使用 --name 命名容器

Docker 可以生成名称,但清晰的名称使后续命令更简单:

docker run -d --name web -p 8080:80 nginx

然后可以使用:

docker logs web
docker stop web
docker exec -it web sh

容器名称必须唯一。如果 web 已存在,请在重用名称前移除或重命名旧容器。

使用 -it 交互模式

对于 shell 和故障排除会话,结合交互模式和伪 TTY:

docker run -it ubuntu bash

退出 shell 时,容器停止。对于一次性会话,添加 --rm

docker run --rm -it alpine sh

选择重启策略

重启策略告诉 Docker 容器退出时如何处理:

docker run -d --name web --restart unless-stopped -p 8080:80 nginx

常见策略包括:

  • no:不自动重启。这是默认值。
  • on-failure[:max-retries]:仅在非零退出码后重启。
  • always:容器停止时始终重启,包括 Docker 守护进程重启后。
  • unless-stopped:除非你显式停止容器,否则重启。

对于长时间运行的本地服务,unless-stopped 通常比 always 更合适,因为手动停止仍会被尊重。

使用 --rm 移除一次性容器

停止的容器会保留在磁盘上,直到你移除它们。对于一次性命令,--rm 在容器退出后清理:

docker run --rm ubuntu echo "来自临时容器的问候"

对于需要稍后检查停止状态的容器,不要使用 --rm

实际示例

以下命令运行一个 Web 应用,具有稳定名称、已发布端口、绑定挂载的日志目录、环境变量和重启策略:

docker run -d \
  --name my-app \
  --restart on-failure \
  -p 3000:80 \
  -v "$PWD/logs:/app/logs" \
  -e NODE_ENV=production \
  my-node-app:1.0

启动后,验证容器并检查日志:

docker ps
docker logs my-app

要点

从最小的 docker run 命令开始,然后添加所需行为的选项:-d 用于后台服务,-p 用于访问,-v--mount 用于数据,-e 用于配置,--name 用于操作,--restart 用于弹性,--rm 用于临时运行。