Docker(五)——Docker镜像仓库

本文首发于我的个人网站: https://hewanyue.com/
本文作者: Hechao
本文链接: https://hewanyue.com/blog/6187894.html

  比较常见的docker镜像仓库,有docker官方仓库https://hub.docker.com/,和阿里云镜像仓库https://cr.console.aliyun.com/cn-hangzhou/instances/images,可以比较方便的拉取镜像或储存容器镜像。而在企业生产中,绝对部分情况我们都是使用企业内部的镜像仓库,来分发部署我们的代码。本文将详细介绍阿里云仓库还有私有云仓库Registry、Harbor的搭建和使用的详细步骤方法。

阿里云仓库

  docker官方仓库配置比较简单,而且大部分是默认配置,且速度不如阿里云镜像仓库速度快,所以我这里就不介绍了,使用方式和阿里云容器镜像仓库差不多类似。

注册账号

  使用阿里云仓库服务首先要注册阿里云账号,支付宝也可以登陆,比较快捷。点击上面的网址登陆即可。
在这里插入图片描述

创建仓库

  先创建一个命名空间,这相当于每个人独立的url,可以以代码类别或者性质命名创建(也可以凭个人喜好),每个账号只能创建5个命名空间,不过也够用了。
  然后创建镜像仓库。
在这里插入图片描述
  地域选择离自己比较近的地域,这样延迟会稍微低一些,选择已创建的命名空间,仓库名的命名一般是服务名或者软件名。公开或者私有看个人请款选择。

上传镜像

  有了仓库之后,我们就可以上传镜像了。

打标签

  要上传镜像,第一步,要先重新打标签,将阿里云的仓库源的地址,仓库名,以及版本号重新打标签,生成新镜像。例如对已有的haproxy镜像重新打标签,因为我选择的是北京节点,所以打标命令如下:

docker tag haproxy-base:v1 registry.cn-beijing.aliyuncs.com/【命名空间名称】/【仓库名】:【版本号】

登陆

  想上传或者下载镜像一般都需要授权才可以,这就要求我们要用有权限的帐号登陆,才可以上传镜像或者下载镜像。

root@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5# docker login --username=【账号名】 registry.cn-beijing.aliyuncs.com
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@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5# 

上传

  用docker images可以查看所有的镜像,选择已经打了阿里云网址的标签的镜像上传就可以了

root@DockerUbuntu:/opt/dockerfile/web/haproxy/2.0.5# docker push registry.cn-beijing.aliyuncs.com/【命名空间名称】/【仓库名】:【版本号】
The push refers to repository [registry.cn-beijing.aliyuncs.com/命名空间名/仓库名]
0ec88a00d427: Pushed 
6a6e6f03a1a5: Pushed 
965bdb9c5299: Pushed 
a1d450e33837: Pushed 
837dac687863: Pushed 
b39d6a9ec3e2: Pushed 
1e7fbf47b8df: Pushed 
dc298319f184: Pushed 
e4809dffd3aa: Pushed 
b3cdf76b6336: Pushed 
2fc5c4732662: Pushed 
2d03b9db6c3f: Pushed 
89169d87dbe2: Pushed 
haproxy: digest: sha256:f0b4157cd18498e4bc373e333e4fb0b85a65d00e03de2d65015b0d0da9099af6 size: 3049

  这时就上传成功了

拉取镜像

  其他主机登陆成功之后,通过拉取命令就可以从阿里云端下载镜像了。

[root@DockerCentOS ~]# docker pull registry.cn-beijing.aliyuncs.com/【命名空间名称】/【仓库名】:【版本号】
haproxy: Pulling from xxxxxxxxxx/web
ac9208207ada: Already exists 
75c124fe932b: Pull complete 
9ef7eb04bb69: Pull complete 
c5f97c472240: Pull complete 
9dc49af65399: Pull complete 
a745615abdba: Pull complete 
ddcf37c0f462: Pull complete 
0c406d186167: Pull complete 
246fafa1cb32: Pull complete 
057e62247ad8: Pull complete 
770d7edff222: Pull complete 
b4064e1ed3ec: Pull complete 
d0a103ae1f19: Pull complete 
Digest: sha256:f0b4157cd18498e4bc373e333e4fb0b85a65d00e03de2d65015b0d0da9099af6
Status: Downloaded newer image for registry.cn-beijing.aliyuncs.com/xxxxxxxxxx/web:haproxy
registry.cn-beijing.aliyuncs.com/xxxxxxxxxx/web:haproxy

  这时就可以在docker images的镜像列表中看到刚刚拉取的镜像了。

