05_container/5.2_daemon.md
在生产环境中,我们通常需要容器持续运行,不受终端关闭的影响。本节将深入讲解如何让容器在后台运行,以及理解容器生命周期的核心概念。
当你在终端运行一个程序时,有两种模式:
Docker 容器默认是 前台运行 的。使用 -d (detach) 参数可以让容器在后台运行。
$ docker run ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world
容器会把输出的结果 (STDOUT) 打印到宿主机上面。此时:
Ctrl+C 会终止容器$ docker run -d ubuntu:24.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a
使用 -d 参数后:
docker logs 查看)这是初学者最常遇到的困惑。 理解这个问题,你就理解了 Docker 的核心设计理念。
很多人尝试这样启动容器:
$ docker run -d ubuntu:24.04
然后用 docker ps 查看,发现容器根本不在运行!这是为什么?
flowchart TD
subgraph Lifecycle ["Docker 容器的生命周期 = 容器内 PID 1 进程的生命周期"]
direction LR
Start["主进程启动"] --> Run["容器运行"]
Exit["主进程退出"] --> Stop["容器停止"]
end
当你运行 docker run -d ubuntu:24.04 时:
/bin/bash-it 参数),bash 发现没有输入源关键理解:
-d 参数 不是 让容器 “一直运行”-d 参数是让容器 “在后台运行”,能运行多久取决于主进程| 场景 | 原因 | 解决方案 |
|---|---|---|
docker run -d ubuntu | 默认 bash 无输入立即退出 | 指定长期运行的命令 |
docker run -d nginx 后改了配置 | 配置错误导致 nginx 启动失败 | 查看 docker logs |
| 自定义镜像容器启动即退 | Dockerfile 的 CMD 执行完毕 | 确保 CMD 是前台进程 |
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
77b2dc01fe0f ubuntu:24.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute agitated_wright
$ docker container logs 77b2dc01fe0f
hello world
hello world
hello world
...
实时查看日志 (类似 tail -f):
$ docker container logs -f 77b2dc01fe0f
$ docker container ls -a
加上 -a 参数可以看到所有容器,包括已停止的。这对于调试 “容器启动即退出” 的问题非常有用。
## Web 服务器
$ docker run -d -p 80:80 nginx:latest
## 数据库
$ docker run -d -p 3306:3306 mysql:8.4
## 缓存服务
$ docker run -d -p 6379:6379 redis:latest
版本说明:示例使用常见的标签如
latest或稳定大版本号如mysql:8.4。具体版本可根据需求调整,生产环境建议明确指定版本号(如mysql:8.4.4)而非使用latest。
当容器启动有问题时,去掉 -d 参数 可以直接看到输出和错误:
## 有问题的容器,先前台运行看看发生了什么
$ docker run myimage:v1.0.0
对于一次性任务,使用 --rm 参数让容器退出后自动删除:
$ docker run --rm ubuntu:24.04 echo "Hello, World!"
Hello, World!
## 容器执行完后自动删除
...
## 后台启动
$ docker run -d --name myapp myimage:v1.0.0
## 查看最近 100 行日志
$ docker logs --tail 100 myapp
## 实时跟踪日志
$ docker logs -f myapp
## 查看带时间戳的日志
$ docker logs -t myapp
查看退出状态码:
$ docker ps -a --filter "name=mycontainer"
# 查看 STATUS 列,如 “Exited (1)” 表示异常退出
查看容器日志:
$ docker logs mycontainer
以交互模式调试:
$ docker run -it myimage:v1.0.0 /bin/sh
# 进入容器手动执行命令,查找问题
检查端口映射:
$ docker port mycontainer
检查容器内服务状态:
$ docker exec mycontainer ps aux
使用 docker attach:
$ docker attach mycontainer
注意:
attach会连接到容器的主进程。如果主进程不是交互式的,你可能只能看到输出。使用Ctrl+PCtrl+Q可以安全退出而不停止容器。