容器运行模式
Docker 容器的前台、后台、交互式等运行模式
📋 目录
前台运行
默认模式
容器默认在前台运行,输出直接显示在终端。
# 前台运行容器
docker run nginx:latest
# 前台运行并执行命令
docker run ubuntu:20.04 echo "Hello Docker"特点
- 输出直接显示在终端
- 容器停止后,命令结束
- 适合一次性任务和调试
后台运行
分离模式 (-d)
使用 -d 参数让容器在后台运行(detached mode)。
# 后台运行容器
docker run -d nginx:latest
# 后台运行并指定名称
docker run -d --name my-nginx nginx:latest
# 后台运行并映射端口
docker run -d -p 8080:80 nginx:latest特点
- 容器在后台运行
- 不占用终端
- 适合长期运行的服务
查看后台容器
# 查看运行中的容器
docker ps
# 查看容器日志
docker logs my-nginx
# 实时查看日志
docker logs -f my-nginx交互式运行
交互式模式 (-it)
使用 -it 参数创建交互式容器。
# 交互式运行容器
docker run -it ubuntu:20.04 /bin/bash
# 交互式运行并指定工作目录
docker run -it -w /app ubuntu:20.04 /bin/bash
# 交互式运行并挂载目录
docker run -it -v $(pwd):/app ubuntu:20.04 /bin/bash参数说明
-i:保持 STDIN 打开,即使没有附加-t:分配一个伪终端(pseudo-TTY)
退出交互式容器
# 退出并停止容器
exit
# 或 Ctrl+D
# 退出但不停止容器
Ctrl+P, Ctrl+Q分离模式
docker attach
附加到运行中的容器。
# 启动后台容器
docker run -d --name my-container ubuntu:20.04 sleep 3600
# 附加到容器
docker attach my-container
# 退出而不停止容器
Ctrl+P, Ctrl+Qdocker exec vs docker attach
| 特性 | docker exec | docker attach |
|---|---|---|
| 创建新进程 | 是 | 否 |
| 附加到主进程 | 否 | 是 |
| 退出影响容器 | 否 | 是(主进程退出时) |
| 推荐使用 | ✅ | ⚠️ |
自动重启策略
—restart 参数
设置容器的重启策略。
# 不自动重启(默认)
docker run --restart=no nginx:latest
# 总是重启
docker run --restart=always nginx:latest
# 失败时重启(非零退出码)
docker run --restart=on-failure nginx:latest
# 失败时重启,最多重试 N 次
docker run --restart=on-failure:5 nginx:latest
# 除非手动停止,否则总是重启
docker run --restart=unless-stopped nginx:latest重启策略说明
- no:不自动重启(默认)
- always:总是重启,无论退出状态
- on-failure:只在非零退出码时重启
- on-failure:N:失败时重启,最多重试 N 次
- unless-stopped:除非手动停止,否则总是重启
更新重启策略
# 更新运行中容器的重启策略
docker update --restart=always my-container
# 更新多个容器
docker update --restart=always container1 container2运行模式选择
选择指南
| 场景 | 推荐模式 | 命令示例 |
|---|---|---|
| Web 服务 | 后台运行 | docker run -d -p 80:80 nginx |
| 数据库 | 后台运行 + 自动重启 | docker run -d --restart=always postgres |
| 一次性任务 | 前台运行 | docker run ubuntu echo "hello" |
| 调试容器 | 交互式运行 | docker run -it ubuntu /bin/bash |
| 开发环境 | 交互式 + 挂载 | docker run -it -v $(pwd):/app node:16 |
常见组合
Web 服务
docker run -d \
--name web \
--restart=always \
-p 8080:80 \
nginx:latest数据库服务
docker run -d \
--name db \
--restart=always \
-e POSTGRES_PASSWORD=password \
-v db-data:/var/lib/postgresql/data \
postgres:13开发环境
docker run -it \
--name dev \
-v $(pwd):/workspace \
-w /workspace \
node:16 \
/bin/bash定时任务
docker run -d \
--name cron-job \
--restart=on-failure:3 \
myapp:latest \
/app/run-cron.sh容器状态管理
暂停和恢复
# 暂停容器
docker pause my-container
# 恢复容器
docker unpause my-container
# 查看暂停的容器
docker ps -a -f "status=paused"等待容器停止
# 等待容器停止
docker wait my-container
# 等待并获取退出码
EXIT_CODE=$(docker wait my-container)
echo "Container exited with code: $EXIT_CODE"实用技巧
后台运行并查看日志
# 启动后台容器
docker run -d --name my-app myapp:latest
# 实时查看日志
docker logs -f my-app交互式调试
# 启动后台容器
docker run -d --name my-app myapp:latest
# 进入容器调试
docker exec -it my-app /bin/bash一次性任务
# 运行后自动删除
docker run --rm ubuntu:20.04 echo "Hello"
# 运行后自动删除(即使失败)
docker run --rm ubuntu:20.04 false || true