DOCKER DEPLOYMENT GUIDE
Docker 镜像通用部署文档
适用于本地或构建机打包 Docker 镜像、导出 tar 包、上传服务器、导入镜像,并通过 Docker Compose 启动服务的通用部署流程。
文章适合谁看?
适合需要把 Docker 项目从本地、构建机或 CI 环境部署到 Linux 服务器的开发者。文中的项目名、镜像名、路径、服务器地址均使用占位符,可直接替换成自己的项目配置。
适用场景:在本地或构建机打包 Docker 镜像,将镜像导出为
.tar文件,上传到目标服务器后导入,并通过 Docker Compose 启动服务。
一、部署前需要确认的信息
在执行部署前,先确认以下信息,并根据实际项目替换命令中的占位符。
<IMAGE_NAME> | my-app | |
<IMAGE_TAG> | latestv1.0.0 | |
<CONTAINER_NAME> | my-app-service | |
<TAR_FILE> | my-app.tar | |
<SERVER_USER> | rootubuntu | |
<SERVER_IP> | 1.2.3.4 | |
<DEPLOY_DIR> | /opt/my-app | |
<PLATFORM> | linux/amd64linux/arm64 |
如果没有特别指定镜像标签,Docker 默认使用:
latest
二、查看当前容器状态
docker ps
作用
查看当前正在运行的 Docker 容器。
如果要查看所有容器,包括已停止的容器,可以执行:
docker ps -a
注意
镜像名和容器名不是同一个概念。
<IMAGE_NAME>是镜像名,用于构建、导出、导入镜像。 <CONTAINER_NAME>是容器名,用于查看日志、进入容器、检查容器状态。
例如,进入容器时应使用容器名或容器 ID:
docker exec -it <CONTAINER_NAME> /bin/bash
如果容器中没有 bash,可以使用:
docker exec -it <CONTAINER_NAME> /bin/sh
三、查看容器挂载目录
docker inspect <CONTAINER_NAME> | grep -A 15 "Mounts"
作用
查看容器挂载的宿主机目录、文件和容器内路径。
如果通过容器名查不到,也可以使用容器 ID:
docker inspect <CONTAINER_ID> | grep -A 15 "Mounts"
说明
如果服务使用了 bind mount 或 volume,需要重点确认:
宿主机路径是否存在。 宿主机路径权限是否正确。 容器内路径是否与应用配置一致。 配置文件、上传目录、日志目录、数据目录是否正确挂载。
四、进入部署目录
cd <DEPLOY_DIR>
作用
进入服务器上的项目部署目录。
通常该目录下会包含:
docker-compose.yml
.env
配置文件目录
日志目录
数据挂载目录
后续执行 docker compose down、docker compose up -d 等命令时,建议在 docker-compose.yml 所在目录执行。
五、停止旧服务
docker compose down
作用
停止并删除当前 Compose 项目中的容器。
注意
docker compose down 会删除 Compose 管理的容器,但默认不会删除镜像和数据卷。
如果提示类似:
Network xxx Resource is still in use
通常说明还有其他容器正在使用同一个 Docker 网络。只要目标服务容器已经停止,一般不影响后续部署。
如需只停止某一个服务,可以执行:
docker compose stop <SERVICE_NAME>
六、构建 Docker 镜像
docker build -f Dockerfile --platform <PLATFORM> -t <IMAGE_NAME>:<IMAGE_TAG> .
示例
docker build -f Dockerfile --platform linux/amd64 -t my-app:latest .
参数说明
docker build | |
-f Dockerfile | |
--platform <PLATFORM> | |
-t <IMAGE_NAME>:<IMAGE_TAG> | |
. |
适用场景
如果构建机和目标服务器 CPU 架构不同,建议显式指定 --platform。
常见平台:
linux/amd64
linux/arm64
如果构建机和目标服务器架构一致,也可以省略 --platform:
docker build -f Dockerfile -t <IMAGE_NAME>:<IMAGE_TAG> .
七、查看本地镜像
docker images
作用
查看当前机器上的 Docker 镜像。
也可以按镜像名过滤:
docker images | grep <IMAGE_NAME>
八、导出镜像为 tar 文件
docker save -o <TAR_FILE> <IMAGE_NAME>:<IMAGE_TAG>
示例
docker save -o my-app.tar my-app:latest
作用
将本地 Docker 镜像导出为 .tar 文件,方便传输到其他服务器。
参数说明
docker save | |
-o <TAR_FILE> | |
<IMAGE_NAME>:<IMAGE_TAG> |
九、上传镜像包到目标服务器
可以使用 scp 上传:
scp <TAR_FILE> <SERVER_USER>@<SERVER_IP>:<DEPLOY_DIR>/
示例
scp my-app.tar root@1.2.3.4:/opt/my-app/
上传完成后,登录服务器:
ssh <SERVER_USER>@<SERVER_IP>
进入部署目录:
cd <DEPLOY_DIR>
确认文件是否上传成功:
ls -lh <TAR_FILE>
十、导入镜像
docker load -i <TAR_FILE>
示例
docker load -i my-app.tar
作用
将 .tar 镜像包导入到目标服务器的 Docker 镜像列表中。
常见错误
错误命令:
docker load -i
错误提示:
flag needs an argument: 'i' in -i
原因是 -i 后面必须跟镜像包文件名。
正确写法:
docker load -i <TAR_FILE>
镜像已存在时
如果目标服务器上已经存在同名同标签镜像,导入时可能会出现旧镜像变成无标签镜像的情况:
<none> <none>
这是正常现象,说明新镜像已经导入,旧镜像失去原来的标签。
可以后续清理无用镜像:
docker image prune
十一、启动服务
前台启动
docker compose up
作用
以前台方式启动服务,可以直接查看启动日志。
适合首次部署或排查启动问题。
后台启动
docker compose up -d
作用
以后台方式启动服务。
正式部署时推荐使用后台启动。
十二、查看启动日志
docker logs -f -n 200 <CONTAINER_NAME>
作用
实时查看容器最近 200 行日志。
参数说明
docker logs | |
-f | |
-n 200 | |
<CONTAINER_NAME> |
如果使用 Docker Compose,也可以按服务查看日志:
docker compose logs -f -n 200
查看某个服务日志:
docker compose logs -f -n 200 <SERVICE_NAME>
十三、验证服务是否启动成功
可以从以下几个方面判断服务是否部署成功。
1. 查看容器状态
docker ps
重点确认:
容器是否存在。 容器状态是否为 Up。端口映射是否正确。
2. 查看日志
docker logs -f -n 200 <CONTAINER_NAME>
重点确认:
应用是否启动完成。 数据库、缓存、消息队列、向量库等依赖是否连接成功。 是否存在报错堆栈。 服务监听端口是否正确。
3. 访问接口或页面
如果服务提供 HTTP 接口,可以使用:
curl http://127.0.0.1:<PORT>
如果需要从外部访问,还需要确认:
服务器防火墙是否放行端口。 云服务器安全组是否放行端口。 Docker Compose 端口映射是否正确。 应用是否监听 0.0.0.0,而不是只监听127.0.0.1。
十四、完整部署流程命令
1. 本地或构建机打包镜像
docker build -f Dockerfile --platform <PLATFORM> -t <IMAGE_NAME>:<IMAGE_TAG> .
2. 导出镜像
docker save -o <TAR_FILE> <IMAGE_NAME>:<IMAGE_TAG>
3. 上传到服务器
scp <TAR_FILE> <SERVER_USER>@<SERVER_IP>:<DEPLOY_DIR>/
4. 登录服务器
ssh <SERVER_USER>@<SERVER_IP>
5. 进入部署目录
cd <DEPLOY_DIR>
6. 停止旧服务
docker compose down
7. 导入新镜像
docker load -i <TAR_FILE>
8. 后台启动服务
docker compose up -d
9. 查看日志
docker logs -f -n 200 <CONTAINER_NAME>
10. 查看容器状态
docker ps
十五、常用排查命令
查看运行中的容器
docker ps
查看所有容器
docker ps -a
查看所有镜像
docker images
查看容器日志
docker logs -f -n 200 <CONTAINER_NAME>
查看 Compose 日志
docker compose logs -f -n 200
查看容器挂载
docker inspect <CONTAINER_NAME> | grep -A 15 "Mounts"
进入容器
docker exec -it <CONTAINER_NAME> /bin/bash
如果容器没有 bash:
docker exec -it <CONTAINER_NAME> /bin/sh
查看端口占用
ss -lntp
或:
netstat -lntp
查看 Compose 配置是否正确
docker compose config
重启服务
docker compose restart
十六、关键注意事项
镜像名和容器名不要混淆。 docker build用于构建镜像。 docker save用于导出镜像。 docker load用于导入镜像。 docker compose down会停止并删除 Compose 管理的容器,但默认不会删除镜像。 docker compose up -d用于后台启动服务。 docker logs通常使用容器名或容器 ID。 docker compose logs通常使用 Compose 服务名。 如果构建机和服务器架构不同,建议指定 --platform。正式部署前要确认 .env、挂载目录、端口映射、外部依赖配置是否正确。如果服务外网无法访问,需要同时检查应用监听地址、防火墙、安全组和 Docker 端口映射。 如果出现 orphan containers 提示,一般是当前目录下 Compose 配置变化或同项目遗留容器导致,需结合实际服务判断是否清理。
十七、推荐最终执行版
如果只需要一套最简洁的部署命令,可以按下面执行。
# 本地构建镜像
docker build -f Dockerfile --platform <PLATFORM> -t <IMAGE_NAME>:<IMAGE_TAG> .
# 导出镜像
docker save -o <TAR_FILE> <IMAGE_NAME>:<IMAGE_TAG>
# 上传到服务器
scp <TAR_FILE> <SERVER_USER>@<SERVER_IP>:<DEPLOY_DIR>/
# 登录服务器
ssh <SERVER_USER>@<SERVER_IP>
# 进入部署目录
cd <DEPLOY_DIR>
# 停止旧容器
docker compose down
# 导入新镜像
docker load -i <TAR_FILE>
# 后台启动
docker compose up -d
# 查看日志
docker logs -f -n 200 <CONTAINER_NAME>
# 查看容器状态
docker ps
十八、可直接复制的变量示例
可以先把以下变量替换成实际项目值,再复制命令执行。
IMAGE_NAME="my-app"
IMAGE_TAG="latest"
TAR_FILE="my-app.tar"
SERVER_USER="root"
SERVER_IP="1.2.3.4"
DEPLOY_DIR="/opt/my-app"
PLATFORM="linux/amd64"
CONTAINER_NAME="my-app-service"
本地构建、导出、上传:
docker build -f Dockerfile --platform ${PLATFORM} -t ${IMAGE_NAME}:${IMAGE_TAG} .
docker save -o ${TAR_FILE} ${IMAGE_NAME}:${IMAGE_TAG}
scp ${TAR_FILE} ${SERVER_USER}@${SERVER_IP}:${DEPLOY_DIR}/
服务器导入、启动、查看:
ssh ${SERVER_USER}@${SERVER_IP}
cd ${DEPLOY_DIR}
docker compose down
docker load -i ${TAR_FILE}
docker compose up -d
docker logs -f -n 200 ${CONTAINER_NAME}
docker ps
总结
这套流程的核心是:构建镜像、导出镜像、上传服务器、导入镜像、Compose 启动、日志验证。实际使用时,只需要把占位符替换成自己的项目参数,即可形成一套稳定可复用的部署 SOP
夜雨聆风