跳转至

基础与容器生命周期

镜像是不可变模板,容器是镜像的一次运行实例。容器主进程(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

常用检查

docker inspect web
docker stats
docker top web
docker port 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 形式:

ENTRYPOINT ["java", "-jar", "/app/app.jar"]

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 连接主进程标准输入输出,操作不当可能发送退出信号,日常排障优先 logsexec。生产容器可能没有 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 证据。