今でもあなたは私の光丶

Docker(三)运维管理

Swarm集群管理

docker swarm是docker官方提供的一套容器编排系统,是Docker公司推出的官方容器集群平台。基于 Go语言实现。它的架构如下:

Swarm的核心概念

  • 集群
    一个集群由多个 Docker 主机组成,这些Docker主机以集群模式运行,并充当管理者(用于管理成 员资格和委派)和工作人员(运行集群服务)
    与独立容器相比,集群服务的主要优势之一是,可以修改服务的配置,包括它所连接的网络和卷, 而无需手动重新启动服务。
    独立容器和集群服务之间的主要区别在于,只有集群管理器可以管理集群,而独立容器可以在任何 守护程序上启动。
  • 节点
    swarm是一系列节点的集合,而节点可以是一台裸机或者一台虚拟机。一个节点能扮演一个或者两 个角色,manager或者worker
    manager节点
    Docker Swarm集群需要至少一个manager节点,节点之间使用 Raft consensus protocol 进行 协同工作。
    通常,第一个启用docker swarm的节点将成为leader,后来加入的都是follower。当前的leader 如果挂掉,剩余的节点将重新选举出一个新的leader。
    每一个manager都有一个完整的当前集群状态的副本,可以保证manager的高可用
    worker节点
    worker节点是运行实际应用服务的容器所在的地方。理论上,一个manager节点也能同时成为 worker节点,但在生产环境中,我们不建议这样做。
    worker节点之间,通过 control plane 进行通信,这种通信使用 gossip 协议,并且是异步的
  • 服务和任务
    集群中的stacks, services, tasks的关系,如下图:

services(服务)

swarm service是一个抽象的概念,它只是一个对运行在swarm集群上的应用服务,所期望状态的 描述。它就像一个描述了下面物品的清单列表一样:

  • 服务名称
  • 使用哪个镜像来创建容器
  • 要运行多少个副本
  • 服务的容器要连接到哪个网络上
  • 应该映射哪些端口

task(任务)

在Docker Swarm中,task是一个部署的最小单元,task与容器是一对一的关系

stack(栈)

stack是描述一系列相关services的集合。我们通过在一个YAML文件中来定义一个stack

  • 负载均衡
    集群管理器使用入口负载平衡将要从集群外部获取的服务公开给集群。
    集群管理器可以自动为服务分配一个已发布端口,也可以为该服务配置一个已发布端口。
    可以指定任何未使用的端口。如果未指定端口,则集群管理器会为服务分配 30000-32767 范围内的 端口。
    集群模式具有一个内部DNS组件,该组件自动为群集中的每个服务分配一个DNS条目。
    集群管理器使用内部负载平衡根据服务的DNS名称在群集内的服务之间分配请求。

Swarm安装

对于Docker 1.12+版本,Swarm相关命令已经原生嵌入到了Docker Engine中

1、下载镜像

# 拉取镜像
docker pull swarm

2、查看版本

# 查看版本
docker run --rm swarm -v
swarm version 1.2.9 (527a849)

Swarm集群

1、创建新集群

[root@teacher1 com-test]# docker swarm init --advertise-addr 172.16.86.47
Swarm initialized: current node (i7lk1f63no4tl7o6depa1egha) is now a manager.
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-
60etl768pzoibxuqlpeuyyp73jjwwknbc2yvlfxpzwc568vr8o-e7y60md3jxd8u4mkxzug13xeb
172.16.86.47:2377
To add a manager to this swarm, run 'docker swarm join-token manager' and follow
the instructions.
# 将节点强制驱除集群
docker swarm leave --force

上面命令执行后,该机器自动加入到swarm集群。这个会创建一个集群token,获取全球唯一的 token,作为集群唯一标识。后续将其他节点加入集群都会用到这个token值。

其中,--advertise-addr参数表示其它swarm中的worker节点使用此ip地址与manager联系。命令的输 出包含了其它节点如何加入集群的命令。

2、查看集群状态和节点信息

#查看集群状态
$ docker info
Containers: 2
Running: 0
Paused: 0
Stopped: 2
...snip...
Swarm: active
NodeID: i7lk1f63no4tl7o6depa1egha
Is Manager: true
ClusterID: v9xgock39u6ruod3q4u97zjsb
Managers: 1
Nodes: 1
...snip...
#查看节点信息
$ docker node ls
ID HOSTNAME STATUS
AVAILABILITY MANAGER STATUS ENGINE VERSION
i7lk1f63no4tl7o6depa1egha * teacher1 Ready Active
Leader 19.03.12