搭建私有仓库

  阿里云镜像仓库虽然很方便,但是在生产环境中,每次都从云端拉取或者上传至云端仓库,太消耗企业带宽,有时候数据繁忙的时候,很有可能会堵塞业务,而且速度也较慢。所以企业中都会基于内部局域网搭建企业内部使用的私有仓库。一般搭建私有仓库有两种解决方案,一个是docker自带的Docker Registry,还有就是由vmware公司开源的harbor。

Docker Registry

  Docker Registry 作为 Docker 的核心组件之一负责镜像内容的存储与分发, 客户端的 docker pull 以及 push 命令都将直接与 registry 进行交互,最初版本的 registry由Python实现,由于设计初期在安全性, 性能以及API的设计上有着诸多的缺陷,该版本在 0.9 之后停止了开发,由新的项目 distribution(新的 docker register 被称为 Distribution)来重新设计并开发下一代 registry,新的项目由 go 语言开发,所有的 API, 底层存储方式, 系统架构都进行了全面的重新设计已解决上一代registry 中存在的问题, 2016 年 4 月份 rgistry 2.0 正式发布, docker 1.6 版本开始支持 registry 2.0,而八月份随着 docker 1.8 发布, docker hub 正式启用 2.1 版本registry 全面替代之前版本 registry,新版 registry 对镜像存储格式进行了重新设计并和旧版不兼容, docker 1.5 和之前的版本无法读取 2.0 的镜像, 另外, Registry2.4 版本之后支持了回收站机制,也就是可以删除镜像了,在 2.4 版本之前是无法支持删除镜像的,所以如果你要使用最好是大于 Registry 2.4 版本的。
  Docker Registry的优势就是比较小(25M),但是功能表比较简单。

下载 docker registry 镜像

[root@DockerCentOS ~]# docker pull registry
Using default tag: latest
latest: Pulling from library/registry
c87736221ed0: Pull complete 
1cc8e0bb44df: Pull complete 
54d33bcb37f5: Pull complete 
e8afc091c171: Pull complete 
b4541f6d3db6: Pull complete 
Digest: sha256:8004747f1e8cd820a148fb7499d71a76d45ff66bac6a29129bfdbfdc0154d146
Status: Downloaded newer image for registry:latest
docker.io/library/registry:latest

搭建单机仓库

  先创建授权使用目录

mkdir -p /docker/auth

  创建一个用户并创建密码文件

cd /docker
docker run --entrypoint htpasswd registry -Bbn Mice 123456 > auth/htpasswd #创建一个用户并生成密码

  验证用户名密码

[root@DockerCentOS docker]# cat auth/htpasswd
Mice:$2y$05$XqNS4BH3gkxodR9MQyhnIuL19uT4wfa6MjUgXvJUYuo0T0o0J8Tzy

  从registry镜像中启动 docker registry,指定容器名称为registry1,挂载本地/docker/auth目录至容器的/auth目录,传递账号密码变量至容器。

docker run -d -p 5000:5000 --restart=always \
--name registry1 \
-v /docker/auth:/auth \
-e "REGISTRY_AUTH=htpasswd" \
-e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd\
 registry

  此时如果用我们创建的用户名密码尝试登陆了,记得IP或者域名后面要加5000端口,否则会报502错误。

root@DockerUbuntu19:~# docker login 192.168.32.20
Username: Mice
Password: 
Error response from daemon: login attempt to http://192.168.32.20/v2/ failed with status: 502 Bad Gateway

  不过很有可能当你加上5000端口,可能还会有报错。ヾ(≧O≦)〃嗷~

root@DockerUbuntu19:~# docker login 192.168.32.20:5000
Username: Mice
Password: 
Error response from daemon: Get https://192.168.32.20:5000/v2/: http: server gave HTTP response to HTTPS client

  这是因为我们每一个docker主机要设置允许insecure-registries,加上我们registry仓库的IP或者域名。
  同样,可以修改/lib/systemd/system/docker.service启动脚本文件,或者/etc/docker/daemon.json文件,推荐修改/etc/docker/daemon.json文件。

