容器运行模式

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+Q

docker exec vs docker attach

特性docker execdocker 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

📚 参考资源


相关笔记