3、添加工作节点到集群

创建了一个集群与管理器节点,就可以添加工作节点。
在工作节点172.16.206.25上安装docker和docker swarm

[root@hadoop5 teacher]# docker swarm join --token SWMTKN-1-
60etl768pzoibxuqlpeuyyp73jjwwknbc2yvlfxpzwc568vr8o-e7y60md3jxd8u4mkxzug13xeb
172.16.86.47:2377
This node joined a swarm as a worker.
# 将节点强制驱除集群
docker swarm leave --force

如果忘记了token的值,在管理节点172.16.86.47上

#在管理者节点上写
[root@teacher1 com-test]# docker swarm join-token manager
To add a manager to this swarm, run the following command:
docker swarm join --token SWMTKN-1-
0l5r5oia275bn2rtd098o9vyan73jf5cx7ryrr8gq7bwj7x9wc-d2nt6ls01ff6hnfsnvmcjpgqu
172.16.86.47:2377
[root@teacher1 com-test]# docker swarm join-token worker
To add a worker to this swarm, run the following command:
docker swarm join --token SWMTKN-1-
0l5r5oia275bn2rtd098o9vyan73jf5cx7ryrr8gq7bwj7x9wc-3plqhvbn8086h1g7ubse0nnmy
172.16.86.47:2377

在管理节点172.16.86.47上

#查看节点信息
$ docker node ls
ID HOSTNAME STATUS
AVAILABILITY MANAGER STATUS ENGINE VERSION
jp8nq2d42agepijggirptiie2 hadoop5 Ready Active
19.03.12
i7lk1f63no4tl7o6depa1egha * teacher1 Ready Active
Leader 19.03.12

4、发布服务到集群

在管理节点172.16.86.47上

[root@teacher1 teacher]# docker service create -p 80:80 --replicas 2 --name
nginx1 nginx
mp0mt313oevgp3jtyuuudeul5
overall progress: 2 out of 2 tasks
1/2: running
2/2: running
verify: Service converged

访问:http://113.31.119.154

-p :端口映射
--replicas:运行实例个数
--name:服务名
nginx : 镜像

查看发布的服务

#列表查询
[root@teacher1 teacher]# docker service ls
ID NAME MODE REPLICAS
IMAGE PORTS
mp0mt313oevg nginx1 replicated 2/2
nginx:latest *:80->80/tcp
#详细查询
[root@teacher1 teacher]# docker service inspect --pretty nginx1
ID: mp0mt313oevgp3jtyuuudeul5
Name: nginx1
Service Mode: Replicated
Replicas: 2
Placement:
UpdateConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Update order: stop-first
RollbackConfig:
Parallelism: 1
On failure: pause
Monitoring Period: 5s
Max failure ratio: 0
Rollback order: stop-first
ContainerSpec:
Image:
nginx:latest@sha256:36b74457bccb56fbf8b05f79c85569501b721d4db813b684391d63e02287
c0b2
Init: false
Resources:
Endpoint Mode: vip
Ports:
PublishedPort = 80
Protocol = tcp
TargetPort = 80
PublishMode = ingress

查看哪些节点正在运行服务

[root@teacher1 teacher]# docker service ps nginx1
ID NAME IMAGE NODE
DESIRED STATE CURRENT STATE ERROR PORTS
iln3bhgwn0ux nginx1.1 nginx:latest teacher1
Running Running about a minute ago
1iwz3zbxkdtz nginx1.2 nginx:latest hadoop5
Running Running about a minute ago

以上命令均在管理节点上运行
停止并删除发布的服务

[root@teacher1 teacher]# docker service rm nginx1
nginx1

查看哪些节点正在运行服务
在工作节点上运行的命令

[root@hadoop5 teacher]# docker ps
CONTAINER ID IMAGE COMMAND CREATED
STATUS PORTS NAMES
d7b9c35bd5a5 nginx:latest "/docker-entrypoint.…" 2 minutes ago
Up 2 minutes 80/tcp nginx1.1.mfr5dyukmihvw9qc3nf7lchkq

5、扩展一个或多个服务