{
  "registry-mirrors": ["https://360k4x9i.mirror.aliyuncs.com"],
  "insecure-registries": ["192.168.32.19","DockerCentOS20:5000"],
  "bip": "10.20.0.1/24"
}

  然后重启docker服务,此时再尝试登陆,就回提示登陆成功。

root@DockerUbuntu19:~# docker login DockerCentOS20:5000
Username: Mice
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

  之后就与阿里云的镜像仓库使用方法相同了,不过速度上会快很多(毕竟内网),可以如果要上传镜像至regist仓库,先打好标签就可以了,下载写明下载仓库源,也就可以正常下载了。ヾ(=゚・゚=)ノ喵♪

Harbor

  Harbor是一个用于存储和分发Docker镜像的企业级Registry服务器, 由vmware开源,其通过添加一些企业必需的功能特性,例如安全、标识和管理等, 扩展了开源 Docker Distribution。作为一个企业级私有Registry服务器,Harbor 提供了更好的性能和安全。提升用户使用Registry构建和运行环境传输镜像的效率。Harbor支持安装在多个Registry节点的镜像资源复制, 镜像全部保存在私有Registry中,确保数据和知识产权在公司内部网络中管控, 另外,Harbor也提供了高级的安全特性,诸如用户管理,访问控制和活动审计等 ,所以企业生产中,我们更多会选择Harbor。

下载harbor安装包

  下载地址: https://github.com/vmware/harbor/releases
  安装文档:https://github.com/vmware/harbor/blob/master/docs/installation_guide.md
  本次以harbor的1.75版本为例,演示harbor的安装过程。
  下载离线包,并解压。

cd /usr/local/src
wget https://storage.googleapis.com/harbor-releases/release-1.7.0/harbor-offline-installer-v1.7.5.tgz
tar xvf harbor-offline-installer-v1.7.5.tgz

  也可以下载在线安装包,但里面没有镜像,之后还要去拉取镜像,不适合生产环境。

安装docker-compose

  Harbor是需要使用docker编排工具docker-compose安装,docker-compose我们之后会专门介绍。而且对docker-compose版本是有要求的,可以查看上面的官方文档链接查看确切版本。
Harbor要求
  而如果使用包管理工具yum或者apt直接安装的docker-compose可能版本会比较低,我们这里采用python包管理工具python-pip来安装docker-compose

apt install python-pip -y
pip install docker-compose

  然后可以通过命令docker compose -v看到docker-compose版本已经是最新稳定版1.25版本了。

root@DockerUbuntu19:/usr/local/src# docker-compose -v
docker-compose version 1.25.0, build b42d419

安装Harbor

  我们习惯于将源码包放在/usr/local/src下,而将主程序放在/usr/local/目录中,所以我们可以将harbor目录的的路径改为/usr/local/harbor,可以通过mv命令,也可以通过软链接方式实现

ln -sv /usr/local/src/harbor /usr/local/

  然后修改配置文件harbor.cfg

cd /usr/local/harbor
vim harbor.cfg

  修改其中主机名(改为IP或者域名),管理员登录密码,及邮箱即可。

hostname = 192.168.32.19
email_identity = harbor
email_server = smtp.163.com
email_server_port = 25
email_username = [email protected]
email_password = XXXXXXXXXX
email_from = admin <[email protected]>
harbor_admin_password = XXXXXXXXXXXXX

  然后更新配置文件中的环境变量到安装文件中,忘记更新环境变量会提示找不到环境变量文件ERROR: Couldn't find env file: /usr/local/src/harbor/common/config/core/env

./prepare

  此时就可以执行命令,来创建并安装Harbor了。

docker-compose up -d

  或者执行官方脚本(两个都可以)

./install.sh

  这时候就可以通过浏览器访问我们刚刚搭建的harbor仓库了,至此企业私有仓库就算是搭建好了。
在这里插入图片描述
  管理员用户名为admin,密码为我们之前在配置文件中修改的harbor_admin_password
  后期如果需要修改配置文件信息,需要先停止harbor,然后修改信息后,更新配置文件信息至harbor服务,之后再试用docker-compose up -d启动harbor服务即可,流程如下。

cd /usr/local/harbor
docker-compose stop
vim harbor.cfg
./prepare
docker-compose up -d

