Docker详解(三)docker-compose和harbor私有仓库搭建
通过 Docker Compose,我们可以在一个 YAML 配置文件中定义多个服务,并实现容器之间的联动,简化了应用的部署和管理。Docker - Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。Docker - Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)以及容器(container)。
文章目录
一、Docker Compose 编排
Docker Compose的本质: 一个仅能编排单台机器的多个容器的编排工具
1.1 简介
通过 Docker Compose,我们可以在一个 YAML 配置文件中定义多个服务,并实现容器之间的联动,简化了应用的部署和管理。
Docker - Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。
Docker - Compose 将所管理的容器分为三层,分别是工程(project)、服务(service)以及容器(container)。Docker - Compose 运行目录下的所有文件(docker - compose.yml、extends 文件或环境变量文件等)组成一个工程,若无特殊指定工程名即为当前目录名。一个工程当中可包含多个服务,每个服务中定义了容器运行的镜像、参数、依赖。一个服务当中可包括多个容器实例,Docker - Compose 并没有解决负载均衡的问题,因此需要借助其它工具实现服务发现及负载均衡,比如 Consul。
Docker - Compose 的工程配置文件默认为 docker - compose.yml,可通过环境变量 COMPOSE_FILE 或 - f 参数自定义配置文件,其定义了多个有依赖关系的服务及每个服务运行的容器。
使用一个 Dockerfile 模板文件,可以让用户很方便地定义一个单独的应用容器。在工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等(如 LNMP 架构)。
Compose 允许用户通过一个单独的 docker - compose.yml 模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project)。
Docker - Compose 项目由 Python 编写,调用 Docker 服务提供的 API 来对容器进行管理。因此,只要所操作的平台支持 Docker API,就可以在其上利用 Compose 来进行编排管理。
1.2 项目结构
在 Web 应用中,常常需要将前端的请求通过反向代理转发到后端应用服务器。在这里,我们将使用 Docker Compose 来编排 Nginx 和 Tomcat 两个服务。Nginx 将作为前端的反向代理服务器,接收客户端请求并将其转发到后端的 Tomcat 容器。Tomcat 则负责处理 Web 应用的请求。
1.2.1 Docker 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
# 新的版本下载地址
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
1.3 YAML 文件格式及编写注意事项
YAML(YAML Ain’t Markup Language)是一种简洁的数据序列化格式,常用于配置文件。它比 JSON 更加简洁易读,并且支持更复杂的数据结构。使用 YAML 编写 Docker Compose 配置文件时,有几个注意事项:
1.3.1 YAML 基本语法
- 大小写敏感:YAML 是大小写敏感的,所以一定要注意区分大小写。
- 缩进:YAML 使用空格进行缩进,不支持 TAB 缩进。通常推荐使用两个空格作为一个层级的缩进。
- 列表:列表项使用
-(短横线)表示。 - 字典:字典使用
:(冒号)连接键值对,冒号后面需要加一个空格。 - 注释:使用
#来添加注释。 - 字符串:如果字符串包含特殊字符,可以使用单引号
'或双引号"来包裹。
数据结构示例:
# 对象映射: 键值对的字典
animal: pets
# 序列数组: 一组按次序排列的列表
- Cat
- Dog
- Goldfish
# 等同于 ["Cat", "Dog", "Goldfish"]
# 布尔值
debug: true
debug: false
# 示例:
# yaml 格式
languages: # 序列的映射
- Java
- Golang
- Python
websites: # 映射的映射
cpu: 2
memory: 1024M
swap: 2048M
disk: 60G
# 键:{值}
# 对应的 Json 格式
{
"languages": [
"Java",
"Golang",
"Python"
],
"resources": {
"cpu": "2",
"memory": "1024M",
"swap": "2048M",
"disk": "60G"
}
}
Baidu:
- www.baidu.com
- ftp.baidu.com
wangyi: www.163.com
tengxun: www.qq.com
school: bei da
kgc: # 两个空格缩进
yunjisuan:
- dingding
- benet
- wanglei
- zhoubo
- dalao
dashuju:
- lijia
- chenming
1.3.2 Docker Compose 配置常用字段
| 字段 | 描述 |
|---|---|
| build | 指定 Dockerfile 文件名,要指定 Dockerfile 文件需要在 build 标签的子级标签中使用 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’ 支持(不常用,因为在新版本的 Compose 中,更推荐使用 volumes 配合命名卷的方式进行数据挂载,这种方式更灵活且易于管理) |
| hostname | 容器主机名 |
| sysctls | 在容器内设置内核参数 |
| links | 连接到另外一个容器,格式为“服务名称[:服务别名]”(不常用,在现代 Docker 网络中,同一网络内的服务可以通过服务名直接通信,无需使用 links) |
| privileged | 用来给容器 root 权限,注意是不安全的,值为 true 或 false,提权用的,一般在 mysql 的环境中用 |
| restart | 设置重启策略: - no:默认策略,在容器退出时不重启容器。 - on - failure:在容器非正常退出时(退出状态非 0),才会重启容器。 - on - failure:3:在容器非正常退出时重启容器,最多重启 3 次。 - always:在容器退出时总是重启容器。 - unless - stopped:除非容器被手动停止(docker stop 或 docker compose stop),否则总是重启容器。 |
| depends_on | 在使用 Compose 时,最大的好处就是少打启动命令,但一般项目容器启动的顺序是有要求的,如果直接从上到下启动容器,可能会因为容器依赖问题而启动失败。例如在没启动数据库容器的时候启动应用容器,应用容器会因为找不到数据库而退出。depends_on 标签用于解决容器的依赖、启动先后的问题。 |
1.3.3 Docker Compose 常用命令
| 字段 | 描述 |
|---|---|
| build | 重新构建服务 |
| ps | 列出容器 |
| up | 创建和启动容器 |
| exec | 在容器里面执行命令 |
| scale | 指定一个服务容器启动数量 |
| top | 显示容器进程 |
| logs | 查看容器输出 |
| down | 删除容器、网络、数据卷和镜像 |
| stop/start/restart | 停止/启动/重启服务 |
1.3.4 Docker Compose 文件结构
/opt/compose_nginx_tomcat/
├── docker-compose.yml # Docker Compose 配置文件
├── nginx
│ ├── Dockerfile # Nginx 镜像的 Dockerfile
│ └── nginx.conf # Nginx 配置文件
├── tomcat
│ ├── Dockerfile # Tomcat 镜像的 Dockerfile
│ └── webapps
│ └── ROOT.war # Tomcat 应用的 WAR 包
└── wwwroot
└── index.html # 静态文件,Nginx 显示的页面
1.3.5 YAML 示例
1.3.5.1 准备依赖文件
mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.20.2.tar.gz ./
vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx
vim Dockerfile
# 基于基础镜像
FROM centos:7
# 用户信息
MAINTAINER this is nginx image <hmj>
# 添加环境包
RUN rm -rf /etc/yum.repos.d/*
ADD CentOS-Base.repo /etc/yum.repos.d/
RUN yum clean all && \
yum makecache && \
yum -y install pcre-devel zlib-devel gcc gcc-c++ make && \
useradd -M -s /sbin/nologin 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
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;" ]
echo "<h1>this is test web</h1>" > /opt/compose_nginx/wwwroot/index.html
1.3.5.2 编写配置文件 docker-compose.yml
vim /opt/compose_nginx/docker-compose.yml
version: '3' # 1 已被废弃,2 仅支持单机编排,3 向下兼容支持单机和多机
services:
nginx:
container_name: web1
hostname: nginx
build:
context: ./nginx
dockerfile: Dockerfile
ports:
- 1216:80 # 冒号隔开有空格是键值对,直接隔开是端口映射
- 1217:443
networks:
lnmp: # - lnmp 会自动分配 IP 地址
ipv4_address: 172.18.0.10 # 指定 IP 地址
volumes:
- ./wwwroot:/usr/local/nginx/html
networks:
lnmp:
driver: bridge # 自定义网络的使用方式
ipam:
config:
- subnet: 172.18.0.0/16
执行以下命令启动服务:
cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d
命令说明:
-f, --file FILE:使用特定的 compose 模板文件,默认为 docker-compose.yml
-p, --project-name NAME:指定项目名称,默认使用目录名称
-d:在后台运行
查看容器状态:
docker ps -a
# 输出示例
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b48dceee248f compose_nginx_nginx "/run.sh" About a minute ago Up About a minute 0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp compose_nginx_nginx_1
cd /opt/compose_nginx/
docker-compose ps # 必须在 docker-compose.yml 所在目录执行此命令
之后可以通过浏览器访问:http://192.168.10.23:1216 查看效果。
1.3.6 编写注意事项
- 文件路径:在
docker-compose.yml文件中,context和volumes路径都是相对路径,相对于docker-compose.yml文件所在的目录。 - 字段区分:YAML 格式中,
services下定义的每个服务都会有自己的配置项,例如image、build、ports等。确保每个字段的位置和缩进正确。 - 服务间的依赖关系:例如,
depends_on可以控制服务启动的顺序,确保依赖的服务先启动。
1.4 准备 Nginx 配置
在 nginx/nginx.conf 中,配置 Nginx 作为反向代理,转发请求到 Tomcat 服务:
server {
listen 80;
server_name localhost;
location / {
proxy_pass http://tomcat:8080; # 将请求转发给 Tomcat 服务
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 容器的名称)。- 配置
proxy_set_header是为了确保转发请求时,Nginx 会把客户端的 IP 和请求头传递给后端服务器。
1.5 编写 docker-compose.yml
接下来,我们编写 docker-compose.yml 配置文件,定义 Nginx 和 Tomcat 两个服务。以下是一个完整的示例:
version: '3'
services:
nginx:
container_name: nginx
image: nginx:latest
build:
context: ./nginx
ports:
- "8081:80" # 将宿主机的 8081 端口映射到 Nginx 的 80 端口
volumes:
- ./wwwroot:/usr/share/nginx/html # 映射静态文件目录
networks:
- lnmp
depends_on:
- tomcat # 确保 Tomcat 容器先启动
tomcat:
container_name: tomcat
build:
context: ./tomcat
ports:
- "8080:8080" # 将宿主机的 8080 端口映射到 Tomcat 的 8080 端口
networks:
- app_network
environment:
- JAVA_OPTS=-Djava.security.egd=file:/dev/./urandom
networks:
lnmp:
driver: bridge
depends_on确保 Nginx 服务启动时,Tomcat 服务已启动并运行。networks部分将两个服务连接到同一个 Docker 网络app_network,保证它们之间可以相互通信。
1.6 启动服务
完成以上配置后,可以通过 docker-compose 启动项目:
cd /opt/compose_nginx_tomcat
docker-compose up -d
-d参数表示在后台运行容器。
二、Docker–Harbor 私有仓库部署与管理
2.1 搭建本地私有仓库
2.1.1 下载 registry 镜像
私有镜像仓库的核心是 Docker Registry,我们通过以下命令下载官方的 registry 镜像:
docker pull registry
2.1.2 配置 Docker 守护进程
为了能够与我们搭建的私有仓库进行交互,我们需要配置 Docker 的守护进程,让其支持连接不安全的私有镜像仓库。
编辑 Docker 配置文件 /etc/docker/daemon.json,并添加私有仓库地址:
vim /etc/docker/daemon.json
在该文件中加入如下内容:
{
"insecure-registries": ["192.168.10.127:5000"], # 允许访问的私有仓库地址
"registry-mirrors": ["https://ae3f5qei.mirror.aliyuncs.com"] # 阿里云 Docker 镜像加速器地址
}
修改完后重启 Docker 服务:
systemctl restart docker.service
2.1.3 运行 Registry 容器
通过 Docker 运行一个 registry 容器,指定本地存储路径和端口映射:
docker run -itd -v /data/registry:/var/lib/registry -p 5000:5000 --restart=always --name registry registry:latest
-itd:在容器中启动一个伪终端,进行交互,并让容器在后台运行。-v /data/registry:/var/lib/registry:将宿主机的/data/registry目录挂载到容器内的/var/lib/registry目录,用于存储镜像数据,保证数据的持久化。-p 5000:5000:将宿主机的 5000 端口映射到容器内的 5000 端口,提供访问入口。--restart=always:配置容器在停止后自动重启。--name registry:容器命名为registry。registry:latest:使用官方镜像registry来创建容器。
2.1.4 Docker 容器的重启策略
Docker 支持几种容器重启策略:
no:容器退出时不自动重启。on-failure:仅当容器非正常退出时(即返回错误代码)才重启。on-failure:3:最多重启 3 次,如果容器失败 3 次,则不再重启。always:容器退出时总是自动重启。unless-stopped:容器退出时总是自动重启,除非 Docker 服务停止时容器已经停止。
2.1.5 为镜像打标签
上传镜像到私有仓库前,我们需要给本地镜像打上标签,标签格式为 <私有仓库地址>/<镜像名>:<标签>。
docker tag centos:7 192.168.10.127:5000/centos:v1
其中 centos:7 是本地镜像,192.168.10.23:5000/centos:v1 是我们要推送到私有仓库的镜像标签。
2.1.6 上传镜像到私有仓库
上传镜像到私有仓库的命令是:
docker push 192.168.10.127:5000/centos:v1

如果这是第一次上传该镜像,Docker 会先从本地计算差异,然后推送镜像层到私有仓库。
2.1.7 列出私有仓库的所有镜像
可以通过 curl 请求获取仓库中的所有镜像:
curl http://192.168.10.127:5000/v2/_catalog

这将返回一个 JSON 格式的镜像列表。
2.1.8 获取镜像的所有 Tag
要列出某个镜像的所有版本标签(Tag),可以使用以下命令:
curl http://192.168.10.127:5000/v2/centos/tags/list

返回的结果是该镜像在仓库中的所有标签,如 v1、v2 等。
2.1.9 测试私有仓库下载镜像
如果我们之前已经删除了本地的 CentOS 镜像,可以通过以下命令从私有仓库拉取镜像:
docker rmi -f 8652b9f0cb4c # 删除本地镜像
docker pull 192.168.10.127:5000/centos:v1 # 从私有仓库拉取镜像
2.2 Harbor 简介
2.2.1 什么是 Harbor
Harbor 是一个企业级的 Docker 镜像仓库管理平台,它在 Docker Registry 的基础上进行了扩展,增加了更多功能,使得管理镜像更加方便和安全。Harbor 提供了图形化管理界面、角色访问控制、镜像复制、LDAP 集成等功能。
Harbor 的每个组件都是以 Docker 容器的形式构建的,使用 docker - compose 来对它进行部署。用于部署 Harbor 的 docker - compose 模板位于 harbor/docker - compose.yml。
2.2.2 Harbor 特性
- 图形化管理界面:通过浏览器访问,方便用户管理镜像和权限。
- 基于角色的访问控制:用户可在 Harbor 中创建不同角色并为每个角色分配不同的权限。
- LDAP/AD 集成:支持与 LDAP 或 Active Directory 集成,进行用户认证和权限管理。
- 镜像复制:支持将镜像从一个 Harbor 实例复制到另一个实例,实现跨数据中心的镜像管理。
- 审计日志:记录所有操作的日志,便于审计和排查问题。
- 安全扫描:集成 Clair 进行镜像的安全扫描,自动检测镜像中的漏洞。
2.2.3 Harbor 架构
Harbor 在架构上主要有 Proxy、Registry、Core services、Database(Harbor - db)、Log collector(Harbor - log)、Job services 六个组件。,实际上还有个用户管理员的组件。
Harbor 的核心组件包括:
-
Proxy:反向代理,用于处理客户端请求。0
是一个 nginx 的前端代理,Harbor 的 Registry、UI、Token 服务等组件,都处在 nginx 反向代理后边。该代理将来自浏览器、docker clients 的请求转发到后端不同的服务上。
-
Registry:存储 Docker 镜像的核心组件,支持 Docker 的
push和pull操作。负责储存 Docker 镜像,并处理 Docker push/pull 命令。由于要对用户进行访问控制,即不同用户对 Docker 镜像有不同的读写权限,Registry 会指向一个 Token 服务,强制用户的每次 Docker pull/push 请求都要携带一个合法的 Token,Registry 会通过公钥对 Token 进行解密验证。
认证方式有三种:扩展、令牌、用户密码、ssl(此处原文表述“三种”但列出四种,存在矛盾,正确的 Harbor 认证方式主要包括令牌认证、基本用户名密码认证等,SSL 更多是传输层的安全保障)。
ssl证书认证(双向) -
Core Services:包含 Web 界面、API 和 Webhook 等服务。
1)UI(harbor - ui): 提供图形化界面,帮助用户管理 Registry 上的镜像(image),并对用户进行授权。
2)WebHook:为了及时获取 Registry 上 image 状态变化的情况,在 Registry 上配置 Webhook,把状态变化传递给 UI 模块。 host、post、请求 事件信息 镜像 推 送 删除 复制等勾出来再在日志中展现
3)Token 服务:负责根据用户权限给每个 Docker push/pull 命令签发 Token。Docker 客户端向 Registry 服务发起的请求,如果不包含 Token,会被重定向到 Token 服务,获得 Token 后再重新向 Registry 进行请求。 -
Database:保存 Harbor 的配置和镜像的元数据。
为 core services 提供数据库服务,负责储存用户权限、审计日志、Docker 镜像分组信息等数据。
-
Job Services:处理镜像复制等异步任务。
主要用于镜像复制,本地镜像可以被同步到远程 Harbor 实例上。
-
Log Collector:收集 Harbor 各组件的日志。
Harbor 的每个组件都是以 Docker 容器的形式构建的,因此,使用 Docker Compose 来对它进行部署。总共分为 7 个容器运行,通过在 docker - compose.yml 所在目录中执行 docker - compose ps 命令来查看,名称分别为:nginx、harbor - jobservice、harbor - ui、harbor - db、harbor - adminserver、registry、harbor - log。其中 harbor - adminserver 主要是作为一个后端的配置数据管理,并没有太多的其他功能。harbor - ui 所要操作的所有数据都通过 harbor - adminserver 这样一个数据配置管理中心来完成。
2.2.4 数据流向分析
- Docker 客户端 / 浏览器:用户通过 Docker 客户端或者浏览器进行交互。
- Proxy(代理):客户端的请求会通过代理转发,可能是为了负载均衡或处理一些中间层逻辑。
- Core services(核心服务):包含 UI、token 和 webhook。这些服务处理用户请求的业务逻辑,比如 UI 提供用户界面,token 服务管理认证,webhook 可能用于触发外部通知或事件。
- Registry(注册表):这是容器镜像的存储地方,核心服务会与 Registry 交互来存储或获取镜像。
- Database(数据库):Core services 还与数据库交互,用来存储与 Harbor 相关的元数据、配置、用户信息等。
- Job services(作业服务):处理后台任务和作业,可能包括镜像同步、清理任务等。
- Log Collector(日志收集器):系统会收集日志以便后期分析和排查。
- Replication to remote Harbor instances(同步到远程 Harbor 实例):可能用于在多个 Harbor 实例之间同步镜像,保证镜像的高可用和分布式存储。
2.3 部署 Harbor 服务
2.3.1 安装 Docker Compose
Harbor 使用 Docker Compose 来启动各个组件,所以需要安装 Docker 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 官网下载离线安装包:
wget https://github.com/goharbor/harbor/releases/download/v2.4.0/harbor-offline-installer-v2.4.0.tgz
tar zxvf harbor-offline-installer-v2.4.0.tgz -C /usr/local/
注:v2.4.0 版本相对较旧,在实际使用中,建议下载较新的稳定版本,以获取更多功能和安全更新。
2.3.3 修改 Harbor 配置文件
在 /usr/local/harbor/ 目录中修改 harbor.yml 配置文件,设置 Harbor 服务器的地址、管理员密码等:
vim /usr/local/harbor/harbor.yml
修改以下字段:
-
hostname: 配置为 Harbor 的 IP 地址或域名,例如192.168.10.127。--5行--修改,设置为Harbor服务器的IP地址或者域名 hostname = 192.168.10.127 -
harbor_admin_password: 设置管理员密码。--59行--指定管理员的初始密码,默认的用户名/密码是admin/Harbor12345 harbor_admin_password = Harbor12345
关于 Harbor.cfg 配置文件中有两类参数:所需参数和可选参数
2.3.3.1 所需参数
这些参数需要在配置文件 Harbor.yml 中设置。如果用户更新它们并运行 install.sh 脚本重新安装 Harbor,参数将生效。具体 参数如下:
- hostname:用于访问用户界面和 register 服务。它应该是目标机器的 IP 地址或完全限定的域名(FQDN),例如 192.168.10.127 或 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.3.3.2 可选参数
这些参数对于更新是可选的,即用户可以将其保留为默认值,并在启动 Harbor 后在 Web UI 上进行更新。如果进入 Harbor.cfg,只会在第一次启动 Harbor 时生效,随后对这些参数的更新,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 验证,这在远程实例具有自签名或不可信证书时经常使用。
另外,默认情况下,Harbor 将镜像存储在本地文件系统上。在生产环境中,可以考虑使用其他存储后端而不是本地文件系统,如 S3、Openstack Swif、Ceph 等对象存储。但需要更新 common/templates/registry/config.yml 文件。
Harbor 的默认镜像存储路径在 /data/registry 目录下,映射到 docker 容器里面的 /storage 目录下。
这个参数是在 docker - compose.yml 中指定的,在 docker - compose up -d 运行之前修改。
如果希望将 Docker 镜像存储到其他的磁盘路径,可以修改这个参数。
2.3.4 启动 Harbor
配置好文件后,运行以下命令启动 Harbor 服务:
# 在配置好了 harbor.cfg 之后,执行 ./prepare 命令,为 harbor 启动的容器生成一些必要的文件(环境)
# 再执行命令 ./install.sh 以 pull 镜像并启动容器
cd /usr/local/harbor/
./prepare
./install.sh
2.3.5 查看 Harbor 启动状态
通过 docker-compose 查看各个 Harbor 服务的状态:
cd /usr/local/harbor/
docker-compose ps

如果 Harbor 启动成功,应该能看到各个容器的状态为 “Up”。
2.3.6 创建一个新项目
(1)浏览器访问:http://192.168.10.127 登录 Harbor WEB UI 界面,默认的管理员用户名和密码是 admin/Harbor12345
(2)输入用户名和密码登录界面后可以创建一个新项目。点击“+项目”按钮
(3)填写项目名称为“myproject”,点击“确定”按钮,创建新项目
(4)此时可使用 Docker 命令在本地通过 127.0.0.1 来登录和推送镜像。默认情况下,Registry 服务器在端口 80 上侦听。

// 登录 Harbor
docker login -u admin -p Harbor12345 http://127.0.0.1
// 下载镜像进行测试
docker pull nginx
// 将镜像打标签
// 格式:docker tag 镜像:标签 仓库IP/项目名称/镜像名:标签
docker tag nginx:latest 127.0.0.1/myproject/nginx:v1
// 上传镜像到 Harbor
docker push 127.0.0.1/myproject/nginx:v1

(5)在 Harbor 界面 myproject-nginx 目录下可看见此镜像及相关信息
2.4 客户端上传镜像
2.4.1 配置 Docker 客户端
以上操作都是在 Harbor 服务器本地操作。如果其他客户端登录到 Harbor,可能会报如下错误。出现这问题的原因为 Docker Registry 交互默认使用的是 HTTPS,但是搭建私有镜像默认使用的是 HTTP 服务,所以与私有镜像交互时出现以下错误。
docker login -u admin -p Harbor12345 http://192.168.10.127
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
Error response from daemon: Get https://192.168.10.127/v2/: dial tcp 192.168.10.127:443: connect: connection refused
(1)在 Docker 客户端配置操作
为了让 Docker 客户端能够访问私有仓库,配置文件需要添加 --insecure-registry 参数:
// 解决办法是:在 Docker server 启动的时候,增加启动参数,默认使用 HTTP 访问。
vim /usr/lib/systemd/system/docker.service
--13行--修改
ExecStart=/usr/bin/dockerd -H fd:// --insecure-registry 192.168.10.127 --containerd=/run/containerd/containerd.sock
或
ExecStart=/usr/bin/dockerd --insecure-registry 192.168.10.127
// 重启 Docker,再次登录
systemctl daemon-reload
systemctl restart docker
// 再次登录 Harbor
docker login -u admin -p Harbor12345 http://192.168.10.127
WARNING! Using --password via the CLI is insecure. Use --password-stdin.
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Login Succeeded
// 将自动保存凭据到 /root/.docker/config.json,下次登录时可直接使用凭据登录 Harbor
// 下载镜像进行测试
docker pull 192.168.10.127/myproject-yjs/nginx:v1
// 上传镜像进行测试
docker pull cirros
docker tag cirros:latest 192.168.10.127/myproject/cirros:v2
docker push 192.168.10.127/myproject/cirros:v2


(2)刷新 Harbor 的 Web 管理界面进行查看,会发现 myproject 项目里面有两个镜像
2.5 维护管理 Harbor
2.5.1 通过 Harbor Web 创建项目
在 Harbor 仓库中,任何镜像在被 push 到 regsitry 之前都必须有一个自己所属的项目。
单击“+项目”,填写项目名称,项目级别若设置为"私有",则不勾选。如果设置为公共仓库,则所有人对此项目下的镜像拥有读权限,命令行中不需要执行"Docker login"即可下载镜像,镜像操作与 Docker Hub 一致。
2.5.2 创建 Harbor 用户
(1)创建用户并分配权限
在 Web 管理界面中单击系统管理 -> 用户管理 -> +用户,
填写用户名为“zhangsan”,邮箱为“zhangsan@abc.com”,全名为“zhangsan”,密码为“Abc123456”,注释为“管理员”(可省略)。
附:用户创建成功后,单击左侧“…”按钮可将上述创建的用户设置为管理员角色或进行删除操作,本例不作任何设置。
(2)添加项目成员
单击项目 -> myproject-yjs-> 成员 -> + 成员,填写上述创建的用户 zhangsan 并分配角色为“开发人员”。
附:此时单击左侧“…”按钮仍然可对成员角色进行变更或者删除操作
(3)在客户端上使用普通账户操作镜像
// 删除上述打标签的本地镜像
docker rmi 192.168.10.127/myproject/cirros:v2
// 先退出当前用户,然后使用上述创建的账户 zhangsan 登录
docker logout 192.168.10.127
docker login 192.168.10.127
或
docker login -u zhangsan -p Abc123456 http://192.168.10.127
// 下载和上传镜像进行测试
docker pull 192.168.10.127/myproject/cirros:v2
docker tag cirros:latest 192.168.10.127/myproject/cirros:v3
docker push 192.168.10.127/myproject/cirros:v3

2.5.3 查看日志
Web 界面日志,操作日志按时间顺序记录用户相关操作
2.5.4 修改 Harbor.cfg 配置文件
要更改 Harbor 的配置文件中的可选参数时,请先停止现有的 Harbor 实例并更新 Harbor.cfg;然后运行 prepare 脚本来填充配置;最后重新创建并启动 Harbor 的实例。
# 使用 docker-compose 管理 Harbor 时,必须在与 docker-compose.yml 相同的目录中运行。
cd /usr/local/harbor
docker-compose down -v
vim harbor.yml # 只能修改可选参数
./prepare
docker-compose up -d
如果有以下报错,需要开启防火墙 firewalld 服务解决
Creating network “harbor_harbor” with the default driver
ERROR: Failed to Setup IP tables: Unable to enable SKIP DNAT rule: (iptables failed: iptables --wait -t nat -I DOCKER -i br-b53c314f45e8 -j RETURN: iptables: No chain/target/match by that name.
(exit status 1))
2.5.5 移除 Harbor 服务容器同时保留镜像数据/数据库,并进行迁移
在 Harbor 服务器上操作
(1)移除 Harbor 服务容器
cd /usr/local/harbor
docker-compose down -v
(2)把项目中的镜像数据进行打包
// 持久数据,如镜像,数据库等在宿主机的/data/目录下,日志在宿主机的/var/log/Harbor/目录下
docker-compose exec -T core tar -zcf - -C /storage . > harbor-backup-full.tar.gz
-T: 禁用伪终端分配,让命令在非交互模式下运行harbor-core:Harbor 的核心服务容器,其中包含 /storage目录,通常映射到宿主机的 /data/registry,存储所有镜像数据-C /storage .:先切换到 /storage目录,然后打包当前目录的所有内容
完整的工作流程
- 进入容器:在 harbor-core容器中执行命令
- 2. 切换目录:进入容器内的 /storage目录(这是镜像数据存储位置)
- 打包压缩:将 /storage目录所有内容打包并用 gzip 压缩
- 4.输出到标准输出:将压缩数据流输出到屏幕(stdout)
- 定向到文件:宿主机捕获这个数据流,保存为 harbor-backup-full.tar.gz
2.5.6 如需重新部署,需要移除 Harbor 服务容器全部数据
cd /usr/local/harbor
docker-compose down -v
rm -r /data/database
rm -r /data/registry
docker-compose run --rm core tar -zxf - -C /storage < harbor-backup-full.tar.gz
更多推荐

所有评论(0)