[root@teacher1 teacher]# docker service scale nginx1=3
nginx1 scaled to 3
overall progress: 3 out of 3 tasks
1/3: running
2/3: running
3/3: running
verify: Service converged
[root@teacher1 teacher]# docker service ls
ID NAME MODE REPLICAS
IMAGE PORTS
0tnw762m7f0r nginx1 replicated 3/3
nginx:latest *:80->80/tcp
[root@teacher1 teacher]# docker service ps nginx1
ID NAME IMAGE NODE
DESIRED STATE CURRENT STATE ERROR PORTS
mfr5dyukmihv nginx1.1 nginx:latest hadoop5
Running Running 25 minutes ago
j0xef7nnvcdu nginx1.2 nginx:latest teacher1
Running Running about a minute ago
irxjitlxpoug nginx1.3 nginx:latest teacher1
Running

6、更新服务

docker service update --publish-rm 80:80 --publish-add 88:80 nginx1

访问:http://113.31.119.154:88/
还可以更新很多 具体可加 --help查询

7、节点管理

#给hadoop5添加worker1标签
[root@teacher1 teacher]# docker node update --label-add worker1 hadoop5
hadoop5
#给hadoop5节点停用
[root@teacher1 teacher]# docker node update --availability drain hadoop5
hadoop5
#hadoop5节点停止docker
systemctl stop docker
#删除节点
[root@teacher1 teacher]# docker node rm hadoop5
hadoop5

Docker Compose

通过前面的讲解我们知道使用一个Dockerfile模板文件,可以很方便地定义一个单独的应用容器。然 而,在日常工作中, 经常会碰到需要多个容器相互配合来完成某项任务的情况。例如要实现一个Web项 目,除了Web服务容器本身,往往还需要再加上后端的数据库服务容器,甚至还包括负载均衡容器等。

Compose定位是“定义和运行多个Docker容器的应用”,它允许用户通过一个单独的dockercompose.yml模板文件(YAML格式)来定义一组相关联的应用容器为一个项目(project)。

Compose的概念

Docker Compose 将所管理的容器分为三层,分别是项目(project)、服务(service)、容器 (container)

  • 项目(project):由一组关联的应用容器组成的一个完整业务单元,在docker-compose.yml文件 中定义
  • 服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例
  • 容器(container):docker容器

Docker Compose 运行目录下的所有文件(docker-compose.yml)组成一个项目,一个项目包含多个服 务,每个服务中定义了容器运行的镜像、参数、依赖,一个服务可包括多个容器实例
Compose的默认管理对象是项目,通过子命令对项目中的一组容器进行便捷地生命周期管理。

Compose项目由Python编写,实现上调用了Docker服务提供的API来对容器进行管理。因此,只要所操 作的平台支持Docker API,就可以在其上利用Compose来进行编排管理。

Compose的安装

安装Docker Compose

1)运行以下命令以下载Docker Compose的当前稳定版本:

#$(uname -s)-$(uname -m) : Linux-x86_64
curl -L "https://github.com/docker/compose/releases/download/1.26.0/dockercompose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

要安装其他版本的Compose,请替换1.26.0 为要使用的Compose版本。

2) 将可执行权限应用于二进制文件:

chmod +x /usr/local/bin/docker-compose

3) 添加到环境中

#ln -s : 软链接
ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose

4) 测试安装。

docker-compose --version

卸载Docker Compose

rm /usr/local/bin/docker-compose

docker-compose.yml

模板文件是使用Compose的核心,默认的模板文件名称为docker-compose.yml,格式为YAML格式。

version: '2.0' #版本2.0
services: #定义服务
nginx: #Nginx容器
image: nginx:1.18.0 #Nginx:latest 镜像 先拉镜像 指定镜像的版本
ports:
- 80:80 #映射端口
- 433:433
volumes: #挂载数据 宿主机目录(一定要存在):容器的目录
- /data/log:/var/log/nginx
- /data/www:/var/www
- /etc/letsencrypt:/etc/letsencrypt

常见指令:

version:版本

version: '2.0' #版本2.0 与swarm结合 要3.0以上

services:定义服务

services: #定义服务

image:指定服务的镜像名称或镜像 ID。如果镜像在本地不存在,Compose 将会拉取镜像

image: nginx #Nginx:latest 镜像 先拉镜像 指定镜像的版本

ports:端口映射 HOST:CONTAINER

ports:
- 8000:80 #映射端口

build: 指定dockerfile,Compose 将会利用它自动构建这个镜像,然后使用这个镜像启动服务容器

构建自己的应用

build: /path/dockerfilename
build:./path/dockerfilename

command:使用 command 可以覆盖容器启动后默认执行的命令

