[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 的使用效率。

相关推荐
u0103055273 天前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055274 天前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝5 天前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055275 天前
Java图像处理实战指南
人工智能·1024程序员节
u0103055276 天前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055278 天前
Java实用类应用精讲
人工智能·1024程序员节
u0103055278 天前
Java I/O核心操作实战
人工智能·1024程序员节
u0103055279 天前
ArrayList操作详解与实战应用
人工智能·1024程序员节
u01030552710 天前
Java模块化编程实战指南
人工智能·笔记·1024程序员节
u01030552711 天前
使用BufferedReader读取控制台输入
人工智能·1024程序员节