Docker(三)—— Docker Compose 编排与 Harbor 私有仓库实战指南

文章目录

  • 前言
  • [一、Docker Compose编排](#一、Docker Compose编排)
    • [1.1 Docker Compose简介](#1.1 Docker Compose简介)
      • [1.1.1 核心概念](#1.1.1 核心概念)
      • [1.1.2 Compose的核心价值](#1.1.2 Compose的核心价值)
      • [1.1.3 核心配置文件](#1.1.3 核心配置文件)
    • [1.2 Docker Compose环境安装](#1.2 Docker Compose环境安装)
      • [1.2.1 基础版本安装(1.21.1版本,适用于多数Linux架构)](#1.2.1 基础版本安装(1.21.1版本,适用于多数Linux架构))
      • [1.2.2 高版本安装(2.26.0版本,适用于aarch64架构)](#1.2.2 高版本安装(2.26.0版本,适用于aarch64架构))
    • [1.3 YAML文件格式及编写注意事项](#1.3 YAML文件格式及编写注意事项)
      • [1.3.1 YAML基本语法(重点)](#1.3.1 YAML基本语法(重点))
        • [语法示例(YAML vs JSON)](#语法示例(YAML vs JSON))
      • [1.3.2 Docker Compose常用配置字段](#1.3.2 Docker Compose常用配置字段)
      • [Docker Compose 常见字段说明](#Docker Compose 常见字段说明)
      • [1.3.3 Docker Compose常用命令](#1.3.3 Docker Compose常用命令)
      • [1.3.4 典型Docker Compose工程文件结构](#1.3.4 典型Docker Compose工程文件结构)
      • [1.3.5 YAML配置实操示例(Nginx服务)](#1.3.5 YAML配置实操示例(Nginx服务))
      • [1.3.6 编写注意事项](#1.3.6 编写注意事项)
    • [1.4 Nginx反向代理配置(对接Tomcat)](#1.4 Nginx反向代理配置(对接Tomcat))
      • [1.4.1 创建工程目录](#1.4.1 创建工程目录)
      • [1.4.2 编辑Nginx配置文件](#1.4.2 编辑Nginx配置文件)
      • [1.4.4 编写tomcat的Dockerfile](#1.4.4 编写tomcat的Dockerfile)
      • [1.4.4 编写Nginx+Tomcat的docker-compose.yml](#1.4.4 编写Nginx+Tomcat的docker-compose.yml)
      • [1.4.4 启动Nginx+Tomcat服务](#1.4.4 启动Nginx+Tomcat服务)
  • 二、Docker-Harbor私有仓库部署与管理
    • [2.1 搭建基础 Docker Registry 私有仓库](#2.1 搭建基础 Docker Registry 私有仓库)
      • [2.1.1 下载Registry镜像](#2.1.1 下载Registry镜像)
      • [2.1.2 配置Docker守护进程(支持不安全仓库)](#2.1.2 配置Docker守护进程(支持不安全仓库))
      • [2.1.3 运行Registry容器(持久化存储)](#2.1.3 运行Registry容器(持久化存储))
      • [2.1.4 Docker容器重启策略补充](#2.1.4 Docker容器重启策略补充)
      • [2.1.5 镜像标签、上传与下载测试](#2.1.5 镜像标签、上传与下载测试)
        • [步骤 1:为本地镜像打标签](#步骤 1:为本地镜像打标签)
        • [步骤 2:上传镜像到私有仓库](#步骤 2:上传镜像到私有仓库)
        • [步骤 3:查看私有仓库中的镜像](#步骤 3:查看私有仓库中的镜像)
        • [步骤 4:查看镜像的所有标签](#步骤 4:查看镜像的所有标签)
        • [步骤 5:从私有仓库拉取镜像](#步骤 5:从私有仓库拉取镜像)
    • [2.2 Harbor简介](#2.2 Harbor简介)
      • [2.2.1 什么是Harbor](#2.2.1 什么是Harbor)
      • [2.2.2 Harbor核心特性](#2.2.2 Harbor核心特性)
      • [2.2.3 Harbor架构(六大核心组件)](#2.2.3 Harbor架构(六大核心组件))
      • [2.2.4 Harbor数据流向](#2.2.4 Harbor数据流向)
    • [2.3 部署Harbor服务](#2.3 部署Harbor服务)
      • [2.3.1 安装Docker Compose(前置依赖)](#2.3.1 安装Docker Compose(前置依赖))
      • [2.3.2 下载Harbor离线安装包](#2.3.2 下载Harbor离线安装包)
      • [2.3.3 修改Harbor配置文件](#2.3.3 修改Harbor配置文件)
        • 配置文件参数说明
          • [**1、必需参数:这些参数需要在配置文件 Harbor.yml 中设置。如果用户更新它们 ./prepare + 重启 Harbor, 参数将生效。具体参数如下:**](#1、必需参数:这些参数需要在配置文件 Harbor.yml 中设置。如果用户更新它们 ./prepare + 重启 Harbor, 参数将生效。具体参数如下:)
          • [2、可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。](#2、可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。)
      • [2.3.4 启动Harbor服务](#2.3.4 启动Harbor服务)
      • [2.3.5 查看Harbor启动状态](#2.3.5 查看Harbor启动状态)
      • [2.3.6 图形化界面创建项目](#2.3.6 图形化界面创建项目)
        • [步骤 1:登录 Harbor Web 界面](#步骤 1:登录 Harbor Web 界面)
        • [步骤 2:创建项目](#步骤 2:创建项目)
        • [步骤 3:本地测试镜像上传(Harbor 服务器本地)](#步骤 3:本地测试镜像上传(Harbor 服务器本地))
    • [2.4 客户端上传(下载)镜像到Harbor](#2.4 客户端上传(下载)镜像到Harbor)
      • [2.4.1 配置Docker客户端](#2.4.1 配置Docker客户端)
      • [2.4.2 客户端上传(下载)镜像操作](#2.4.2 客户端上传(下载)镜像操作)
    • [2.5 维护管理Harbor](#2.5 维护管理Harbor)
      • [2.5.1 通过 Harbor Web 创建项目](#2.5.1 通过 Harbor Web 创建项目)
      • [2.5.2 创建用户与分配权限](#2.5.2 创建用户与分配权限)
        • [步骤 1:创建用户](#步骤 1:创建用户)
        • [步骤 2:为项目分配用户权限](#步骤 2:为项目分配用户权限)
        • [步骤 3:客户端使用普通用户操作镜像](#步骤 3:客户端使用普通用户操作镜像)
      • [2.5.3 查看操作日志](#2.5.3 查看操作日志)
      • [2.5.4 修改Harbor配置(harbor.yml)](#2.5.4 修改Harbor配置(harbor.yml))
      • [2.5.5 Harbor数据迁移(保留镜像与配置)](#2.5.5 Harbor数据迁移(保留镜像与配置))
        • [步骤 1:停止源服务器 Harbor 服务](#步骤 1:停止源服务器 Harbor 服务)
        • [步骤 2:打包源服务器数据](#步骤 2:打包源服务器数据)
        • [步骤 3:将数据包传输到目标服务器](#步骤 3:将数据包传输到目标服务器)
        • [步骤 4:目标服务器恢复数据](#步骤 4:目标服务器恢复数据)
  • 总结

前言

在Docker实际应用场景中,单一容器往往无法满足复杂业务需求------一个Web项目可能需要Web服务、数据库、缓存等多个容器协同工作,同时企业级应用还需解决镜像的安全存储、权限管理与跨环境同步问题。为此,Docker官方提供了Docker Compose 用于多容器编排,而Harbor则作为企业级私有镜像仓库,补充了官方Registry的功能短板。

本文将从实操角度出发,详细讲解Docker Compose的环境搭建、YAML配置编写与服务编排流程,以及Harbor私有仓库的部署、镜像管理与维护方案。每个步骤均附带完整命令与配置示例,确保读者能跟着实操落地,快速掌握Docker生态中这两个核心工具的使用。

一、Docker Compose编排

Docker Compose 是 Docker 官方开源项目,基于 Python 开发,通过调用 Docker API 实现对容器集群的快速编排。其核心价值在于:将多个相互依赖的容器(如 Web 服务、数据库、缓存)定义为一个"项目",通过单条命令实现所有容器的创建、启动、停止与销毁,彻底简化多容器应用的部署流程。

1.1 Docker Compose简介

1.1.1 核心概念

Compose将容器集群分为三层结构,层级关系清晰,便于管理:

  • 工程(Project) :Compose运行目录下的所有文件(docker-compose.yml、环境变量文件等)的集合,默认以当前目录名作为工程名。
  • 服务(Service):工程中定义的单个应用组件(如Nginx、Tomcat),包含容器的镜像、启动参数、依赖关系等配置,一个服务可对应多个容器实例。
  • 容器(Container):服务的具体运行实例,由Compose根据服务配置自动创建,是应用的实际运行载体。

注意:Docker Compose 不解决负载均衡问题,若需实现服务的负载均衡,需结合 Consul、Nginx 等工具进行服务发现与调度。

1.1.2 Compose的核心价值

  • 简化配置 :用一个YAML文件统一管理所有服务的配置,避免手动执行多条docker run命令。
  • 依赖控制 :通过depends_on等字段定义服务启动顺序,解决"数据库未启动时Web服务启动失败"等依赖问题。
  • 跨平台兼容:基于Docker API工作,支持所有支持Docker的平台(Linux、Windows、macOS)。

1.1.3 核心配置文件

Docker Compose 的默认配置文件为 docker-compose.yml,支持通过两种方式自定义配置文件:

  • 环境变量 COMPOSE_FILE:通过该变量指定配置文件路径,如 export COMPOSE_FILE=./my-compose.yml
  • 命令行参数 -f:通过 docker-compose -f ./my-compose.yml up 直接指定配置文件。

1.2 Docker Compose环境安装

Compose需单独安装,以下提供两种版本的安装命令(覆盖不同架构与版本需求):

1.2.1 基础版本安装(1.21.1版本,适用于多数Linux架构)

bash 复制代码
# 1. 下载Compose二进制文件到系统可执行目录
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 2. 赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 3. 验证安装(显示版本号即成功)
docker-compose --version

1.2.2 高版本安装(2.26.0版本,适用于aarch64架构)

若使用ARM架构服务器(如树莓派、阿里云ARM实例),需安装对应架构的高版本Compose:

bash 复制代码
# 下载高版本(2.26.0)aarch64架构二进制文件
sudo curl -L "https://github.com/docker/compose/releases/download/2.26.0/docker-compose-linux-aarch64" -o /usr/local/bin/docker-compose

# 赋予执行权限
sudo chmod +x /usr/local/bin/docker-compose

# 验证
docker-compose --version

1.3 YAML文件格式及编写注意事项

docker-compose.yml 基于 YAML 语法编写,YAML 是一种简洁的数据序列化格式,比 JSON 更易读,且支持复杂数据结构。掌握 YAML 语法是编写正确 Compose 配置的基础。

1.3.1 YAML基本语法(重点)

YAML语法简洁但严格,需重点注意以下规则:

  • 大小写敏感imageImage 代表不同字段,需严格区分。

  • 缩进规则 :使用 空格 缩进表示层级关系,不支持 TAB 键,推荐 2 个空格作为一个缩进层级。

  • 列表(序列) :用 -(短横线)开头表示列表项,例如:

    yaml 复制代码
    languages:
      - Java
      - Golang
      - Python
  • 字典(映射) :用 :(冒号)连接键值对,冒号后必须加一个空格,例如:

    yaml 复制代码
    websites:
      cpu: 2
      memory: 1024M
  • 注释 :用#开头,注释内容不会被解析。

  • 字符串 :含特殊字符(如空格、$)时需用单引号/双引号包裹,如command: "echo 'Hello Compose'"

语法示例(YAML vs JSON)

YAML格式(简洁易读):

yaml 复制代码
languages:  # 列表(对应JSON数组)
  - Java
  - Golang
  - Python
resources:  # 字典(对应JSON对象)
  cpu: 2
  memory: 1024M
  swap: 2048M
debug: true  # 布尔值

对应的JSON格式(对比参考):

json 复制代码
{
  "languages": ["Java", "Golang", "Python"],
  "resources": {
    "cpu": "2",
    "memory": "1024M",
    "swap": "2048M"
  },
  "debug": true
}

1.3.2 Docker Compose常用配置字段

docker-compose.ymlservices下的每个服务需配置核心字段,下表整理了高频使用字段及说明:

Docker Compose 常见字段说明

字段 描述
build 指定 Dockerfile 文件名,需在 build 的子级标签中使用 dockerfile 标签指定文件名。
dockerfile 构建镜像时使用的 Dockerfile 路径。
context 构建上下文路径,可以是 Dockerfile 的本地路径或 Git 仓库 URL。
image 指定使用的镜像名称。
command 覆盖容器启动后默认执行的命令。
container_name 指定容器名称,由于名称唯一,指定后无法使用 scale 扩展容器数量。
deploy 配置部署和运行服务的相关选项,仅适用于 Swarm 模式。
environment 设置容器内的环境变量。
networks 将容器连接到顶级 networks 中定义的网络。
network_mode 设置容器的网络模式,如 hostbridge 等。
ports 暴露容器端口,格式与 -p 相同,但端口号不能低于 60。
volumes 挂载宿主机目录或命名卷到容器,命名卷需在顶级 volumes 中定义。
volumes_from 从其他服务或容器挂载卷,支持 :ro(只读)和 :rw(读写)选项,仅限版本 '2' 使用。
hostname 设置容器的主机名。
sysctls 在容器内设置内核参数。
links 连接到其他容器,格式为 服务名称[:服务别名]
privileged 赋予容器 root 权限(不安全),可选 truefalse
restart 设置容器重启策略: - no:默认策略,容器退出时不重启。 - on-failure:仅在非正常退出(状态非 0)时重启。 - on-failure:3:非正常退出时最多重启 3 次。 - always:总是重启容器。 - unless-stopped:总是重启,除非手动停止。
depends_on 定义容器依赖关系,确保依赖的容器先启动。

1.3.3 Docker Compose常用命令

通过docker-compose命令管理工程生命周期,核心命令如下:

命令 描述
docker-compose build 重新构建工程中所有服务的镜像(若Dockerfile有修改)
docker-compose ps 列出工程中所有容器的状态(需在docker-compose.yml所在目录执行)
docker-compose up -d 创建并启动所有服务(-d表示后台运行)
docker-compose exec 在指定容器内执行命令(如docker-compose exec nginx bash
docker-compose scale 扩展服务的容器数量(如docker-compose scale tomcat=3
docker-compose logs 查看所有服务的日志(加-f实时跟踪)
docker-compose down 删除容器、网络、数据卷(加-v删除数据卷)
docker-compose stop/start/restart 停止/启动/重启所有服务

1.3.4 典型Docker Compose工程文件结构

以"Nginx+Tomcat"编排为例,工程目录结构如下(清晰的目录划分便于维护):

复制代码
/opt/compose_nginx_tomcat/  # 工程根目录
├── docker-compose.yml      # Compose核心配置文件
├── nginx                   # Nginx服务相关文件
│   ├── Dockerfile          # Nginx镜像构建文件
│   └── nginx.conf          # Nginx配置文件(反向代理、静态资源等)
├── tomcat                  # Tomcat服务相关文件
│   ├── Dockerfile          # Tomcat镜像构建文件
│   └── webapps             # Tomcat应用目录
│       └── ROOT.war        # Web应用WAR包
└── wwwroot                 # 静态资源目录(Nginx挂载用)
    └── index.html          # 静态页面

1.3.5 YAML配置实操示例(Nginx服务)

以下为单Nginx服务的Compose配置示例,包含镜像构建、端口映射、数据挂载等核心功能:

步骤1:准备依赖文件
bash 复制代码
# 1. 创建工程目录
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx

# 2. 准备Nginx源码包(可从官网下载nginx-1.20.2.tar.gz)
cp /path/to/nginx-1.20.2.tar.gz ./

# 3. 编写Nginx启动脚本(run.sh)
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx  # 启动Nginx
bash 复制代码
# 4. 编写Dockerfile(构建Nginx镜像)
vim Dockerfile
FROM centos:7  # 基础镜像
MAINTAINER this is nginx image <SimonCwh>  # 维护者信息

# 配置YUM源并安装依赖
RUN rm -rf /etc/yum.repos.d/*
ADD CentOS-Base.repo /etc/yum.repos.d/  # 需提前准备CentOS-Base.repo
RUN yum clean all && yum makecache && \
    yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
    useradd -M -s /sbin/nologin nginx  # 创建Nginx用户

# 解压并编译安装Nginx
ADD nginx-1.20.2.tar.gz /usr/local/src/
WORKDIR /usr/local/src/nginx-1.20.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && \
make && make install

# 配置环境变量(便于直接执行nginx命令)
ENV PATH /usr/local/nginx/sbin:$PATH

#指定http和https端口
EXPOSE 80
EXPOSE 443

//方法一:
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf			#关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]
bash 复制代码
# 5. 准备静态页面
echo "<h1>Docker Compose Nginx Test</h1>" > /opt/compose_nginx/wwwroot/index.html
步骤2:编写docker-compose.yml
yaml 复制代码
vim /opt/compose_nginx/docker-compose.yml
version: '3'  # Compose版本(需与Docker版本兼容)
services:
  nginx:  # 服务名(自定义)
    container_name: web1  # 容器名
    hostname: nginx       # 容器主机名
    build:                # 构建镜像配置
      context: ./nginx    # 构建上下文(Dockerfile所在目录)
      dockerfile: Dockerfile  # Dockerfile文件名
    ports:
      - 1216:80   # 宿主机1216端口映射到容器80端口
      - 1217:443  # 宿主机1217端口映射到容器443端口
    networks:        # 加入自定义网络
      lnmp:
        ipv4_address: 172.16.0.10  # 固定容器IP
    volumes:         # 挂载宿主机目录
      - ./wwwroot:/usr/local/nginx/html  # 静态资源挂载

# 定义自定义网络(bridge模式)
networks:
  lnmp:
    driver: bridge
    ipam:
      config:
        - subnet: 172.16.0.0/16  # 子网
步骤3:启动并验证服务
bash 复制代码
# 进入工程目录
cd /opt/compose_nginx/

# 启动服务(-d后台运行,-f指定配置文件)
docker-compose -f docker-compose.yml up -d

-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME :指定项目名称,默认使用目录名称
-d :在后台运行
bash 复制代码
# 查看容器状态(确保状态为Up)必须在docker-compose.yml所在目录执行此命令
cd /opt/compose_nginx/
docker-compose ps
# 或用docker命令查看
docker ps -a

# 浏览器访问验证(替换为宿主机IP)
http://192.168.10.14:1216  # 应显示"Docker Compose Nginx Test"

1.3.6 编写注意事项

  1. 路径问题 :在 docker-compose.yml 文件中,contextvolumes 路径都是相对路径,相对于 docker-compose.yml 文件所在的目录,避免使用绝对路径(降低可移植性)。
  2. 缩进规范services下的每个服务配置需缩进2个空格,服务内的字段(如buildports)需再缩进2个空格,避免因缩进错误导致解析失败。
  3. 依赖顺序depends_on仅保证启动顺序,不保证依赖服务"完全就绪"(如数据库启动后需等待初始化完成),复杂场景需用脚本判断服务可用性。
  4. 端口冲突ports映射的宿主机端口需未被占用,否则服务启动失败。

1.4 Nginx反向代理配置(对接Tomcat)

1.4.1 创建工程目录

bash 复制代码
cp -r /opt/compose_nginx/ /opt/compose_nginx_tomcat
cd /opt/compose_nginx_tomcat/
mkdir tomcat

1.4.2 编辑Nginx配置文件

Nginx + Tomcat联动场景中,Nginx 需作为反向代理,将客户端请求转发到 Tomcat 服务。以下为 nginx/nginx.conf 的核心配置:

bash 复制代码
# 编辑Nginx配置文件(/opt/compose_nginx_tomcat/nginx/nginx.conf)
server {
    listen 80;          # 监听80端口
    server_name localhost;  # 服务名

    location / {
        # 转发请求到Tomcat服务(Compose中服务名可直接解析为容器IP)
        proxy_pass http://tomcat:8080;
        # 传递客户端真实IP和请求头(避免后端获取到代理IP)
        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_pass http://tomcat:8080 中的 tomcat 是 Compose 中 Tomcat 服务的名称(在 docker-compose.ymlservices 下定义),Docker Compose 会自动维护服务名称与容器 IP 的映射,无需手动配置 hosts。

  • proxy_pass http://tomcat:8080 表示将请求转发到名为 tomcat 的服务(在 Compose 中,这个名称会自动解析为 Tomcat 容器的名称)。
  • 配置 proxy_set_header 是为了确保转发请求时,Nginx 会把客户端的 IP 和请求头传递给后端服务器。

1.4.4 编写tomcat的Dockerfile

bash 复制代码
# 1、上传apache-tomcat-8.5.35.tar.gz和jdk-8u91-linux-x64.tar.gz到/opt/compose_nginx_tomcat/tomcat

# 编写Dockerfile
FROM centos:7
MAINTAINER this is tomcat image <SimonCwh>
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv jdk1.8.0_91 /usr/local/java
ENV JAVA_HOME /usr/local/java
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-8.5.35.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv apache-tomcat-8.5.35 /usr/local/tomcat
EXPOSE 8080
#CMD ["/usr/local/tomcat/bin/catalina.sh","run"]
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]
CMD ["/usr/local/tomcat/bin/startup.sh","start"]

1.4.4 编写Nginx+Tomcat的docker-compose.yml

结合 Nginx 反向代理配置,以下为"Nginx + Tomcat"联动的完整 docker-compose.yml

yaml 复制代码
vim /opt/compose_nginx_tomcat/docker-compose.yml
version: '3'
services:
  # Nginx服务(反向代理)
  nginx:
    image: nginx:latest  # 直接使用官方镜像(也可通过build构建)
    build:
      context: ./nginx   # 若需自定义Nginx配置,指定构建上下文
    ports:
      - "8081:80"  # 宿主机8081端口映射到Nginx 80端口
    volumes:
      - ./wwwroot:/usr/share/nginx/html  # 静态资源挂载
      - ./nginx/nginx.conf:/etc/nginx/conf.d/default.conf  # 反向代理配置挂载
    networks:
      - app_network  # 加入自定义网络
    depends_on:
      - tomcat  # 确保Tomcat先启动

  # Tomcat服务(应用处理)
  tomcat:
    build:
      context: ./tomcat  # Tomcat自定义构建上下文(含Dockerfile和WAR包)
      dockerfile: Dockerfile
    ports:
      - "8080:8080"  # 宿主机8080端口映射到Tomcat 8080端口
    networks:
      - app_network  # 与Nginx在同一网络,实现通信
    environment:
      # 优化Java性能(避免随机数生成阻塞)
      - JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom

# 定义自定义网络(bridge模式,两服务通过此网络通信)
networks:
  app_network:
    driver: bridge
  • depends_on 确保 Nginx 服务启动时,Tomcat 服务已启动并运行。
  • networks 部分将两个服务连接到同一个 Docker 网络 app_network,保证它们之间可以相互通信。

1.4.4 启动Nginx+Tomcat服务

bash 复制代码
# 1. 进入项目目录
cd /opt/compose_nginx_tomcat/

# 2. 后台启动 Nginx 和 Tomcat 服务
docker-compose up -d

# 3. 查看服务日志(确认无报错)
docker-compose logs -f

# 4. 验证联动效果
# 浏览器访问 Nginx 端口(8081),请求会自动转发到 Tomcat
# http://192.168.10.14:8081

启动成功后,浏览器访问http://宿主机IP:8081,Nginx会自动将请求转发到Tomcat,显示Tomcat默认页面或自定义Web应用。

二、Docker-Harbor私有仓库部署与管理

Docker官方Registry功能简陋(无UI、无权限控制),而Harbor是VMware开源的企业级私有镜像仓库,支持图形化管理、角色权限、镜像扫描、跨实例复制等功能,满足企业级镜像管理需求。

2.1 搭建基础 Docker Registry 私有仓库

Docker Registry 是 Harbor 的核心依赖,先搭建基础的 Registry 仓库,理解私有仓库的基本工作流程。

2.1.1 下载Registry镜像

Registry 镜像由 Docker 官方提供,直接通过 docker pull 下载:

bash 复制代码
docker pull registry  # 拉取最新版Registry镜像

2.1.2 配置Docker守护进程(支持不安全仓库)

Docker默认通过HTTPS与仓库交互,基础Registry默认用HTTP,需配置Docker支持"不安全仓库":

bash 复制代码
# 编辑Docker配置文件
vim /etc/docker/daemon.json

# 添加以下内容(替换为你的宿主机IP)
{
  "insecure-registries": ["192.168.10.14:5000"],  # 允许HTTP访问的私有仓库地址
  "registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"]  # 阿里云镜像加速器(可选)
}

# 重启Docker服务使配置生效
systemctl daemon-reload
systemctl restart docker.service

2.1.3 运行Registry容器(持久化存储)

bash 复制代码
docker run -itd \
  -v /data/registry:/var/lib/registry \  # 挂载宿主机目录,持久化镜像数据
  -p 5000:5000 \                        # 宿主机5000端口映射到容器5000端口
  --restart=always \                    # 容器退出后自动重启
  --name registry \                     # 容器名
  registry:latest                       # 使用的镜像

docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest

2.1.4 Docker容器重启策略补充

always外,Docker支持多种重启策略,适用于不同场景:

  • no:默认策略,容器退出后不重启。
  • on-failure:仅当容器非正常退出(退出码≠0)时重启。
  • on-failure:3:非正常退出时重启,最多重启3次。
  • always:容器退出时总是自动重启。
  • unless-stopped:容器退出后总是重启,除非Docker服务停止时容器已停止。

2.1.5 镜像标签、上传与下载测试

步骤 1:为本地镜像打标签

上传镜像到私有仓库前,需为镜像打上"私有仓库地址+镜像名+标签"的格式,规则为:私有仓库地址/镜像名:标签

bash 复制代码
# 示例:为本地 centos:7 镜像打标签(替换为你的私有仓库 IP)
docker tag centos:7 192.168.10.14:5000/centos:v1
步骤 2:上传镜像到私有仓库
bash 复制代码
docker push 192.168.10.14:5000/centos:v1

如果这是第一次上传该镜像,Docker 会先从本地计算差异,然后推送镜像层到私有仓库。

步骤 3:查看私有仓库中的镜像

通过 curl 请求 Registry API,查看仓库中的所有镜像:

bash 复制代码
# 列出所有镜像
curl http://192.168.10.14:5000/v2/_catalog

# 输出示例(表示仓库中有 centos 镜像)
{"repositories":["centos"]}
步骤 4:查看镜像的所有标签
bash 复制代码
# 列出 centos 镜像的所有标签
curl http://192.168.10.14:5000/v2/centos/tags/list

# 输出示例(表示 centos 镜像有 v1 标签)
{"name":"centos","tags":["v1"]}
步骤 5:从私有仓库拉取镜像
bash 复制代码
# 1. 删除本地已有的 centos:7 镜像(避免冲突)
docker rmi -f centos:7 192.168.10.14:5000/centos:v1

# 2. 从私有仓库拉取镜像
docker pull 192.168.10.14:5000/centos:v1

# 3. 验证拉取结果
docker images | grep centos

2.2 Harbor简介

2.2.1 什么是Harbor

Harbor 是由 VMware 开源的企业级 Docker 镜像私有仓库,基于 Docker Registry 扩展,解决了 Registry 原生功能不足的问题(如无权限控制、无图形界面、无镜像扫描)。

Harbor 所有组件均以 Docker 容器形式运行,通过 Docker Compose 实现一键部署,支持多租户、多项目、镜像复制等企业级特性。

2.2.2 Harbor核心特性

  • 图形化管理界面:通过 Web 界面可视化管理镜像、项目、用户,无需记忆命令行。
  • 基于角色的访问控制(RBAC):支持创建管理员、开发人员、访客等角色,精细化控制镜像的读写权限。
  • LDAP/AD 集成:可与企业现有 LDAP 或 Active Directory 系统集成,实现统一用户认证。
  • 镜像复制:支持跨数据中心的镜像同步(如将北京 Harbor 的镜像复制到上海 Harbor),保障镜像高可用。
  • 安全扫描:集成 Clair 工具,自动扫描镜像中的漏洞,并生成扫描报告。
  • 审计日志:记录所有用户的操作(如镜像上传、删除、权限变更),便于合规审计和问题排查。
  • 多项目支持:按业务线创建独立项目,实现镜像的隔离管理(如"电商项目""支付项目"分别对应独立镜像项目)。

2.2.3 Harbor架构(六大核心组件)

Harbor架构清晰,各组件分工明确,通过Docker Compose协同工作:

  1. Proxy(反向代理):基于Nginx实现,转发客户端请求到后端Registry、UI等服务。
  2. Registry(镜像存储):核心存储组件,负责存储镜像,支持基于Token的权限验证。
  3. Core Services(核心服务)
    • UI(harbor-ui):图形化管理界面,提供镜像与用户管理功能。
    • Token服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。
    • Webhook:监听Registry镜像状态变化,同步到UI并触发通知。
  4. Database(数据库):存储Harbor配置、用户信息、镜像元数据等。
  5. Job Services(作业服务):处理镜像复制、清理等异步任务。
  6. Log Collector(日志收集):收集所有组件日志,统一存储与查询。

注意:Harbor 启动后会生成 7 个容器(通过 docker-compose ps 查看),除上述 6 个组件外,还包含 harbor-adminserver(配置管理中心,负责处理 UI 组件的配置请求)。

2.2.4 Harbor数据流向

  1. 客户端发起请求 :用户通过Docker客户端(docker push/pull)或浏览器访问Harbor。
  2. Proxy转发请求:Nginx将请求转发到对应组件(如UI请求转发到harbor-ui,镜像请求转发到Registry)。
  3. 权限验证:Registry收到请求后,若未携带Token,会重定向到Token服务获取合法Token。
  4. 核心服务处理:UI服务处理用户操作,Job services处理异步任务(如镜像复制)。
  5. 数据存储:镜像数据存储到Registry,配置与元数据存储到Database。
  6. 日志收集:所有组件日志实时发送到Log Collector,便于后续审计。
  7. 同步到远程 Harbor 实例:可能用于在多个 Harbor 实例之间同步镜像,保证镜像的高可用和分布式存储。(堡垒机)

2.3 部署Harbor服务

2.3.1 安装Docker Compose(前置依赖)

Harbor通过Docker Compose编排,需先安装Compose(参考1.2节):

bash 复制代码
# 下载 Compose 二进制文件
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

# 赋予执行权限
chmod +x /usr/local/bin/docker-compose

# 验证安装
docker-compose --version

2.3.2 下载Harbor离线安装包

Harbor提供离线安装包(含所有依赖镜像),适合无外网环境:

bash 复制代码
# 下载Harbor 2.4.0离线包(可从官网选择最新版本)
wget https://github.com/goharbor/harbor/releases/download/v2.4.0/harbor-offline-installer-v2.4.0.tgz

# 解压到 /usr/local/ 目录(推荐安装路径)
tar zxvf harbor-offline-installer-v2.4.0.tgz -C /usr/local/

2.3.3 修改Harbor配置文件

Harbor核心配置文件为harbor.cfg,需修改关键参数(如服务地址、管理员密码):

bash 复制代码
# 进入Harbor目录
cd /usr/local/harbor/

# 复制默认配置文件
cp harbor.yml harbor.yml.bak

# 编辑配置文件
vim harbor.yml

# 修改以下关键参数(根据实际环境调整)
--5行--
hostname: 192.168.10.14  # Harbor服务IP/域名(不可用localhost或127.0.0.1)
--27行--
harbor_admin_password: Harbor12345  # 管理员初始密码(默认admin/Harbor12345)
http:
  port: 80  # HTTP端口(默认80,可修改)
配置文件参数说明

Harbor配置参数分为"必需参数"和"可选参数":

1、必需参数:这些参数需要在配置文件 Harbor.yml 中设置。如果用户更新它们 ./prepare + 重启 Harbor, 参数将生效。具体参数如下:
  • hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.10.14 或 hub.kgc.cn。不要使用 localhost 或 127.0.0.1 为主机名。

  • ui_url_protocol:(http 或 https,默认为 http)用于访问 UI 和令牌/通知服务的协议。如果公证处于启用状态,则此参数必须为 https。

  • max_job_workers:镜像复制作业线程。

  • db_password:用于db_auth 的MySQL数据库root 用户的密码。

  • customize_crt:该属性可设置为打开或关闭,默认打开。打开此属性时,准备脚本创建私钥和根证书,用于生成/验证注册表令牌。当由外部来源提供密钥和根证书时,将此属性设置为 off。

  • ssl_cert:SSL 证书的路径,仅当协议设置为 https 时才应用。

  • secretkey_path:用于在复制策略中加密或解密远程 register 密码的密钥路径。

2、可选参数:这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。

可选参数在 Harbor.yml 中设置后,仅在 "首次启动 Harbor 且未通过 Web UI 修改过该参数" 时生效;一旦通过 Web UI 修改过,后续对 Harbor.yml 中该参数的更新将被忽略

注意:如果选择通过 UI 设置这些参数,请确保在启动 Harbor 后立即执行此操作。具体来说,必须在注册或在 Harbor 中创建任何新用户之前设置所需的 auth_mode。当系统中有用户时(除了默认的 admin 用户), auth_mode 不能被修改。 具体参数如下:

  • Email:Harbor 需要该参数才能向用户发送"密码重置"电子邮件,并且只有在需要该功能时才启用。请注意,在默认情况下 SSL 连接时没有启用。如果 SMTP 服务器需要 SSL,但不支持 STARTTLS,那么应该通过设置启用 SSL email_ssl = TRUE。

  • harbor_admin_password:管理员的初始密码,只在 Harbor 第一次启动时生效。之后, 此设置将被忽略,并且应在 UI 中设置管理员的密码。请注意,默认的用户名/密码是admin/Harbor12345。

  • auth_mode:使用的认证类型,默认情况下,它是 db_auth,即凭据存储在数据库中。对于LDAP身份验证,请将其设置为 ldap_auth。

  • self_registration:启用/禁用用户注册功能。禁用时,新用户只能由 Admin 用户创建,只有管理员用户可以在 Harbor 中创建新用户。注意:当 auth_mode 设置为 ldap_auth 时,自注册功能将始终处于禁用状态,并且该标志被忽略。

  • Token_expiration:由令牌服务创建的令牌的到期时间(分钟),默认为 30 分钟。

  • project_creation_restriction:用于控制哪些用户有权创建项目的标志。默认情况下,每个人都可以创建一个项目。 如果将其值设置为"adminonly",那么只有 admin 可以创建项目。

  • verify_remote_cert:打开或关闭,默认打开。此标志决定了当Harbor与远程 register 实例通信时是否验证 SSL/TLS 证书。 将此属性设置为 off 将绕过 SSL/TLS 验证,这在远程实例具有自签名或不可信证书时经常使用。

2.3.4 启动Harbor服务

bash 复制代码
#在配置好了 harbor.cfg 之后,执行 ./prepare 命令,为 harbor 启动的容器生成一些必要的文件(环境)
#再执行命令 ./install.sh 以 pull 镜像并启动容器

# 1. 进入 Harbor 安装目录
cd /usr/local/harbor/

# 2. 生成 Harbor 启动所需的配置文件和证书(根据 harbor.yml 生成)
./prepare

# 3. 安装并启动 Harbor 所有组件(自动拉取依赖镜像)
./install.sh
常见启动错误解决:

若启动时报 iptables: No chain/target/match by that name 错误,需重启防火墙服务:

bash 复制代码
systemctl restart firewalld.service
# 重新启动 Harbor
docker-compose up -d

2.3.5 查看Harbor启动状态

bash 复制代码
# 进入Harbor目录(需在docker-compose.yml所在目录执行)
cd /usr/local/harbor/

# 查看所有组件容器状态(均为Up表示启动成功)
docker-compose ps

若所有容器的 StateUp,说明 Harbor 启动成功。

2.3.6 图形化界面创建项目

步骤 1:登录 Harbor Web 界面

打开浏览器,输入 Harbor 服务器 IP(如 http://192.168.10.14),使用默认账号密码登录:

  • 用户名:admin
  • 密码:Harbor12345(或你在 harbor.yml 中设置的密码)
步骤 2:创建项目
  1. 登录后点击页面右上角"+ 项目"按钮;
  2. 填写项目名称(如 myproject-dev),项目级别选择"私有"(仅授权用户可访问);
  3. 点击"确定",完成项目创建。
  4. 此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在监听80端口。
步骤 3:本地测试镜像上传(Harbor 服务器本地)
bash 复制代码
# 1. 登录 Harbor(使用 admin 账号)
docker login [-u admin -p Harbor12345] http://127.0.0.1  # 本地登录可使用 127.0.0.1,无需配置 insecure-registries

# 2. 下载测试镜像(如 nginx)
docker pull nginx

# 3. 为镜像打标签(格式:Harbor IP/项目名/镜像名:标签)
docker tag nginx:latest 127.0.0.1/myproject-dev/nginx:v1

# 4. 上传镜像到 Harbor
docker push 127.0.0.1/myproject-dev/nginx:v1

# 5. Web 界面验证:进入 myproject-dev 项目,可看到上传的 nginx:v1 镜像


2.4 客户端上传(下载)镜像到Harbor

Harbor 服务器本地可正常上传镜像,但其他客户端(如开发机)上传时会因"HTTPS 验证"报错,需配置客户端 Docker 服务。

2.4.1 配置Docker客户端

为了让 Docker 客户端能够访问私有仓库,客户端的配置文件 需要添加 --insecure-registry 参数:

bash 复制代码
//解决办法:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。

# 1. 编辑Docker服务配置文件
vim /usr/lib/systemd/system/docker.service

# 2. 修改ExecStart字段,添加--insecure-registry(替换为Harbor服务器IP)
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.10.14 --containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.10.14

# 3. 重启Docker服务
systemctl daemon-reload
systemctl restart docker

2.4.2 客户端上传(下载)镜像操作

bash 复制代码
# 1. 登录Harbor
docker login -u admin -p Harbor12345 http://192.168.10.14

# 2. 下载镜像进行测试
docker pull 192.168.10.14/myproject-dev/nginx:v1  

# 3. 上传镜像进行测试
docker pull cirros
docker tag cirros:latest 192.168.10.14/myproject/cirros:v1
docker push 192.168.10.14/myproject/cirros:v1

# 5. 验证:刷新Harbor UI,查看myproject项目中的镜像



2.5 维护管理Harbor

2.5.1 通过 Harbor Web 创建项目

在 Harbor 仓库中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。

单击"+项目",填写项目名称,项目级别若设置为"私有",则不勾选。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与 Docker Hub 一致。

2.5.2 创建用户与分配权限

步骤 1:创建用户
  1. 登录 Harbor Web 界面,点击左侧菜单栏"系统管理"->"用户管理";
  2. 点击"+ 用户"按钮,填写用户信息:
    • 用户名:zhangsan
    • 邮箱:zhangsan@example.com
    • 密码:Abc123456(需符合密码复杂度要求)
    • 角色:默认"普通用户"
  3. 点击"确定",完成用户创建。
步骤 2:为项目分配用户权限
  1. 进入目标项目(如 myproject-dev),点击"成员"->"+ 成员";
  2. 搜索并选择刚创建的用户 zhangsan,分配角色为"开发人员"(可上传/下载镜像);
  3. 点击"确定",完成权限分配。
步骤 3:客户端使用普通用户操作镜像
bash 复制代码
# 1. 退出当前登录(若已登录 admin 账号)
docker logout 192.168.10.14

# 2. 使用普通用户登录
docker login -u zhangsan -p Abc123456 http://192.168.10.14

# 3. 下载镜像(验证读权限)
docker pull 192.168.10.14/myproject-dev/cirros:v1

# 4. 上传镜像(验证写权限)
docker tag cirros:latest 192.168.10.14/myproject-dev/cirros:v2
docker push 192.168.10.14/myproject-dev/cirros:v2


2.5.3 查看操作日志

Harbor 记录所有用户的操作日志,便于审计和问题排查:

  1. 登录 Web 界面,点击左侧菜单栏"系统管理"->"日志";
  2. 可按"时间范围""操作类型""用户名"筛选日志,查看镜像上传、删除、用户创建等操作记录。

2.5.4 修改Harbor配置(harbor.yml)

要更改 Harbor的配置文件中的可选参数时,请先停止现有的 Harbor实例并更新 Harbor.yml;

然后运行 prepare 脚本来填充配置; 最后重新创建并启动 Harbor 的实例。(避免直接修改配置文件导致服务异常):

bash 复制代码
# 1. 停止Harbor服务
cd /usr/local/harbor/
docker-compose down -v

# 2. 修改配置文件(仅可选参数可修改,必需参数修改需谨慎)
vim harbor.yml

# 3. 重新生成配置
./prepare

# 4. 重启Harbor
docker-compose up -d

# 注意:若启动报错"iptables No chain/target",重启防火墙解决
systemctl restart firewalld.service
docker-compose up -d

2.5.5 Harbor数据迁移(保留镜像与配置)

Harbor的镜像数据存储在/data/registry,数据库数据存储在/data/database,迁移步骤如下:

步骤 1:停止源服务器 Harbor 服务
bash 复制代码
cd /usr/local/harbor/
docker-compose down -v
步骤 2:打包源服务器数据
bash 复制代码
# 打包镜像数据
cd /data/registry
tar zcvf harbor-registry.tar.gz ./*

# 打包数据库数据(可选,若需保留用户与项目配置)
cd /data/database
tar zcvf harbor-db.tar.gz ./*
步骤 3:将数据包传输到目标服务器
bash 复制代码
# 使用 scp 传输(替换为目标服务器 IP 和路径)
scp harbor-registry.tar.gz root@192.168.10.15:/opt/
scp harbor-db.tar.gz root@192.168.10.15:/opt/
步骤 4:目标服务器恢复数据
bash 复制代码
# 1. 在目标服务器部署 Harbor(参考 2.3 节,确保版本与源服务器一致)
# 2. 停止目标服务器 Harbor 服务
cd /usr/local/harbor/
docker-compose down -v

# 3. 删除镜像数据与数据库
rm -rf /data/registry/*
rm -rf /data/database/*

# 4. 解压数据包到对应目录
tar zxvf harbor-registry.tar.gz -C /data/registry/
tar zxvf harbor-db.tar.gz -C /data/database/
# 重新初始化并启动
./prepare
./install.sh

总结

本文围绕Docker生态中的两大核心工具展开:

  1. Docker Compose:通过YAML配置文件实现多容器编排,解决了"多服务联动"与"一键部署"问题,文中以Nginx+Tomcat为例,详细讲解了环境搭建、配置编写与服务启动流程,读者可基于此扩展到更多服务(如MySQL、Redis)的编排。
  2. Harbor私有仓库:作为企业级镜像管理方案,弥补了官方Registry的功能缺陷,文中从基础Registry入门,到Harbor的部署、镜像上传、用户权限管理,再到数据迁移与维护,覆盖了企业实际使用中的核心场景。

掌握这两个工具后,可大幅提升Docker在企业中的落地效率------Compose简化了应用部署,Harbor保障了镜像的安全存储与合规管理。建议读者结合实际需求多做实操,逐步优化配置(如Harbor启用HTTPS、Compose优化服务依赖),构建更稳定、高效的Docker应用环境。

相关推荐
落日漫游3 小时前
DockerCE与cri-docker核心区别解析
运维·docker·kubernetes
YongCheng_Liang3 小时前
Linux 基础命令的 7 大核心模块
linux·运维·服务器
Light603 小时前
领码方案|微服务与SOA的世纪对话(3):方法论新生——DDD、服务网格与AI Ops的融合之道
运维·人工智能·微服务·ddd·soa·服务网格·ai ops
努力搬砖的咸鱼3 小时前
Docker 三剑客:镜像、容器、仓库
docker·云原生·容器
Madison-No75 小时前
【Linux】基础开发工具---yum / apt
linux·运维·服务器
YongCheng_Liang5 小时前
网络工程师笔记10-BGP协议
运维·网络·笔记
東雪蓮☆6 小时前
LNMP 环境部署 WordPress
linux·运维·mysql·nginx·php
薰衣草23337 小时前
linux-1
linux·运维·服务器
Lenyiin7 小时前
《 Linux 点滴漫谈: 三 》Linux 的骨架:文件系统与目录结构的完整图谱
linux·运维·服务器·lenyiin