command:echo $HOME
command:[ "echo", "$HOME" ]
command: redis-server /usr/local/etc/redis/redis.conf #先创建目录和文件

depends_on:确定容器的启动顺序

depends_on:
- db #服务名
- redis

environment:设置镜像变量

environment:
RACK_ENV: development
SHOW: 'true'
SESSION_SECRET:

volumes:挂载一个目录或者一个已存在的数据卷容器,可以直接使用 [HOST:CONTAINER] 这样的格 式,或者使用 [HOST:CONTAINER:ro] 这样的格式,后者对于容器来说,数据卷是只读的,这样可以有 效保护宿主机的文件系统
Compose的数据卷指定路径可以是绝对路径或相对路径

volumes: #挂载数据
- /data/nginx/conf.d:/etc/nginx/conf.d # 如果不写将使用默认
- /data/log:/var/log/nginx
- /data/www:/var/www

注意:如果目录或文件不存在将启动不成功,所以要先创建好目录或文件

network_mode:网络模式

network_mode: bridge
network_mode: host
network_mode: none
network_mode: service:[service name]
network_mode: container:[container name/id]

默认bridge

[root@teacher1 com-test]# docker network ls
NETWORK ID NAME DRIVER SCOPE
31289c518ea1 bridge bridge local
bcb2529f97ae com-test_default bridge local
db2ff5be4e36 host host local
e8aa24d5f78f none null local

加入该配置后,不新增网络

[root@teacher1 com-test]# docker network ls
NETWORK ID NAME DRIVER SCOPE
31289c518ea1 bridge bridge local
db2ff5be4e36 host host local
e8aa24d5f78f none null local

networks:定义网络

# 默认网络
networks:
default:
driver: bridge
#自定义网络
networks:
front:
driver: bridge
back:
driver: bridge
driver_opts:
foo: "1"
bar: "2"
#使用现有网络
docker network create net-a --driver bridge
networks:
default:
external:
name: net-a

案例:

version: "2.0"
services:
nginx:
image: nginx:1.18.0
restart: always
container_name: nginx
environment:
- TZ=Asia/beijing
ports:
- 80:80
- 443:443
volumes:
- /docker/nginx/log:/var/log/nginx
- /docker/nginx/www:/etc/nginx/html
- /etc/letsencrypt:/etc/letsencrypt
mysql:
restart: always
image: mysql:5.7.30
container_name: mysql5.7
ports:
- 13306:3306
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--default-time-zone=+8:00
environment:
MYSQL_ROOT_PASSWORD: "root"
volumes:
- "/docker/mysql/db:/var/lib/mysql"
redis:
image: redis:5.0.9
container_name: redis
environment:
- TZ=Asia/beijing
ports:
- 6379:6379
volumes:
- /docker/redis/data:/data

运行:

docker-compose up -d

查看

docker-compose ps

Compose的常见命令

ps:列出所有运行容器

docker-compose ps

logs:查看服务日志输出

docker-compose logs

port:打印绑定的公共端口

docker-compose port nginx 80

build:构建或者重新构建服务

docker-compose build

start:启动指定服务已存在的容器

docker-compose start nginx

up以后没有down 可以运行start
stop:停止已运行的服务的容器

docker-compose stop nginx

不删除容器
rm:删除指定服务的容器

docker-compose rm nginx

up:通过docker-compose.yml,自动完成包括构建镜像,(重新)创建服务,启动服务,并关联服务 相关容器的一系列操作

docker-compose up -d

可以说,大部分时候都可以直接通过该命令来启动一个项目。默认情况,docker-compose up启动的容 器都在前台,控制台将会同时打印所有容器的输出信息,可以很方便进行调试。当通过Ctrl-C停止命令 时,所有容器将会停止。

如果使用docker-compose up-d,将会在后台启动并运行所有的容器。一般推荐生产环境下使用该选 项。
run:在一个服务上执行一个命令

docker-compose run nginx bash

down 停止并删除容器

docker-compose down

-v : 可以删除容器使用的数据

与Swarm一起使用Compose

我们知道使用 docker-compose.yml可以来一次配置、启动多个容器,在 Swarm 集群中也可以使用 compose 文件 (docker-compose.yml) 来配置、启动多个服务。
使用 docker service create 一次只能部署一个服务,使用 docker-compose.yml 我们可以一次启动多 个关联的服务。

打开前面的docker-compose.yml (有多个容器)
修改:

version: "3.0"
deploy:
mode: replicated
replicas: 2

