基础与容器生命周期¶
镜像是不可变模板,容器是镜像的一次运行实例。容器主进程(PID 1)退出后容器就停止;容器应可删除并从同一镜像、配置和数据卷重新创建。
Image → create → Container(created) → start → running
running → stop/kill → exited
exited → start 或 rm
常用流程¶
# 拉取镜像并查看本地镜像
docker pull nginx:alpine
docker image ls
# 后台运行容器:主机 8080 映射到容器 80
docker run -d --name web --restart unless-stopped -p 8080:80 nginx:alpine
# 查看、日志、进入容器
docker ps
docker logs -f web
docker exec -it web sh
# 停止、启动、删除
docker stop web
docker start web
docker rm -f web
常用检查¶
容器删除后,容器可写层中的数据会丢失;数据库、上传文件和配置应使用数据卷或挂载目录。生产环境使用明确的镜像标签或摘要,不要依赖 latest。
创建、启动与运行的区别¶
docker create --name web nginx:alpine
docker start web
# docker run = pull(需要时)+ create + start
docker run --name once --rm alpine:3.21 echo hello
docker run 的参数属于容器创建配置。已经创建后,不能通过 docker start 临时更改端口、Volume、环境变量或资源;需要删除并按新配置重建。
前台、后台与信号¶
docker run --name foreground nginx:alpine
docker run -d --name background nginx:alpine
docker stop --time 30 background
docker kill --signal=SIGTERM background
docker stop 先向 PID 1 发送停止信号,等待超时后强制终止。应用必须正确处理 SIGTERM、停止接收新流量、完成在途请求并退出。Shell 形式的 CMD app 可能让 shell 成为 PID 1,推荐 exec 形式:
exec、attach 与调试¶
docker exec web nginx -t
docker exec -it web sh
docker diff web
docker cp web:/etc/nginx/nginx.conf ./nginx.conf
exec 在运行容器中启动新进程;attach 连接主进程标准输入输出,操作不当可能发送退出信号,日常排障优先 logs 与 exec。生产容器可能没有 shell/curl,应通过同网络调试容器或构建独立 debug 镜像,不要现场安装工具污染实例。
过滤与格式化¶
docker ps --filter status=exited
docker ps --filter label=com.example.team=platform
docker inspect --format '{{.Config.Image}} {{.State.Status}} {{.RestartCount}}' web
为容器添加团队、环境、应用、版本等 Label,便于查询、自动化和审计。容器名应稳定表达服务用途,不把随机人工命名当成部署记录。
重启策略¶
| 策略 | 行为 |
|---|---|
no |
默认,不自动重启 |
on-failure[:n] |
进程非零退出时重启,可限制次数 |
always |
Docker 启动后持续尝试运行 |
unless-stopped |
与 always 类似,但人工停止后不随 daemon 重启 |
重启策略只能恢复进程退出,不能修复错误配置、数据损坏,也不会因为 Health 为 unhealthy 自动重启。持续重启时先保留日志、退出码和 inspect 证据。