[Docker 集群] 私有仓库 + compose

目录

[一、Docker Registry:搭建自己的镜像仓库](#一、Docker Registry:搭建自己的镜像仓库)

[1️⃣先搞懂:Registry 是什么?](#1️⃣先搞懂:Registry 是什么?)

[2️⃣实战:3 步搭建私有 Registry](#2️⃣实战:3 步搭建私有 Registry)

[步骤 1:配置 Docker daemon(关键!)](#步骤 1:配置 Docker daemon(关键!))

[步骤 2:启动 Registry 容器](#步骤 2:启动 Registry 容器)

[步骤 3:上传 / 下载镜像到私有仓库](#步骤 3:上传 / 下载镜像到私有仓库)

[上传镜像示例(以 centos:new 为例)](#上传镜像示例(以 centos:new 为例))

下载镜像示例(另一台机器或本地测试)

[3️⃣实用技巧:用 API 管理私有仓库](#3️⃣实用技巧:用 API 管理私有仓库)

[二、Docker Compose:轻松搞定多容器编排](#二、Docker Compose:轻松搞定多容器编排)

[1️⃣核心概念:Compose 能做什么?](#1️⃣核心概念:Compose 能做什么?)

[2️⃣基础:学会写 docker-compose.yml 文件](#2️⃣基础:学会写 docker-compose.yml 文件)

[第一步:YAML 语法规则(必看!避免格式错误)](#第一步:YAML 语法规则(必看!避免格式错误))

第二步:核心配置项解析

[示例:一个简单的 Web+MySQL 配置](#示例:一个简单的 Web+MySQL 配置)

[3️⃣实战:用 Compose 部署 WordPress](#3️⃣实战:用 Compose 部署 WordPress)

[步骤 1:安装 Docker Compose](#步骤 1:安装 Docker Compose)

[步骤 2:创建工作目录与配置文件](#步骤 2:创建工作目录与配置文件)

[步骤 3:启动服务并验证](#步骤 3:启动服务并验证)

[4. 常用 Compose 命令(收藏!)](#4. 常用 Compose 命令(收藏!))

[三、企业级实战:用 Harbor 搭建私有镜像仓库](#三、企业级实战:用 Harbor 搭建私有镜像仓库)

[1️⃣Harbor 核心优势:为什么选它?](#1️⃣Harbor 核心优势:为什么选它?)

[2️⃣实战:5 步安装 Harbor](#2️⃣实战:5 步安装 Harbor)

[步骤 1:下载 Harbor 安装包](#步骤 1:下载 Harbor 安装包)

[步骤 2:修改 Harbor 配置文件](#步骤 2:修改 Harbor 配置文件)

[步骤 3:生成 Harbor 配置](#步骤 3:生成 Harbor 配置)

[步骤 4:启动 Harbor 服务](#步骤 4:启动 Harbor 服务)

[步骤 5:验证 Harbor 状态](#步骤 5:验证 Harbor 状态)

[3️⃣Harbor 使用实战:上传镜像到仓库](#3️⃣Harbor 使用实战:上传镜像到仓库)

[步骤 1:Web 端配置(创建项目)](#步骤 1:Web 端配置(创建项目))

[步骤 2:客户端配置(信任 Harbor)](#步骤 2:客户端配置(信任 Harbor))

[步骤 3:客户端上传镜像到 Harbor](#步骤 3:客户端上传镜像到 Harbor)

[4️⃣常见问题:Harbor 服务异常怎么办?](#4️⃣常见问题:Harbor 服务异常怎么办?)

四、总结


作为一名 Docker 初学者,在掌握了基础的镜像与容器操作后,难免会遇到 "如何高效管理团队内部镜像""怎样批量部署多容器应用" 这类问题。今天就结合实战,从 Docker Registry 私有仓库、Docker Compose 容器编排到企业级镜像仓库 Harbor,带大家一步步打通 Docker 进阶之路,所有操作均附详细步骤,新手也能轻松上手。

一、Docker Registry:搭建自己的镜像仓库

在团队协作或企业环境中,直接使用 Docker 官方公共仓库(Docker Hub)存在网速慢、隐私泄露风险,此时搭建私有 Registry就成了刚需。下面从概念到实战,教你快速搭建并使用私有仓库。

1️⃣先搞懂:Registry 是什么?

Docker Registry 本质是一个 "镜像存储与分发服务",可以理解为 "Docker 镜像的专属仓库",核心作用包括:

  • 集中存储镜像,支持版本控制(通过 Tag 区分);
  • 方便团队共享镜像,避免重复构建;
  • 私有部署时,保障内部镜像不泄露到公网。

Registry 分为两种:

  • 官方公共 Registry:即 Docker Hub,无需搭建但受网络和隐私限制;
  • 私有 Registry:企业 / 个人在自己服务器上部署,完全可控,也是我们重点学习的内容。

2️⃣实战:3 步搭建私有 Registry

步骤 1:配置 Docker daemon(关键!)

首先需要修改 Docker 的配置文件daemon.json,告诉 Docker "信任我们即将搭建的私有仓库",避免后续上传 / 下载镜像时出现 "不安全链接" 错误。

  1. 编辑配置文件(若文件不存在则直接创建):

bash

复制代码
[root@docker-lucky-cloud docker]# vi /etc/docker/daemon.json
  1. 写入以下内容(重点关注insecure-registries,填写你的服务器 IP + 端口,这里用192.168.110.160:5000为例):

json

复制代码
{
  "log-level": "error",          // 日志级别:只记录错误
  "storage-driver": "overlay2",  // Docker推荐的存储驱动
  "log-driver": "json-file",     // 日志格式
  "log-opts": {                  // 日志滚动策略:单个日志最大50M,保留3个
    "max-size": "50m",
    "max-file": "3"
  },
  "registry-mirrors": ["https://0f8a3388042b4b0ab6611ccc6e866ab3.mirror.swr.myhuaweicloud.com"],  // 国内镜像加速(可选)
  "insecure-registries": ["http://192.168.110.160:5000"]  // 信任私有仓库地址
}
  1. 重启 Docker 服务,让配置生效:

bash

复制代码
[root@docker-lucky-cloud docker]# systemctl daemon-reload  # 重载配置
[root@docker-lucky-cloud docker]# systemctl restart docker  # 重启Docker
步骤 2:启动 Registry 容器

Registry 本身也是一个 Docker 镜像,我们直接通过docker run启动容器即可,无需复杂安装:

bash

复制代码
[root@docker-lucky-cloud ~]# docker run -d \
-p 5000:5000 \  # 端口映射:主机5000端口→容器5000端口(Registry默认端口)
-v /var/lib/local_registry:/var/lib/registry \  # 数据挂载:把镜像数据存到主机/var/lib/local_registry(避免容器删除后数据丢失)
--name local_registry \  # 给容器起个名字:local_registry
registry:latest  # 使用最新版Registry镜像

启动后,用docker ps查看容器状态,若STATUSUp则表示成功。

步骤 3:上传 / 下载镜像到私有仓库

搭建好仓库后,如何把本地镜像传上去?又如何从仓库拉取镜像?核心是 "给镜像打标签"------ 必须让镜像标签包含私有仓库的 IP 和端口,Docker 才知道要操作哪个仓库。

上传镜像示例(以 centos:new 为例)
  1. 查看本地镜像,确认要上传的镜像存在:

bash

复制代码
[root@docker-lucky-cloud ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
centos       new       5d0da3dc9764   3 years ago     231MB  # 要上传的镜像
  1. 给镜像打 "私有仓库标签":格式为仓库IP:端口/镜像名:标签

bash

复制代码
[root@docker-lucky-cloud ~]# docker tag centos:new 192.168.110.160:5000/centos:new
  1. 上传镜像到私有仓库:

bash

复制代码
[root@docker-lucky-cloud ~]# docker push 192.168.110.160:5000/centos:new

看到Pusheddigest信息,就表示上传成功了。

下载镜像示例(另一台机器或本地测试)

如果需要从私有仓库拉取镜像,直接用docker pull+"仓库标签" 即可:

bash

复制代码
# 拉取刚才上传的centos:new镜像
[root@docker-lucky-cloud ~]# docker pull 192.168.110.160:5000/centos:new

3️⃣实用技巧:用 API 管理私有仓库

除了通过docker命令,还可以用curl调用 Registry 的 API 查看仓库信息,方便自动化管理:

  • 查看仓库中的所有镜像(repository 列表):

bash

复制代码
[root@docker-lucky-cloud ~]# curl 127.0.0.1:5000/v2/_catalog
# 成功返回:{"repositories":["centos"]}(表示有一个叫centos的镜像)
  • 查看某个镜像的所有标签(比如 centos):

bash

复制代码
[root@docker-lucky-cloud ~]# curl -X GET 127.0.0.1:5000/v2/centos/tags/list
# 成功返回:{"name":"centos","tags":["new"]}(表示centos镜像有一个new标签)
  • 查看某个标签对应的镜像摘要(用于精准定位镜像):

bash

复制代码
[root@docker-lucky-cloud ~]# curl -s 127.0.0.1:5000/v2/centos/manifests/new -I -H 'Accept: application/vnd.docker.distribution.manifest.v2+json' | grep Docker-Content-Digest | awk '{print $NF}' | tr -d '\r'
# 成功返回:sha256:a1801b843b1bfaf77c501e7a6d3f709401a1e0c83863037fa3aab063a7fdb9dc

二、Docker Compose:轻松搞定多容器编排

当我们需要部署 "Web 服务 + 数据库""前端 + 后端 + 缓存" 这类多容器应用时,手动逐个启动容器、配置网络和依赖会非常繁琐。Docker Compose 就是为解决这个问题而生的工具 ------ 用一个 YAML 文件定义所有服务,一条命令完成部署。

1️⃣核心概念:Compose 能做什么?

Docker Compose 是 Docker 官方推出的多容器编排工具,核心价值在于:

  • docker-compose.yml文件统一配置所有服务(比如 Web、DB);
  • 一键启动 / 停止 / 重启所有服务,无需逐个操作容器;
  • 自动管理容器间的网络和依赖(比如确保 DB 启动后再启动 Web);
  • 支持服务扩展(比如一键增加 Web 服务的实例数量)。

适用场景:开发环境测试、小型生产环境部署(大型环境推荐 Kubernetes)。

2️⃣基础:学会写 docker-compose.yml 文件

Compose 的核心是docker-compose.yml文件,采用 YAML 语法,结构清晰但有严格的格式要求(新手容易踩坑)。先掌握基础规则和核心配置项。

第一步:YAML 语法规则(必看!避免格式错误)

YAML 语法对格式要求极严,写错会导致 Compose 无法识别,重点记住以下几点:

  1. 大小写敏感;
  2. 用空格缩进表示层级(不能用 Tab 键!);
  3. 缩进空格数不固定,同一层级左对齐即可(推荐 2 个空格);
  4. 注释用#开头;
  5. 键值对用:分隔,:后必须加 1 个空格(比如image: nginx:latest);
  6. 列表项用-开头,-后必须加 1 个空格(比如ports: - "8080:80")。
第二步:核心配置项解析

一个标准的docker-compose.yml文件包含 3 个核心层级:version(Compose 版本)、services(服务定义)、networks/volumes(网络 / 数据卷)。常用配置项如下:

配置项 作用 示例
version 指定 Compose 文件版本(需与 Docker 版本匹配,推荐 3.8) version: '3.8'
services 定义所有服务(每个服务对应一个 / 多个容器) services: webapp: ...
image 指定服务使用的镜像 image: nginx:latest
build 本地构建镜像(代替 image,需指定 Dockerfile 路径) build: context: ./app dockerfile: Dockerfile.prod
ports 端口映射(主机端口:容器端口) ports: - "8080:80"
volumes 数据卷挂载(主机目录:容器目录) volumes: - /opt/data:/var/www/html
environment 设置环境变量(数组或字典格式) environment: - MYSQL_ROOT_PASSWORD=123456
depends_on 定义服务依赖(确保依赖服务先启动) depends_on: - database
restart 重启策略(always = 总是重启,on-failure = 失败时重启) restart: always
networks 指定服务加入的网络 networks: - my-network
示例:一个简单的 Web+MySQL 配置

下面是一个完整的docker-compose.yml示例,定义了 "Web 服务(nginx)" 和 "数据库服务(mysql)":

yaml

复制代码
version: '3.8'  # Compose版本
services:
  # 定义Web服务
  web:
    image: nginx:latest  # 使用官方nginx镜像
    ports:
      - "8080:80"  # 主机8080端口映射到容器80端口
    volumes:
      - ./nginx/html:/usr/share/nginx/html  # 本地目录挂载到容器(存放静态页面)
    depends_on:
      - db  # 依赖db服务,db启动后再启动web
    restart: always  # 容器退出时总是重启

  # 定义数据库服务
  db:
    image: mysql:5.7  # 使用mysql 5.7镜像
    environment:
      - MYSQL_ROOT_PASSWORD=123456  #  root密码
      - MYSQL_DATABASE=testdb  # 自动创建testdb数据库
    volumes:
      - mysql-data:/var/lib/mysql  # 数据卷挂载(持久化MySQL数据)
    restart: always

# 定义数据卷(用于持久化MySQL数据)
volumes:
  mysql-data:

3️⃣实战:用 Compose 部署 WordPress

WordPress 需要 "Web 服务(PHP)+ MySQL 数据库",用 Compose 部署只需 3 步,非常适合新手练手。

步骤 1:安装 Docker Compose

CentOS 系统下直接用 yum 安装(其他系统可参考官方文档):

bash

复制代码
# 安装epel源(yum需要)
[root@docker-lucky-cloud ~]# yum install epel-release.noarch -y
# 安装docker-compose
[root@docker-lucky-cloud ~]# yum -y install docker-compose
# 验证安装:查看版本
[root@docker-lucky-cloud ~]# docker-compose --version
# 输出类似:docker-compose version 1.18.0, build 8dd22a9
步骤 2:创建工作目录与配置文件
  1. 创建专门的工作目录(避免文件混乱):

bash

复制代码
[root@docker-lucky-cloud ~]# mkdir /opt/wordpress-compose
[root@docker-lucky-cloud ~]# cd /opt/wordpress-compose
  1. 创建docker-compose.yml文件并写入以下内容:

yaml

复制代码
version: '3.1'
services:
  # WordPress服务
  wordpress:
    image: wordpress  # 官方WordPress镜像(自带PHP环境)
    restart: always
    ports:
      - "8080:80"  # 主机8080端口映射到容器80端口
    environment:
      # 连接MySQL的配置(需与db服务的环境变量对应)
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
    volumes:
      - /opt/wordpress:/var/www/html  # 本地目录挂载(持久化WordPress数据)
    depends_on:
      - db  # 依赖db服务

  # MySQL数据库服务
  db:
    image: mysql:5.7
    restart: always
    environment:
      MYSQL_DATABASE: wordpress  # 数据库名
      MYSQL_USER: wordpress      # 数据库用户
      MYSQL_PASSWORD: wordpress  # 数据库密码
      MYSQL_RANDOM_ROOT_PASSWORD: '1'  # 自动生成root随机密码(安全)
    volumes:
      - /opt/mysql:/var/lib/mysql  # 持久化MySQL数据
步骤 3:启动服务并验证
  1. 启动所有服务(-d表示后台运行):

bash

复制代码
[root@docker-lucky-cloud wordpress-compose]# docker-compose up -d
# 首次启动会自动拉取镜像,耐心等待...
  1. 查看服务状态:

bash

复制代码
[root@docker-lucky-cloud wordpress-compose]# docker-compose ps
# 成功会看到两个服务的State都是Up:
# dockercompose_db_1          Up      3306/tcp, 33060/tcp
# dockercompose_wordpress_1   Up      0.0.0.0:8080->80/tcp
  1. 访问 WordPress:打开浏览器,输入服务器IP:8080(比如192.168.110.160:8080),按照引导完成安装即可。

4. 常用 Compose 命令(收藏!)

掌握以下命令,就能应对日常的服务管理:

命令 作用
docker-compose up -d 后台启动所有服务(首次启动会创建容器)
docker-compose down 停止并删除所有服务的容器、网络(数据卷保留)
docker-compose start 启动已停止的服务
docker-compose stop 停止运行中的服务(容器不删除)
docker-compose restart 重启所有服务
docker-compose ps 查看所有服务的容器状态
docker-compose logs 查看所有服务的日志(加-f实时跟踪)
docker-compose scale 服务名=数量 扩展服务实例(比如docker-compose scale web=3

三、企业级实战:用 Harbor 搭建私有镜像仓库

虽然 Docker Registry 能满足基础的私有仓库需求,但缺乏 "用户权限管理""镜像扫描""多租户隔离" 等企业级功能。Harbor 是 VMware 开源的企业级 Docker 镜像仓库,完美解决了这些问题,也是企业中最常用的私有仓库方案。

1️⃣Harbor 核心优势:为什么选它?

相比基础的 Registry,Harbor 增加了大量企业级特性:

  • 多租户与权限控制:支持按项目隔离镜像,不同用户有不同权限(读 / 写 / 管理员);
  • 安全防护:内置镜像漏洞扫描、用户认证(支持 LDAP/OAuth)、访问控制;
  • 高效管理:支持镜像复制(多仓库同步)、标签管理、存储优化(去重压缩);
  • 易用性:提供 Web 管理界面,操作直观,无需记复杂命令;
  • 可扩展性:支持集群部署,可与 Kubernetes、Jenkins 等工具集成。

2️⃣实战:5 步安装 Harbor

Harbor 基于 Docker Compose 部署,安装前需确保服务器已安装 Docker 和 Docker Compose(前面已讲过安装方法)。

步骤 1:下载 Harbor 安装包

Harbor 提供在线和离线两种安装包,离线包包含所有依赖镜像,适合无外网环境。这里以离线包为例:

  1. 下载地址:Harbor GitHub Releases(选择harbor-offline-installer-版本.tgz,比如harbor-offline-installer-v1.9.2.tgz);
  2. 上传安装包到服务器的/opt目录,然后解压:

bash

复制代码
[root@docker-lucky-cloud ~]# cd /opt
[root@docker-lucky-cloud opt]# tar zxvf harbor-offline-installer-v1.9.2.tgz
# 解压后会生成harbor目录
步骤 2:修改 Harbor 配置文件

进入 harbor 目录,修改核心配置文件harbor.cfg

bash

复制代码
[root@docker-lucky-cloud opt]# cd harbor
[root@docker-lucky-cloud harbor]# vi harbor.cfg

重点修改以下两个参数(其他参数默认即可,后续可在 Web 界面调整):

  • hostname = 192.168.110.160:Harbor 服务器的 IP 或域名(必须填写,否则无法访问);
  • harbor_admin_password = 123456:Harbor 管理员(admin)的初始密码(自定义,建议复杂些)。
步骤 3:生成 Harbor 配置

运行prepare脚本,根据harbor.cfg生成 Docker Compose 配置文件:

bash

复制代码
[root@docker-lucky-cloud harbor]# ./prepare
# 脚本会自动拉取依赖镜像,输出类似"prepare base dir is set to /opt/harbor"表示成功
步骤 4:启动 Harbor 服务

运行install.sh脚本,自动用 Docker Compose 启动所有服务:

bash

复制代码
[root@docker-lucky-cloud harbor]# ./install.sh
# 等待执行完成,看到"✔ ----Harbor has been installed and started successfully.----"表示安装成功
步骤 5:验证 Harbor 状态

查看 Harbor 的所有服务容器状态:

bash

复制代码
[root@docker-lucky-cloud harbor]# docker-compose ps
# 成功会看到所有服务(如harbor-core、harbor-db、nginx等)的State都是Up

3️⃣Harbor 使用实战:上传镜像到仓库

Harbor 的使用流程分为 "Web 端配置项目" 和 "客户端上传镜像" 两步,下面详细说明。

步骤 1:Web 端配置(创建项目)
  1. 访问 Harbor Web 界面:打开浏览器,输入http://服务器IP(比如http://192.168.110.160);
  2. 登录:用户名admin,密码是harbor.cfg中设置的harbor_admin_password(比如 123456);
  3. 创建项目:
    • 点击左侧 "项目"→"新建项目";
    • 项目名称:自定义(比如test);
    • 访问级别:选择 "公开"(测试用,生产环境建议 "私有");
    • 点击 "确定",项目创建完成。
步骤 2:客户端配置(信任 Harbor)

和 Docker Registry 一样,客户端(需要上传 / 下载镜像的机器)必须信任 Harbor,否则会报错。修改 Docker 配置:

  1. 编辑docker.service文件:

bash

复制代码
[root@docker-lucky-cloud ~]# vi /usr/lib/systemd/system/docker.service
  1. 找到ExecStart行,添加--insecure-registry 服务器IP(比如192.168.110.160):

bash

复制代码
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.110.160 --containerd=/run/containerd/containerd.sock
  1. 重启 Docker 服务:

bash

复制代码
[root@docker-lucky-cloud ~]# systemctl daemon-reload
[root@docker-lucky-cloud ~]# systemctl restart docker
步骤 3:客户端上传镜像到 Harbor

nginx:latest镜像为例,上传到 Harbor 的test项目:

  1. 登录 Harbor(客户端执行):

bash

复制代码
[root@docker-lucky-cloud ~]# docker login -u admin -p 123456 192.168.110.160
# 看到"Login Succeeded"表示登录成功
  1. 给镜像打 Harbor 标签:格式为HarborIP/项目名/镜像名:标签

bash

复制代码
[root@docker-lucky-cloud ~]# docker tag nginx:latest 192.168.110.160/test/nginx:harbor-test
  1. 上传镜像:

bash

复制代码
[root@docker-lucky-cloud ~]# docker push 192.168.110.160/test/nginx:harbor-test
  1. Web 端验证:登录 Harbor→进入test项目→点击nginx,就能看到上传的harbor-test标签镜像。

4️⃣常见问题:Harbor 服务异常怎么办?

如果通过docker-compose ps看到部分服务状态为Exit,可按以下步骤排查:

  1. 重启所有 Harbor 服务:

bash

复制代码
[root@docker-lucky-cloud harbor]# docker-compose restart
  1. 查看异常服务的日志(比如 harbor-core):

bash

复制代码
[root@docker-lucky-cloud harbor]# docker-compose logs harbor-core
# 根据日志中的错误信息排查(常见错误:配置文件错误、端口占用)
  1. 若重启无效,可先停止服务,再重新启动:

bash

复制代码
[root@docker-lucky-cloud harbor]# docker-compose down
[root@docker-lucky-cloud harbor]# docker-compose up -d

四、总结

通过本文的学习,我们从基础到实战掌握了 Docker 进阶的三个核心技能:

  1. Docker Registry:搭建基础私有仓库,满足个人或小团队的镜像存储需求;
  2. Docker Compose:用 YAML 文件管理多容器应用,一键部署 Web+DB 等复杂服务;
  3. Harbor:搭建企业级私有仓库,支持权限控制、镜像扫描等高级功能,满足生产环境需求。

对于初学者,建议先从 "Registry 搭建" 和 "Compose 部署 WordPress" 练手,熟悉后再尝试 Harbor 的企业级特性。后续还可以探索 Harbor 与 Jenkins 的集成(实现自动化构建 + 镜像推送),进一步提升 Docker 的使用效率。

相关推荐
程序猿阿伟11 小时前
《打破数据孤岛:3D手游角色表情骨骼协同的实践指南》
1024程序员节
时间的情敌11 小时前
前端实现大文件上传全流程详解
1024程序员节
冬天的雪200811 小时前
SpringBoot知识点总结
1024程序员节
JoannaJuanCV11 小时前
大模型基础:Rotary Position Embedding(RoPE)
大模型·1024程序员节·qwen3
库库林_沙琪马11 小时前
SpringBoot内容协商机制
1024程序员节
元拓数智11 小时前
现代前端状态管理深度剖析:从单一数据源到分布式状态
前端·1024程序员节
大数据张老师11 小时前
数据结构——冒泡排序
数据结构·算法·排序算法·1024程序员节
Lzc77411 小时前
Linux网络的应用层协议HTTP
linux·1024程序员节·应用层协议http
赵_|大人11 小时前
Ubuntu开启SSH
1024程序员节