Docker 私有化部署实战:从内网镜像仓库到 Compose 一键上线
Docker 私有化部署方案|附完整命令
在企业内部系统建设、测试环境搭建、离线交付、私有云部署等场景中,Docker 已经成为非常常见的基础设施工具。相比传统部署方式,Docker 可以将应用、运行环境、依赖库、配置文件等统一封装,极大降低环境差异带来的问题。
不过,在实际生产或企业内网环境中,很多系统并不适合直接依赖公网镜像仓库,例如 Docker Hub、GitHub Container Registry 等。一方面是因为公网访问速度不稳定,另一方面也涉及数据安全、镜像合规、版本管控、网络隔离等问题。因此,搭建一套 Docker 私有化部署方案,是企业容器化落地过程中非常重要的一环。
本文将从整体方案设计、Docker 安装、私有镜像仓库部署、镜像推送与拉取、Docker Compose 编排、生产环境建议等方面,完整介绍一套可落地的 Docker 私有化部署方案,并附上常用命令。
一、方案目标
本方案主要解决以下问题:
- 企业内部部署 Docker 运行环境
- 搭建私有 Docker 镜像仓库
- 支持应用镜像统一上传、管理和分发
- 支持内网环境离线部署
- 支持 Docker Compose 一键启动业务服务
- 降低生产环境部署复杂度
- 提高镜像版本管理和回滚能力
适用场景包括:
- 企业内网私有化部署
- 政企项目交付
- SaaS 系统本地化部署
- 测试环境、预生产环境搭建
- 微服务系统容器化部署
- 无法访问公网的离线服务器部署
二、整体架构设计
一个较为完整的 Docker 私有化部署方案通常包含以下几个部分:
开发机 / CI 构建服务器
|
| 构建镜像 docker build
|
v
私有镜像仓库 Registry / Harbor
|
| docker pull
|
v
业务服务器 / 生产服务器
|
| docker compose up -d
|
v
业务容器运行环境
1. 构建端
构建端可以是开发人员本地机器,也可以是 Jenkins、GitLab CI、GitHub Actions、Drone CI 等持续集成平台。构建端负责:
- 拉取代码
- 构建应用
- 构建 Docker 镜像
- 给镜像打版本标签
- 推送镜像到私有仓库
2. 私有镜像仓库
私有镜像仓库负责保存企业内部镜像,常见选择包括:
- Docker Registry
- Harbor
- Nexus Repository
- GitLab Container Registry
如果只是简单内网部署,可以使用 Docker 官方 Registry;如果需要用户管理、权限控制、镜像扫描、项目分组、Web 管理界面,推荐使用 Harbor。
本文会同时介绍轻量级 Registry 方案和更适合企业生产的 Harbor 方案。
3. 运行端
运行端即实际部署业务服务的服务器。运行端需要安装:
- Docker Engine
- Docker Compose
- 项目所需配置文件
- 业务编排文件
docker-compose.yml
运行端通过私有仓库拉取镜像,然后启动容器。
三、服务器环境准备
本文以 Linux 服务器为例,推荐系统:
- Ubuntu 20.04 / 22.04
- Debian 11 / 12
- CentOS 7 / 8
- Rocky Linux 8 / 9
- AlmaLinux 8 / 9
建议服务器配置如下:
| 用途 | CPU | 内存 | 磁盘 |
|---|---|---|---|
| 私有仓库服务器 | 2 核以上 | 4GB 以上 | 100GB 以上 |
| 应用服务器 | 2 核以上 | 4GB 以上 | 根据业务决定 |
| 测试环境 | 2 核 | 2GB | 50GB |
查看系统版本:
cat /etc/os-release
查看内核版本:
uname -r
查看服务器架构:
uname -m
查看磁盘空间:
df -h
查看内存:
free -h
四、安装 Docker Engine
下面分别提供 Ubuntu/Debian 和 CentOS/Rocky 系列系统的安装方式。
五、Ubuntu / Debian 安装 Docker
1. 卸载旧版本
sudo apt-get remove -y docker docker-engine docker.io containerd runc
2. 更新软件包
sudo apt-get update
3. 安装依赖
sudo apt-get install -y ca-certificates curl gnupg lsb-release
4. 添加 Docker 官方 GPG Key
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
如果是 Debian,可以替换为:
curl -fsSL https://download.docker.com/linux/debian/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
5. 添加 Docker 软件源
Ubuntu:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
Debian:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
6. 安装 Docker
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
7. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
8. 验证安装
docker version
docker compose version
sudo docker run hello-world
六、CentOS / Rocky Linux 安装 Docker
1. 卸载旧版本
sudo yum remove -y docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
2. 安装依赖
sudo yum install -y yum-utils device-mapper-persistent-data lvm2
3. 添加 Docker 软件源
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
如果是 Rocky Linux 或 AlmaLinux,也可以直接使用 CentOS 源,一般兼容。
4. 安装 Docker
sudo yum install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
5. 启动 Docker
sudo systemctl enable docker
sudo systemctl start docker
6. 验证安装
docker version
docker compose version
sudo docker run hello-world
七、配置 Docker 基础参数
生产环境建议统一配置 Docker 的数据目录、日志限制、镜像加速或私有仓库信任配置。
Docker 配置文件路径通常为:
/etc/docker/daemon.json
如果文件不存在,可以手动创建:
sudo mkdir -p /etc/docker
sudo vim /etc/docker/daemon.json
示例配置如下:
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"exec-opts": ["native.cgroupdriver=systemd"],
"storage-driver": "overlay2"
}
说明:
data-root:Docker 数据存储目录,建议放到数据盘log-driver:容器日志驱动max-size:单个日志文件最大大小max-file:日志文件保留数量storage-driver:推荐使用 overlay2
创建数据目录:
sudo mkdir -p /data/docker
重新加载配置:
sudo systemctl daemon-reload
sudo systemctl restart docker
查看 Docker 信息:
docker info
八、方案一:部署轻量级 Docker Registry
Docker 官方 Registry 部署简单,适合测试环境、小型内网环境或临时镜像仓库。
1. 创建 Registry 数据目录
sudo mkdir -p /data/registry
2. 启动 Registry 容器
docker run -d \
--name registry \
--restart=always \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
registry:2
3. 查看容器状态
docker ps
4. 测试 Registry 接口
curl http://127.0.0.1:5000/v2/
如果返回 {} 或空 JSON,说明 Registry 已启动。
九、配置 Docker 允许访问 HTTP 私有仓库
默认情况下,Docker 推送镜像到私有仓库时推荐使用 HTTPS。如果内网临时使用 HTTP Registry,需要配置 insecure-registries。
假设 Registry 地址为:
192.168.1.100:5000
编辑 Docker 配置:
sudo vim /etc/docker/daemon.json
加入如下配置:
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"insecure-registries": [
"192.168.1.100:5000"
]
}
重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
验证配置:
docker info | grep -A 5 "Insecure Registries"
注意:所有需要推送或拉取该私有仓库镜像的服务器,都需要配置
insecure-registries。
十、推送镜像到私有 Registry
以 Nginx 镜像为例。
1. 拉取公网镜像
docker pull nginx:latest
2. 给镜像打私有仓库标签
docker tag nginx:latest 192.168.1.100:5000/library/nginx:latest
3. 推送镜像
docker push 192.168.1.100:5000/library/nginx:latest
4. 查看仓库镜像列表
curl http://192.168.1.100:5000/v2/_catalog
查看某个镜像的标签:
curl http://192.168.1.100:5000/v2/library/nginx/tags/list
5. 从私有仓库拉取镜像
docker pull 192.168.1.100:5000/library/nginx:latest
6. 运行测试容器
docker run -d \
--name test-nginx \
-p 8080:80 \
192.168.1.100:5000/library/nginx:latest
访问测试:
curl http://127.0.0.1:8080
十一、方案二:部署企业级 Harbor 私有仓库
如果是生产环境,推荐使用 Harbor。Harbor 是 VMware 开源的企业级镜像仓库,支持:
- Web 管理界面
- 用户与权限管理
- 项目隔离
- 镜像复制
- 镜像漏洞扫描
- 镜像保留策略
- 审计日志
- Helm Chart 管理
- HTTPS 配置
十二、安装 Harbor 前准备
1. 安装 Docker 和 Docker Compose
前文已经介绍,这里确认即可:
docker version
docker compose version
2. 下载 Harbor 离线安装包
可以前往 Harbor GitHub Release 页面下载:
https://github.com/goharbor/harbor/releases
示例:
cd /opt
wget https://github.com/goharbor/harbor/releases/download/v2.10.0/harbor-offline-installer-v2.10.0.tgz
如果服务器不能访问公网,可以在有网机器下载后上传到服务器:
scp harbor-offline-installer-v2.10.0.tgz root@192.168.1.100:/opt/
3. 解压 Harbor
cd /opt
tar -zxvf harbor-offline-installer-v2.10.0.tgz
cd harbor
十三、配置 Harbor
复制配置文件:
cp harbor.yml.tmpl harbor.yml
编辑配置:
vim harbor.yml
常见配置如下:
hostname: harbor.example.local
http:
port: 80
# 如果暂时不启用 HTTPS,可以注释 https 部分
# https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
harbor_admin_password: Harbor12345
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
data_volume: /data/harbor
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
如果使用 IP 访问,也可以写:
hostname: 192.168.1.100
创建数据目录:
mkdir -p /data/harbor
十四、安装 Harbor
执行准备脚本:
./prepare
安装 Harbor:
./install.sh
安装完成后,查看容器:
docker ps
查看 Harbor 服务:
docker compose ps
访问 Harbor:
http://192.168.1.100
默认管理员账号:
用户名:admin
密码:Harbor12345
十五、配置 Docker 登录 Harbor
如果 Harbor 使用 HTTP,需要在客户端配置不安全仓库。
编辑:
sudo vim /etc/docker/daemon.json
加入:
{
"insecure-registries": [
"192.168.1.100"
]
}
如果之前已有配置,需要合并,例如:
{
"data-root": "/data/docker",
"log-driver": "json-file",
"log-opts": {
"max-size": "100m",
"max-file": "3"
},
"insecure-registries": [
"192.168.1.100"
]
}
重启 Docker:
sudo systemctl daemon-reload
sudo systemctl restart docker
登录 Harbor:
docker login 192.168.1.100
输入用户名和密码:
Username: admin
Password: Harbor12345
十六、推送镜像到 Harbor
假设 Harbor 中创建了一个项目,名称为:
demo
1. 构建业务镜像
假设项目目录下有 Dockerfile:
docker build -t myapp:1.0.0 .
2. 打标签
docker tag myapp:1.0.0 192.168.1.100/demo/myapp:1.0.0
3. 推送镜像
docker push 192.168.1.100/demo/myapp:1.0.0
4. 拉取镜像
docker pull 192.168.1.100/demo/myapp:1.0.0
十七、应用 Dockerfile 示例
以下是一个 Java Spring Boot 项目的 Dockerfile 示例:
FROM eclipse-temurin:17-jre
WORKDIR /app
COPY target/app.jar /app/app.jar
EXPOSE 8080
ENV JAVA_OPTS="-Xms512m -Xmx512m"
ENTRYPOINT ["sh", "-c", "java $JAVA_OPTS -jar /app/app.jar"]
构建命令:
mvn clean package -DskipTests
docker build -t myapp:1.0.0 .
推送到 Harbor:
docker tag myapp:1.0.0 192.168.1.100/demo/myapp:1.0.0
docker push 192.168.1.100/demo/myapp:1.0.0
十八、使用 Docker Compose 部署业务服务
对于单机部署或中小型项目,Docker Compose 是非常实用的编排工具。
假设业务包括:
- Nginx
- Java 后端服务
- MySQL
- Redis
创建目录:
mkdir -p /opt/myapp
cd /opt/myapp
创建 docker-compose.yml:
vim docker-compose.yml
示例配置:
services:
nginx:
image: nginx:1.25
container_name: myapp-nginx
restart: always
ports:
- "80:80"
volumes:
- ./nginx/conf.d:/etc/nginx/conf.d
- ./nginx/logs:/var/log/nginx
depends_on:
- app
networks:
- myapp-net
app:
image: 192.168.1.100/demo/myapp:1.0.0
container_name: myapp-backend
restart: always
environment:
SPRING_PROFILES_ACTIVE: prod
MYSQL_HOST: mysql
MYSQL_PORT: 3306
MYSQL_DATABASE: myapp
MYSQL_USERNAME: root
MYSQL_PASSWORD: root123
REDIS_HOST: redis
REDIS_PORT: 6379
ports:
- "8080:8080"
volumes:
- ./app/logs:/app/logs
depends_on:
- mysql
- redis
networks:
- myapp-net
mysql:
image: mysql:8.0
container_name: myapp-mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: root123
MYSQL_DATABASE: myapp
TZ: Asia/Shanghai
ports:
- "3306:3306"
volumes:
- ./mysql/data:/var/lib/mysql
- ./mysql/conf:/etc/mysql/conf.d
- ./mysql/logs:/var/log/mysql
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_unicode_ci
networks:
- myapp-net
redis:
image: redis:7.2
container_name: myapp-redis
restart: always
ports:
- "6379:6379"
volumes:
- ./redis/data:/data
command: redis-server --appendonly yes
networks:
- myapp-net
networks:
myapp-net:
driver: bridge
启动服务:
docker compose up -d
查看服务状态:
docker compose ps
查看日志:
docker compose logs -f
查看某个服务日志:
docker compose logs -f app
停止服务:
docker compose down
重启服务:
docker compose restart
更新镜像并重启:
docker compose pull
docker compose up -d
十九、Nginx 反向代理配置示例
创建目录:
mkdir -p /opt/myapp/nginx/conf.d
创建配置文件:
vim /opt/myapp/nginx/conf.d/default.conf
写入:
server {
listen 80;
server_name _;
client_max_body_size 100m;
location / {
proxy_pass http://app:8080;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_connect_timeout 60s;
proxy_read_timeout 300s;
proxy_send_timeout 300s;
}
}
重启 Nginx 容器:
docker compose restart nginx
二十、离线环境镜像导入导出
在完全离线环境中,可以使用 docker save 和 docker load 进行镜像迁移。
1. 导出镜像
docker save -o myapp-1.0.0.tar 192.168.1.100/demo/myapp:1.0.0
导出多个镜像:
docker save -o images.tar \
nginx:1.25 \
mysql:8.0 \
redis:7.2 \
192.168.1.100/demo/myapp:1.0.0
2. 上传到离线服务器
scp images.tar root@192.168.1.200:/opt/
3. 在离线服务器导入镜像
docker load -i /opt/images.tar
4. 查看镜像
docker images
二十一、常用 Docker 运维命令
1. 查看容器
docker ps
查看所有容器:
docker ps -a
2. 查看镜像
docker images
3. 查看日志
docker logs -f 容器名
查看最近 200 行日志:
docker logs --tail=200 -f 容器名
4. 进入容器
docker exec -it 容器名 /bin/bash
如果容器没有 bash:
docker exec -it 容器名 /bin/sh
5. 重启容器
docker restart 容器名
6. 停止容器
docker stop 容器名
7. 删除容器
docker rm 容器名
强制删除:
docker rm -f 容器名
8. 删除镜像
docker rmi 镜像名:标签
9. 查看资源占用
docker stats
10. 清理无用资源
docker system prune
清理未使用镜像、容器、网络和构建缓存:
docker system prune -a
注意:生产环境执行清理命令前一定要确认影响范围,避免误删仍需使用的镜像。
二十二、版本发布与回滚方案
生产环境中,不建议一直使用 latest 标签。推荐使用明确版本号,例如:
myapp:1.0.0
myapp:1.0.1
myapp:1.1.0
发布新版本:
docker build -t myapp:1.0.1 .
docker tag myapp:1.0.1 192.168.1.100/demo/myapp:1.0.1
docker push 192.168.1.100/demo/myapp:1.0.1
修改 docker-compose.yml:
image: 192.168.1.100/demo/myapp:1.0.1
重新部署:
docker compose pull
docker compose up -d
如果新版本异常,需要回滚到 1.0.0:
image: 192.168.1.100/demo/myapp:1.0.0
执行:
docker compose up -d
查看日志确认:
docker compose logs -f app
二十三、生产环境安全建议
1. 私有仓库尽量启用 HTTPS
生产环境不建议长期使用 HTTP Registry。应配置 HTTPS 证书,避免镜像传输过程中被劫持或篡改。
2. 控制镜像仓库权限
Harbor 中应按项目划分权限,例如:
- 开发人员:可推送测试镜像
- 测试人员:可拉取测试镜像
- 运维人员:可管理生产项目
- 生产服务器:只允许拉取生产镜像
3. 禁止使用 latest 部署生产
latest 不代表最新稳定版本,而且容易造成版本不可追踪。生产环境应使用明确版本号。
4. 限制容器日志大小
如果不限制日志,容器标准输出可能占满磁盘。因此建议在 Docker daemon 或 Compose 中配置日志轮转。
Compose 中也可以这样写:
logging:
driver: json-file
options:
max-size: "100m"
max-file: "3"
5. 数据目录必须持久化
数据库、上传文件、配置文件、日志等必须挂载到宿主机目录或外部存储中,避免容器删除后数据丢失。
6. 定期备份
至少需要备份以下内容:
- Harbor 数据目录
- MySQL 数据目录
- Redis 持久化文件
- 应用配置文件
- Docker Compose 文件
- 上传文件目录
二十四、完整部署流程总结
下面给出一套从零开始的完整流程。
1. 安装 Docker
sudo apt-get update
sudo apt-get install -y ca-certificates curl gnupg lsb-release
sudo install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | \
sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] \
https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update
sudo apt-get install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
sudo systemctl enable docker
sudo systemctl start docker
2. 部署 Registry
mkdir -p /data/registry
docker run -d \
--name registry \
--restart=always \
-p 5000:5000 \
-v /data/registry:/var/lib/registry \
registry:2
3. 配置客户端允许访问私有仓库
vim /etc/docker/daemon.json
{
"insecure-registries": [
"192.168.1.100:5000"
]
}
systemctl daemon-reload
systemctl restart docker
4. 构建并推送业务镜像
docker build -t myapp:1.0.0 .
docker tag myapp:1.0.0 192.168.1.100:5000/demo/myapp:1.0.0
docker push 192.168.1.100:5000/demo/myapp:1.0.0
5. 创建 Compose 文件并启动
mkdir -p /opt/myapp
cd /opt/myapp
vim docker-compose.yml
启动:
docker compose up -d
查看:
docker compose ps
docker compose logs -f
二十五、结语
Docker 私有化部署的核心并不只是“把应用放进容器”,而是建立一套可持续维护的镜像构建、镜像分发、版本管理、服务编排、日志治理和安全管控体系。
对于简单环境,可以使用 Docker Registry 快速完成私有镜像仓库搭建;对于企业生产环境,更推荐使用 Harbor,以获得更完善的权限管理、项目隔离和审计能力。无论选择哪种方案,都应注意镜像版本规范、数据持久化、日志轮转、备份恢复以及 HTTPS 安全访问。
通过本文中的完整命令和配置示例,可以快速搭建一套基础但完整的 Docker 私有化部署环境。后续如果业务规模继续扩大,可以进一步引入 Kubernetes、Helm、CI/CD 流水线、集中日志系统和监控告警系统,实现更加标准化、自动化和高可用的容器平台。