乐于分享
好东西不私藏

Docker 镜像部署文档

Docker 镜像部署文档

DOCKER DEPLOYMENT GUIDE

Docker 镜像通用部署文档

适用于本地或构建机打包 Docker 镜像、导出 tar 包、上传服务器、导入镜像,并通过 Docker Compose 启动服务的通用部署流程。

文章适合谁看?

适合需要把 Docker 项目从本地、构建机或 CI 环境部署到 Linux 服务器的开发者。文中的项目名、镜像名、路径、服务器地址均使用占位符,可直接替换成自己的项目配置。

适用场景:在本地或构建机打包 Docker 镜像,将镜像导出为 .tar 文件,上传到目标服务器后导入,并通过 Docker Compose 启动服务。


一、部署前需要确认的信息

在执行部署前,先确认以下信息,并根据实际项目替换命令中的占位符。

占位符
含义
示例
<IMAGE_NAME>
Docker 镜像名称
my-app
<IMAGE_TAG>
Docker 镜像标签
latest
v1.0.0
<CONTAINER_NAME>
容器名称
my-app-service
<TAR_FILE>
导出的镜像包名称
my-app.tar
<SERVER_USER>
服务器登录用户
root
ubuntu
<SERVER_IP>
目标服务器 IP
1.2.3.4
<DEPLOY_DIR>
服务器部署目录
/opt/my-app
<PLATFORM>
目标运行平台
linux/amd64
linux/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 downdocker 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
构建 Docker 镜像
-f Dockerfile
指定 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
导出 Docker 镜像
-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
显示最近 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

十六、关键注意事项

  1. 镜像名和容器名不要混淆。
  2. docker build
     用于构建镜像。
  3. docker save
     用于导出镜像。
  4. docker load
     用于导入镜像。
  5. docker compose down
     会停止并删除 Compose 管理的容器,但默认不会删除镜像。
  6. docker compose up -d
     用于后台启动服务。
  7. docker logs
     通常使用容器名或容器 ID。
  8. docker compose logs
     通常使用 Compose 服务名。
  9. 如果构建机和服务器架构不同,建议指定 --platform
  10. 正式部署前要确认 .env、挂载目录、端口映射、外部依赖配置是否正确。
  11. 如果服务外网无法访问,需要同时检查应用监听地址、防火墙、安全组和 Docker 端口映射。
  12. 如果出现 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