去掉不支持的:

restart: always
container_name: nginx

结果:

version: "3.0"
services:
nginx:
image: nginx:1.18.0
ports:
- 80:80
- 443:443
volumes:
- /docker/nginx/log:/var/log/nginx
- /docker/nginx/www:/etc/nginx/html
- /etc/letsencrypt:/etc/letsencrypt
deploy:
mode: replicated
replicas: 2
mysql:
image: mysql:5.7.30
ports:
- 13306:3306
command:
--default-authentication-plugin=mysql_native_password
--character-set-server=utf8mb4
--collation-server=utf8mb4_general_ci
--explicit_defaults_for_timestamp=true
--lower_case_table_names=1
--default-time-zone=+8:00
environment:
MYSQL_ROOT_PASSWORD: "root"
volumes:
- "/docker/mysql/db:/var/lib/mysql"
deploy:
mode: replicated
replicas: 2
redis:
image: redis:5.0.9
environment:
- TZ=Asia/beijing
ports:
- 6379:6379
#主备都存在
volumes:
- /docker/redis/data:/data
deploy:
mode: replicated
replicas: 2

运行:

$ docker stack deploy -c docker-compose.yml web
Creating network web_default
Creating service web_redis
Creating service web_nginx
Creating service web_mysql

查看服务:

$ docker stack services web
ID NAME MODE REPLICAS
IMAGE PORTS
gkjsbzbbkqjp web_nginx replicated 2/2
nginx:1.18.0 *:80->80/tcp, *:443->443/tcp
qbfpbiwlfuot web_mysql replicated 2/2
mysql:5.7.30 *:13306->3306/tcp
wb4eixvr2l38 web_redis replicated 2/2
redis:5.0.9 *:6379->6379/tcp

删除服务:

$ docker stack down web
Removing service web_mysql
Removing service web_nginx
Removing service web_redis
Removing network web_default

配置私有仓库(Harbor)

Harbor(港湾),是一个用于存储和分发Docker镜像的企业级Registry服务器
以前的镜像私有仓库采用官方的Docker Registry,不便于管理镜像。

Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了 一个web界面。其主要组件如下图:

主要组件包括:

  • proxy,他是一个nginx前端代理,主要是分发前端页面ui访问和镜像上传和下载流量
  • ui提供了一个web管理页面,当然还包括了一个前端页面和后端API,底层使用mysql数据库
  • registry是镜像仓库,负责存储镜像文件,当镜像上传完毕后通过hook通知ui创建repository
  • adminserver是系统的配置管理中心附带检查存储用量,ui和jobserver启动时候需要加载adminserver 的配置,jobsevice是负责镜像复制工作的,他和registry通信,从一个registry pull镜像然后push到另 一个registry,并记录job_log
  • log是日志汇总组件,通过docker的log-driver把日志汇总到一起。

Harbor安装

1、下载Harbor

wget http://kubernetes.cvimer.com/harbor-offline-installer-v1.10.3.tgz

2、解压

tar xf harbor-offline-installer-v1.10.3.tgz
cd harbor
#将镜像加载到docker中
docker load -i harbor.v1.10.3.tar.gz

Harbor配置

vi harbor.yml

公开访问

#采用域名
hostname: lgharbor.com
http:
port: 80
# 安全访问
#https:
# port: 443
# certificate: /etc/docker/certs.d/harbor.lgedu.com:8443/lgedu.com.cert
# private_key: /etc/docker/certs.d/harbor.lgedu.com:8443/lgedu.com.key
harbor_admin_password: Harbor12345
database:
password: root123
max_idle_conns: 50
max_open_conns: 100
#设置数据库路径
data_volume: /data/harbor
clair:
updaters_interval: 12
jobservice:
max_job_workers: 100
notification:
webhook_job_max_retry: 100
chart:
absolute_url: disabled
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
location: /var/log/harbor
_version: 1.10.0
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- clair

登录名:admin
密码:Harbor12345

Harbor启动和停止

1、运行prepare脚本

Harbor将 nginx 实例用作所有服务的反向代理。您可以使用 prepare 脚本来配置 nginx 为使用HTTP和 HTTPS

./prepare

2、利用docker-compose启动和停止Harbor

