上一篇 下一篇 分享链接 返回 返回顶部

Docker 私有化部署实战:从内网镜像仓库到 Compose 一键上线

发布人:慈云数据-客服中心 发布时间:3小时前 阅读量:1

Docker 私有化部署方案|附完整命令

在企业内部系统建设、测试环境搭建、离线交付、私有云部署等场景中,Docker 已经成为非常常见的基础设施工具。相比传统部署方式,Docker 可以将应用、运行环境、依赖库、配置文件等统一封装,极大降低环境差异带来的问题。

不过,在实际生产或企业内网环境中,很多系统并不适合直接依赖公网镜像仓库,例如 Docker Hub、GitHub Container Registry 等。一方面是因为公网访问速度不稳定,另一方面也涉及数据安全、镜像合规、版本管控、网络隔离等问题。因此,搭建一套 Docker 私有化部署方案,是企业容器化落地过程中非常重要的一环。

本文将从整体方案设计、Docker 安装、私有镜像仓库部署、镜像推送与拉取、Docker Compose 编排、生产环境建议等方面,完整介绍一套可落地的 Docker 私有化部署方案,并附上常用命令。


一、方案目标

本方案主要解决以下问题:

  1. 企业内部部署 Docker 运行环境
  2. 搭建私有 Docker 镜像仓库
  3. 支持应用镜像统一上传、管理和分发
  4. 支持内网环境离线部署
  5. 支持 Docker Compose 一键启动业务服务
  6. 降低生产环境部署复杂度
  7. 提高镜像版本管理和回滚能力

适用场景包括:

  • 企业内网私有化部署
  • 政企项目交付
  • 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 savedocker 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 流水线、集中日志系统和监控告警系统,实现更加标准化、自动化和高可用的容器平台。

目录结构
全文