文章目录
- 前言
- [一、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语法简洁但严格,需重点注意以下规则:
-
大小写敏感 :
image
与Image
代表不同字段,需严格区分。 -
缩进规则 :使用 空格 缩进表示层级关系,不支持 TAB 键,推荐 2 个空格作为一个缩进层级。
-
列表(序列) :用
-
(短横线)开头表示列表项,例如:yamllanguages: - Java - Golang - Python
-
字典(映射) :用
:
(冒号)连接键值对,冒号后必须加一个空格,例如:yamlwebsites: 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.yml
中services
下的每个服务需配置核心字段,下表整理了高频使用字段及说明:
Docker Compose 常见字段说明
字段 | 描述 |
---|---|
build | 指定 Dockerfile 文件名,需在 build 的子级标签中使用 dockerfile 标签指定文件名。 |
dockerfile | 构建镜像时使用的 Dockerfile 路径。 |
context | 构建上下文路径,可以是 Dockerfile 的本地路径或 Git 仓库 URL。 |
image | 指定使用的镜像名称。 |
command | 覆盖容器启动后默认执行的命令。 |
container_name | 指定容器名称,由于名称唯一,指定后无法使用 scale 扩展容器数量。 |
deploy | 配置部署和运行服务的相关选项,仅适用于 Swarm 模式。 |
environment | 设置容器内的环境变量。 |
networks | 将容器连接到顶级 networks 中定义的网络。 |
network_mode | 设置容器的网络模式,如 host 、bridge 等。 |
ports | 暴露容器端口,格式与 -p 相同,但端口号不能低于 60。 |
volumes | 挂载宿主机目录或命名卷到容器,命名卷需在顶级 volumes 中定义。 |
volumes_from | 从其他服务或容器挂载卷,支持 :ro (只读)和 :rw (读写)选项,仅限版本 '2' 使用。 |
hostname | 设置容器的主机名。 |
sysctls | 在容器内设置内核参数。 |
links | 连接到其他容器,格式为 服务名称[:服务别名] 。 |
privileged | 赋予容器 root 权限(不安全),可选 true 或 false 。 |
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 编写注意事项
- 路径问题 :在
docker-compose.yml
文件中,context
和volumes
路径都是相对路径,相对于docker-compose.yml
文件所在的目录,避免使用绝对路径(降低可移植性)。 - 缩进规范 :
services
下的每个服务配置需缩进2个空格,服务内的字段(如build
、ports
)需再缩进2个空格,避免因缩进错误导致解析失败。 - 依赖顺序 :
depends_on
仅保证启动顺序,不保证依赖服务"完全就绪"(如数据库启动后需等待初始化完成),复杂场景需用脚本判断服务可用性。 - 端口冲突 :
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.yml
的services
下定义),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协同工作:
- Proxy(反向代理):基于Nginx实现,转发客户端请求到后端Registry、UI等服务。
- Registry(镜像存储):核心存储组件,负责存储镜像,支持基于Token的权限验证。
- Core Services(核心服务) :
- UI(harbor-ui):图形化管理界面,提供镜像与用户管理功能。
- Token服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。
- Webhook:监听Registry镜像状态变化,同步到UI并触发通知。
- Database(数据库):存储Harbor配置、用户信息、镜像元数据等。
- Job Services(作业服务):处理镜像复制、清理等异步任务。
- Log Collector(日志收集):收集所有组件日志,统一存储与查询。
注意:Harbor 启动后会生成 7 个容器(通过
docker-compose ps
查看),除上述 6 个组件外,还包含harbor-adminserver
(配置管理中心,负责处理 UI 组件的配置请求)。
2.2.4 Harbor数据流向

- 客户端发起请求 :用户通过Docker客户端(
docker push/pull
)或浏览器访问Harbor。 - Proxy转发请求:Nginx将请求转发到对应组件(如UI请求转发到harbor-ui,镜像请求转发到Registry)。
- 权限验证:Registry收到请求后,若未携带Token,会重定向到Token服务获取合法Token。
- 核心服务处理:UI服务处理用户操作,Job services处理异步任务(如镜像复制)。
- 数据存储:镜像数据存储到Registry,配置与元数据存储到Database。
- 日志收集:所有组件日志实时发送到Log Collector,便于后续审计。
- 同步到远程 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
若所有容器的 State
为 Up
,说明 Harbor 启动成功。
2.3.6 图形化界面创建项目
步骤 1:登录 Harbor Web 界面
打开浏览器,输入 Harbor 服务器 IP(如 http://192.168.10.14
),使用默认账号密码登录:
- 用户名:
admin
- 密码:
Harbor12345
(或你在harbor.yml
中设置的密码)
步骤 2:创建项目
- 登录后点击页面右上角"+ 项目"按钮;
- 填写项目名称(如
myproject-dev
),项目级别选择"私有"(仅授权用户可访问); - 点击"确定",完成项目创建。
- 此时可使用 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:创建用户
- 登录 Harbor Web 界面,点击左侧菜单栏"系统管理"->"用户管理";
- 点击"+ 用户"按钮,填写用户信息:
- 用户名:
zhangsan
- 邮箱:
zhangsan@example.com
- 密码:
Abc123456
(需符合密码复杂度要求) - 角色:默认"普通用户"
- 用户名:
- 点击"确定",完成用户创建。
步骤 2:为项目分配用户权限
- 进入目标项目(如
myproject-dev
),点击"成员"->"+ 成员"; - 搜索并选择刚创建的用户
zhangsan
,分配角色为"开发人员"(可上传/下载镜像); - 点击"确定",完成权限分配。
步骤 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 记录所有用户的操作日志,便于审计和问题排查:
- 登录 Web 界面,点击左侧菜单栏"系统管理"->"日志";
- 可按"时间范围""操作类型""用户名"筛选日志,查看镜像上传、删除、用户创建等操作记录。

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生态中的两大核心工具展开:
- Docker Compose:通过YAML配置文件实现多容器编排,解决了"多服务联动"与"一键部署"问题,文中以Nginx+Tomcat为例,详细讲解了环境搭建、配置编写与服务启动流程,读者可基于此扩展到更多服务(如MySQL、Redis)的编排。
- Harbor私有仓库:作为企业级镜像管理方案,弥补了官方Registry的功能缺陷,文中从基础Registry入门,到Harbor的部署、镜像上传、用户权限管理,再到数据迁移与维护,覆盖了企业实际使用中的核心场景。
掌握这两个工具后,可大幅提升Docker在企业中的落地效率------Compose简化了应用部署,Harbor保障了镜像的安全存储与合规管理。建议读者结合实际需求多做实操,逐步优化配置(如Harbor启用HTTPS、Compose优化服务依赖),构建更稳定、高效的Docker应用环境。