文章目录


一、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 文件中,contextvolumes 路径都是相对路径,相对于 docker-compose.yml 文件所在的目录。
  • 字段区分:YAML 格式中,services 下定义的每个服务都会有自己的配置项,例如 imagebuildports 等。确保每个字段的位置和缩进正确。
  • 服务间的依赖关系:例如,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

在这里插入图片描述

返回的结果是该镜像在仓库中的所有标签,如 v1v2 等。

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 的 pushpull 操作。

    负责储存 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 数据流向分析

  1. Docker 客户端 / 浏览器:用户通过 Docker 客户端或者浏览器进行交互。
  2. Proxy(代理):客户端的请求会通过代理转发,可能是为了负载均衡或处理一些中间层逻辑。
  3. Core services(核心服务):包含 UI、token 和 webhook。这些服务处理用户请求的业务逻辑,比如 UI 提供用户界面,token 服务管理认证,webhook 可能用于触发外部通知或事件。
  4. Registry(注册表):这是容器镜像的存储地方,核心服务会与 Registry 交互来存储或获取镜像。
  5. Database(数据库):Core services 还与数据库交互,用来存储与 Harbor 相关的元数据、配置、用户信息等。
  6. Job services(作业服务):处理后台任务和作业,可能包括镜像同步、清理任务等。
  7. Log Collector(日志收集器):系统会收集日志以便后期分析和排查。
  8. 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目录,然后打包当前目录的所有内容
    完整的工作流程​
  1. ​进入容器​:在 harbor-core容器中执行命令
  2. ​2. 切换目录​:进入容器内的 /storage目录(这是镜像数据存储位置)
  3. 打包压缩​:将 /storage目录所有内容打包并用 gzip 压缩
  4. 4.​输出到标准输出​:将压缩数据流输出到屏幕(stdout)
  5. 定向到文件​:宿主机捕获这个数据流,保存为 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
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