在这里插入图片描述  推送流程与使用其他云镜像仓库相同,先打标签,开头加上ip/仓库名,然后直接推送即可。

启用https

  harbor还支持https加密协议传输,企业内部使用可能对此需求不大,可以不设置,不过当镜像仓库要经过公网环境时,就必须要采用https加密协议了。
  下面就具体演示下,harbor实现https加密的配置。
  想实现https,首先需要证书和秘钥,如果有已经签发好nginx证书等的可以直接拿来使用,或者去专门为harbor域名申请一个证书。我们这里就自签名一个证书作为演示。

mkdir -p /usr/local/src/harbor/certs/
openssl genrsa -out /usr/local/src/harbor/certs/harbor-ca.key 2048 #生成秘钥
touch /root/.rnd  #不做这一步也可以,不过会提示random number generator:RAND_load_file:Cannot open file../crypto/rand/randfile.c:88:Filename=/root/.rnd
openssl req -x509 -new -nodes -key /usr/local/src/harbor/certs/harbor-ca.key -subj "/CN=harbor.local.com" -days 7120 -out /usr/local/src/harbor/certs/harbor-ca.crt  #签发证书

  有了证书我们就可以修改harbor的配置文件了

cd /usr/local/src/harbor/
vim harbor.cfg

  接着前面的操作,这次仅修改hostnameui_url_protocolssl_certssl_cert_key几项就可以了。

hostname = harbor.local.com
ui_url_protocol = https
ssl_cert = /usr/local/src/harbor/certs/harbor-ca.crt
ssl_cert_key = /usr/local/src/harbor/certs/harbor-ca.key

  然后重新加载配置文件并启动harbor服务

./prepare
docker-compose up -d

  配置好host解析,windows修改C:\Windows\System32\drivers\etc\hosts,linux主机修改/etc/hosts文件。
  直接访问https://harbor.local.com就可以进入我们的harbor登陆界面了。
  不过这时,我们的docker主机还是不能上传和拉取镜像。需要将harbor的证书分发到各个主机,如果是各大CA签发的证书,就不需要这一步了。
  我们可以执行下面脚本来完成分发任务。

#!/bin/bash
#目标主机列表
PASSWORD=XXXXXX
IP="
192.168.32.18
192.168.32.19
192.168.32.20
"
which sshpass &> /dev/null || apt update;apt install sshpass -y #适用于Ubuntu
for node in ${IP};do
        sshpass -p $PASSWORD ssh-copy-id -p22 -o StrictHostKeyChecking=no ${node}
        if [ $? -eq 0 ];then
                echo "${node} 秘钥 copy 完成,准备环境初始化....."
                ssh -p22 ${node} "mkdir /etc/docker/certs.d/harbor.local.com -p"
                echo "Harbor 证书目录创建成功!"
                scp -P22 /usr/local/src/harbor/certs/harbor-ca.crt ${node}:/etc/docker/certs.d/harbor.local.com/harbor-ca.crt
                echo "Harbor 证书拷贝成功!"
#               scp -P22 /etc/hosts ${node}:/etc/hosts
#               echo "host 文件拷贝完成"
                scp -r -P22 /root/.docker ${node}:/root/
                echo "Harbor 认证文件拷贝完成!"
#               scp -r -P22 /etc/resolv.conf ${node}:/etc/
        else
                echo "${node} 秘钥 copy 失败"
        fi
done

  将三台主机证书都放置进去,并且还做了ssh免密登陆。此时就可以在三个主机上使用命令docker login harbor.local.com登陆我们的harbor仓库了。之后拉取镜像与上传镜像就与之前一样了。

Harbor的高可用

  搭建两个harbor主机,在web界面设置目标仓库为对方IP,每个仓库都分别设置好复制规则之后,确保两个harbor上有相同的数据。
然后在两个harbor主机上都安装keepalived,并设置VIP,并验证VIP漂移成功。
  之后用VIP或者指向VIP的域名就可以访问了。而且可以通过VIP正常拉取镜像,不过在VIP发生漂移的时候,连接会断开,需要重新登陆。如果想实现redis会话共享,就需要单独安装redis集群实现了。

发布了43 篇原创文章 · 获赞 52 · 访问量 8589

猜你喜欢

转载自blog.csdn.net/MicePro/article/details/103438838
今日推荐