精通 Docker Run:核心命令选项详解
学习最常用的 Docker run 标志:端口、卷、环境变量、容器名称、后台模式、重启策略和清理。
掌握 Docker Run:详解必备命令选项
docker run 从镜像创建新容器并启动它。该命令初看简单,但选项决定了容器如何连接网络、存储数据、接收配置以及重启后的行为。
当你已知要运行的镜像,但需要正确标志来实现实际部署时,可参考本指南。
基本语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
IMAGE 是镜像名称,例如 nginx 或 postgres:16。COMMAND 和 ARG... 为可选,用于覆盖或扩展镜像的默认命令。
快速前台测试:
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 用于临时运行。