docker系列文章
第一篇 docker私有仓库搭建
文章目录
前言
无论是使用Docker-distribution去自建仓库,还是通过官方镜像跑容器的方式去自建仓库,我们可以发现其是非常的简陋的,还不如直接使用官方的Docker Hub去管理镜像来得方便,至少官方的Docker Hub能够通过web界面来管理镜像,还能在web界面执行搜索,还能基于Dockerfile利用Webhooks和Automated Builds实现自动构建镜像的功能,用户不需要在本地执行docker build,而是把所有build上下文的文件作为一个仓库推送到github上,让Docker Hub可以从github上去pull这些文件来完成自动构建。
但无论官方的Docker Hub有多强大,它毕竟是在国外,所以速度是最大的瓶颈,我们很多时候是不可能去考虑使用官方的仓库的,但是上面说的两种自建仓库方式又十分简陋,不便管理,所以后来就出现了一个被 CNCF 组织青睐的项目,其名为Harbor。
一、Harbor是什么?
Harbor是由VMWare在Docker Registry的基础之上进行了二次封装,加进去了很多额外程序,而且提供了一个非常漂亮的web界面。
Project Harbor 是一个开源的可信云原生注册表项目,用于存储、签名和扫描上下文。
Harbor 通过添加用户通常需要的功能(如安全性、身份和管理)来扩展开源 Docker 分发版。
Harbor 支持高级功能,例如用户管理、访问控制、活动监控和实例间复制。
二、Harbor的功能
Feathers:
多租户内容签名和验证
安全性和漏洞分析
审计日志记录
身份集成和角色访问控制
实例间的镜像复制s
可扩展的API和图形界面
国际化(目前为英文和中文)
三、Harbor部署
Harbor标准安装过程包括以下阶段:
确保您的目标主机满足安装先决条件 Harbor Installer Precondition
下载并安装Harbor Download the Harbor Installer
配置HTTPS访问端口 Configure HTTPS Access to Harbor
配置Harbor YML文件 Configure the Harbor YML File
配置启用内部TLS Configure Enabling Internal TLS
运行安装程序脚本 Run the Installer Script
如果安装失败,请参见 Harbor安装故障处理
四、准备工作
搭建私有仓库需要的软件:
软件 | 版本 | 说明 |
---|---|---|
Docker | Version 17.06.0-ce+ 或更高 | 有关安装说明,请参阅 Docker Engine documentation |
Docker Compose | Version 1.18.0 或更高 | 有关安装说明,请参阅 Docker Compose documentation |
Openssl | 最好是最新的 | 用于为端口生成证书和密钥 |
4.1 安装Docker
# 1.首先配置yum仓库
curl -o /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
# 2.设置镜像的仓库
wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
# 3.安装容器相关的。docker-ce(社区版)docker-ee(企业版)
yum install docker-ce
# 4.启动docker服务并设置开机自启
systemctl start docker
systemctl enable docker
4.2安装Docker Compose
# 下载docker-compose,June 2023年不在支持compose v1版,下载位置和赵九思的不一样。
[root@node2 bin]# curl -SL https://github.com/docker/compose/releases/download/v2.17.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
[root@node2 ~]# cd /usr/local/bin/
[root@node2 bin]# ll
total 25188
-rw-r--r--. 1 root root 25792512 Aug 11 18:49 docker-compose
# 给docker-compose执行权限
[root@node2 ~]# chmod +x /usr/local/bin/docker-compose
[root@node2 ~]# ll /usr/local/bin/
total 25188
-rwxr-xr-x. 1 root root 25792512 Aug 11 18:49 docker-compose
#检查是否安装成功
docker compose version
Docker Compose version v2.17.2
4.3 安装Openssl
# 安装openssl
[root@node2 ~]# yum -y install openssl
[root@node2 ~]# rpm -qa | grep openssl
openssl-1.1.1g-11.el8.x86_64
openssl-pkcs11-0.4.10-2.el8.x86_64
openssl-libs-1.1.1g-11.el8.x86_64
xmlsec1-openssl-1.2.25-4.el8.x86_64
五、Harbor快速安装
# 下载harbor安装包
[root@node2 ~]# wget https://github.com/goharbor/harbor/releases/download/v2.8.0/harbor-offline-installer-v2.8.0.tgz
[root@node2 ~]# ls
anaconda-ks.cfg harbor-offline-installer-v2.4.3.tgz
# 解压到/usr/local/下
[root@node2 ~]# tar -xf harbor-offline-installer-v2.8.0.tgz -C /usr/local
[root@node2 ~]# cd /usr/local/harbor/
[root@node2 harbor]# ls
common.sh harbor.v2.4.3.tar.gz harbor.yml.tmpl install.sh LICENSE prepare
# 备份配置文件并进行配置
[root@node2 harbor]# cp harbor.yml.tmpl harbor.yml
[root@node2 harbor]# vim harbor.yml
......
hostname: 192.168.111.138 #修改为当前主机的IP或域名
......
# https related config
#https: #注释https服务
# https port for harbor, default is 443
# port: 443
# The path of cert and key files for nginx
#certificate: /your/certificate/path
#private_key: /your/private/key/path
# 执行安装脚本
[root@node2 harbor]# ./install.sh
[Step 0]: checking if docker is installed ...
Note: docker version: 20.10.17
[Step 1]: checking docker-compose is installed ...
Note: docker-compose version: 2.7.0
[Step 2]: loading Harbor images ...
✔ ----Harbor has been installed and started successfully.----
[root@node2 harbor]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:1514 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::]:80 [::]:*
[root@node2 harbor]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
828ec6d101a8 goharbor/nginx-photon:v2.4.3 "nginx -g 'daemon of…" 2 minutes ago Up 2 minutes (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp nginx
......
# 使用docker-compose管理(需要进到harbor目录中)
[root@node2 harbor]# docker-compose stop
[+] Running 9/9
⠿ Container harbor-jobservice Stopped 0.2s
⠿ Container registryctl Stopped 10.1s
⠿ Container nginx Stopped 0.3s
⠿ Container harbor-portal Stopped 0.2s
⠿ Container harbor-core Stopped 0.1s
⠿ Container redis Stopped 0.3s
⠿ Container harbor-db Stopped 0.2s
⠿ Container registry Stopped 0.1s
⠿ Container harbor-log Stopped 10.1s
[root@node2 harbor]# docker-compose start
[+] Running 9/9
⠿ Container harbor-log Started 0.5s
⠿ Container harbor-db Started 1.4s
⠿ Container redis Started 1.2s
⠿ Container registryctl Started 1.3s
⠿ Container registry Started 1.4s
⠿ Container harbor-portal Started 0.9s
⠿ Container harbor-core Started 0.5s
⠿ Container harbor-jobservice Started 0.9s
⠿ Container nginx Started 0.8s
[root@node2 harbor]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:1514 0.0.0.0:*
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 128 [::]:80 [::]:*
# 需要写一个开启自动启动的脚本,否则重启不会启动
[root@node2 harbor]# vim startall.sh
#!/bin/bash
cd /usr/local/harbor
docker-compose stop && docker-compose start
# 给脚本执行权限
[root@node2 harbor]# chmod +x startall.sh
[root@node2 harbor]# ll startall.sh
-rwxr-xr-x. 1 root root 77 Aug 11 21:15 startall.sh
# /etc/rc.local是系统启动之后最后一个执行的文件
[root@node2 harbor]# ll /etc/rc.local
lrwxrwxrwx. 1 root root 13 Dec 2 2020 /etc/rc.local -> rc.d/rc.local
[root@node2 harbor]# ll /etc/rc.d/rc.local
-rw-r--r--. 1 root root 513 Aug 11 21:13 /etc/rc.d/rc.local
# 被链接文件也需要有执行权限
[root@node2 harbor]# chmod +x /etc/rc.d/rc.local
[root@node2 harbor]# ll /etc/rc.d/rc.local
-rwxr-xr-x. 1 root root 513 Aug 11 21:13 /etc/rc.d/rc.local
# 在/etc/rc.d/rc.local里加上执行启动脚本的命令,就会开启开机自动启动
[root@node2 harbor]# vim /etc/rc.d/rc.local
#!/bin/bash
/bin/bash /usr/local/harbor/startall.sh
# 重启测试
[root@node2 ~]# reboot
[root@node2 ~]# ss -anlt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 128 0.0.0.0:80 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 127.0.0.1:1514 0.0.0.0:*
LISTEN 0 128 [::]:80 [::]:*
LISTEN 0 128 [::]:22 [::]:*
[root@node2 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
828ec6d101a8 goharbor/nginx-photon:v2.4.3 "nginx -g 'daemon of…" 2 hours ago Up About a minute (healthy) 0.0.0.0:80->8080/tcp, :::80->8080/tcp nginx
六、使用IP登录管理Harbor
默认用户名:admin 默认密码:Harbor12345
登录成功界面:
七、Harbor使用方法
系统管理—用户管理—创建用户
输入用户信息
创建用户成功—并将其设置为管理员
点击推送命令可以查看帮助
八、客户端上传镜像
# 客户端首先要登录到仓库
#第一次登入失败
[root@localhost docker]# docker login 192.168.2.186
Username: alaolv
Password:
Error response from daemon: Get http://192.168.2.186/v2/: dial tcp 192.168.2.186:80: connect: connection refused
#原因连接Harbor采用http,而不是https,所以在客户端需要vim /etc/docker/daemon.json,设置insecure-registries指定的IP为harbor私有仓库的地址,这里主要是告知客户端要连接http而不是https。
#进入编辑daemon.json
[root@localhost docker]# vim /etc/docker/daemon.json
#修改成以下内容:
[root@localhost docker]# cat /etc/docker/daemon.json
{
"insecure-registries": ["192.168.2.186"],
"registry-mirrors": ["http://f1361db2.m.daocloud.io"]
}
#重新登入Harbor就成功了
[root@localhost docker]# docker login 192.168.2.186
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
# 上传镜像
[root@node2 ~]# docker tag nginx:latest 192.168.2.186/library/nginx:v1
[root@node2 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
......
192.168.111.138/library/runtim v1 beae173ccac6 7 months ago 1.24MB
[root@localhost docker]# docker push 192.168.2.186/library/nginx:v1
The push refers to repository [192.168.2.186/library/nginx]
9d907f11dc74: Pushed
79974a1a12aa: Pushed
f12d4345b7f3: Pushed
935b5bd454e1: Pushed
fb6d57d46ad5: Pushed
ed7b0ef3bf5b: Pushed
v1: digest: sha256:f2fee5c7194cbbfb9d2711fa5de094c797a42a51aa42b0c8ee8ca31547c872b1 size: 1570
九、客户端拉取镜像
#查看镜像文件
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
goharbor/harbor-exporter v2.8.0 2abc02438fcf 4 days ago 97.1MB
goharbor/redis-photon v2.8.0 ef1f410f9255 4 days ago 127MB
goharbor/trivy-adapter-photon v2.8.0 724824e3559a 4 days ago 454MB
goharbor/notary-server-photon v2.8.0 d603449fe91f 4 days ago 113MB
goharbor/notary-signer-photon v2.8.0 618fc02c41bf 4 days ago 110MB
goharbor/harbor-registryctl v2.8.0 165749c6eedc 4 days ago 141MB
goharbor/registry-photon v2.8.0 8bfd12c2163d 4 days ago 78.5MB
goharbor/nginx-photon v2.8.0 cfc2401896e1 4 days ago 126MB
goharbor/harbor-log v2.8.0 f31ccc3d46f0 4 days ago 134MB
goharbor/harbor-jobservice v2.8.0 1b00a3a474e1 4 days ago 140MB
goharbor/harbor-core v2.8.0 15f4066c1707 4 days ago 164MB
goharbor/harbor-portal v2.8.0 ae18a071cdce 4 days ago 133MB
goharbor/harbor-db v2.8.0 f3d4373617a2 4 days ago 179MB
goharbor/prepare v2.8.0 daa44ccf3b06 4 days ago 170MB
192.168.2.186/library/nginx v1 6efc10a0510f 5 days ago 142MB
nginx latest 6efc10a0510f 5 days ago 142MB
# 删除原来的镜像
[root@localhost docker]# docker rmi 192.168.2.186/library/nginx:v1
Untagged: 192.168.2.186/library/nginx:v1
Untagged: 192.168.2.186/library/nginx@sha256:f2fee5c7194cbbfb9d2711fa5de094c797a42a51aa42b0c8ee8ca31547c872b1
# 拉取仓库里的镜像
[root@localhost docker]# docker pull 192.168.2.186/library/nginx:v1
v1: Pulling from library/nginx
Digest: sha256:f2fee5c7194cbbfb9d2711fa5de094c797a42a51aa42b0c8ee8ca31547c872b1
Status: Downloaded newer image for 192.168.2.186/library/nginx:v1
192.168.2.186/library/nginx:v1
[root@localhost docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
----
192.168.2.186/library/nginx v1 6efc10a0510f 5 days ago 142MB
nginx latest 6efc10a0510f 5 days ago 142MB
.....
十、总结
在客户端上传镜像时一定要记得执行docker login进行用户认证,否则无法直接push
在客户端使用的时候如果不是用的https则必须要在客户端的/etc/docker/daemon.json配置文件中配置insecure-registries参数
数据存放路径应在配置文件中配置到一个容量比较充足的共享存储中
Harbor是使用docker-compose命令来管理的,如果需要停止Harbor也应用docker-compose stop来停止,其他参数请–help