#启动
docker-compose up -d
#关闭
docker-compose down
#强制清理
docker system prune -a -f
#查看
docker-compose ps
harbor-core /harbor/harbor_core Up (health: starting)
harbor-db /docker-entrypoint.sh Up (health: starting)
5432/tcp
harbor-jobservice /harbor/harbor_jobservice Up (health: starting)
...
harbor-log /bin/sh -c /usr/local/bin/ Up (health: starting)
127.0.0.1:1514->10514/tcp
...
harbor-portal nginx -g daemon off; Up (health: starting)
8080/tcp
nginx nginx -g daemon off; Up (health: starting)
0.0.0.0:80->8080/tcp
redis redis-server Up (health: starting)
6379/tcp
/etc/redis.conf
registry /home/harbor/entrypoint.sh Up (health: starting)
5000/tcp
registryctl /home/harbor/start.sh Up (health: starting)

Harbor访问和登录

1、配置hosts文件,做IP与域名的映射

vim /etc/hosts
172.16.86.47 lgharbor.com

2、打开浏览器,然后输入 http://lgharbor.com 。显示Harbor界面。

3、修改daemon.json,默认http私有仓库不能访问,设置后才可以

vim /etc/docker/daemon.json
{
"insecure-registries" : ["lgharbor.com"]
}
# 重启Docker进程
systemctl restart docker
# 重启Harbor
docker-compose up -d

3、从Docker客户端登录Harbor

docker login lgharbor.com
username:admin
password:Harbor12345

推送镜像到Harbor

1、为要推送的镜像打tag

docker tag centos:7.6.1810 lgharbor.com/lgedu/centos:7.6.1810

lgharbor.com:域名
lgedu:项目名,在Harbor中创建

2、推送镜像到Harbor中

docker push lgharbor.com/lgedu/centos:7.6.1810

生产环境中使用

1、生成CA证书

#生成CA证书私钥
openssl genrsa -out ca.key 4096
#生成CA证书
openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=lgharbor/OU=Personal/CN=lgharbor.com" \
-key ca.key \
-out ca.crt

2、生成服务器证书

证书通常包含一个 .crt 文件和一个 .key 文件

生成私钥

openssl genrsa -out lgharbor.com.key 4096

生成证书签名请求(CSR)

openssl req -sha512 -new \
-subj "/C=CN/ST=Beijing/L=Beijing/O=lgharbor/OU=Personal/CN=lgharbor.com" \
-key lgharbor.com.key \
-out lgharbor.com.csr

生成一个x509 v3扩展文件

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicConstraints=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names
[alt_names]
DNS.1=*.lgharbor.com
DNS.2=lgharbor.com
EOF

使用该v3.ext文件为您的Harbor主机生成证书

openssl x509 -req -sha512 -days 3650 \
-extfile v3.ext \
-CA ca.crt -CAkey ca.key -CAcreateserial \
-in lgharbor.com.csr \
-out lgharbor.com.crt

3、向Harbor和Docker提供证书

生成后ca.crt,lgharbor.com.crt和lgharbor.com.key文件,必须将它们提供给Harbor和Docker,和重 新配置Harbor使用它们。

将服务器证书和密钥复制到Harbor主机上的certficates文件夹中

mkdir -p /data/cert
cp lgharbor.com.crt /data/cert/
cp lgharbor.com.key /data/cert/

转换lgharbor.com.crt为lgharbor.com.cert,供Docker使用

openssl x509 -inform PEM -in lgharbor.com.crt -out lgharbor.com.cert

将服务器证书,密钥和CA文件复制到Harbor主机上的Docker证书文件夹中。必须首先创建适当的 文件夹

mkdir -p /etc/docker/certs.d/lgharbor.com:443/
cp lgharbor.com.cert /etc/docker/certs.d/lgharbor.com:443/
cp lgharbor.com.key /etc/docker/certs.d/lgharbor.com:443/
cp ca.crt /etc/docker/certs.d/lgharbor.com:443/

重新启动Docker Engine

systemctl restart docker

4、修改Harbor配置

开启https

vim harbor.yml
https:
port: 443
certificate: /etc/docker/certs.d/lgharbor.com:443/lgharbor.com.cert
private_key: /etc/docker/certs.d/lgharbor.com:443/lgharbor.com.key

5、启动harbor

./prepare
#启动
docker-compose up -d
#关闭
docker-compose down
#查看
docker-compose ps

6、从Docker客户端登录Harbor

cp ca.crt /etc/pki/ca-trust/source/anchors/
# 更新证书配置
update-ca-trust
# 重启Docker进程
systemctl restart docker
docker-compose down
docker-compose up -d

7、登录Harbor

docker login lgharbor.com:443