💯 作者: 俗世游子【谢先生】。 8年开发3年架构。专注于Java、云原生、大数据等领域技术。

💥 成就: 从CRUD入行,负责过亿级流量架构的设计和落地,解决了千万级数据治理问题。

📖 同名社区:​​51CTO​​​、 ​​github​​​、掘金​、​​gitee​​​。

📂 清单: ​​​goku-framework​​​、​【更新中】享阅读II

DevOps系列

​深入浅出DevOps:DevOps核心思想​

​深入浅出DevOps:版本控制Git&Gitlab​

​深入浅出DevOps:持续集成工具Jenkins​

​深入浅出DevOps:简易Docker入门​

​深入浅出DevOps:Jenkins实战之CI​

​深入浅出DevOps:SonarQube提升代码质量​

​深入浅出DevOps:SonarQube提升代码质量【下】​

​深入浅出DevOps:Jenkins构建器​


前言

在《04.容器化:Docker入门》中,我们已经介绍了关于Docker的相关知识点,相信大家对于Docker中的镜像已经有了一个认识。不知道大家有没有这样的疑问:

  • 在执行​​docker search mysql​​​或者​​docker pull mysql​​这样的命令的时候,这些镜像都是哪里来的?
  • 如果我想希望自己构建的镜像也能这样非常方便的执行在各大服务器上应该怎么做?

关于镜像仓库的介绍

那么,这里就需要着重介绍 镜像仓库。大家可以将它理解和代码仓库是一样的功能,不过镜像仓库实专门用来存放代码构建后镜像的存储空间。

而且将镜像上传到仓库以后,其他人可以直接通过pull方式,在自己的机器上运行。

镜像仓库按照部署方式可以分为三类,下面我们就具体来了解吧

Docker hub

默认情况下,我们所下载的镜像都是来自官方仓库,通过访问​​hub.docker.com​​进入到官网,以后可以通过搜索的方式找到自己想要的镜像

官方仓库很多情况下使用并不是非常方便,所以官方仓库并不适合很多公司

感兴趣的同学可以注册账号,尝试上传自己的基础镜像

第三方服务

俗话说,挖资本主义墙角,薅社会主羊毛。

现在各种云服务厂商都提供了非常完善的镜像管理的功能,比如

  • 阿里云的容器镜像服务,个人版支持免费使用,不过容量有限

这里也不会过多介绍,自己可以进入到对应的云服务厂商上玩耍,操作方式还是比较详细的

Harbor私有仓库

Docker容器应用的开发和运行离不开可靠的镜像管理,虽然Docker官方也提供了公共的镜像仓库,但是从安全和效率等方面考虑,部署我们私有环境内的Registry也是非常必要的。

Harbor是由VMware公司开源的企业级的Docker Registry管理项目,它包括权限管理(RBAC)、LDAP、日志审核、管理界面、自我注册、镜像复制和中文支持等功能。

DockerCompose

这里不做过多的介绍,只需要知道它能够管理容器即可。随后在K8s系列中完整介绍

curl -L https://get.daocloud.io/docker/compose/releases/download/v2.10.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 验证
docker-compose version

安装

Harbor是一款开源软件,在Github上能够找到相关的程序和下载包,​​点击这里​​进入到Github的下载页面,选择对应的版本进行下载就好,我这里使用的是最新版本:2.5.0

建议准备环境:2C 4G,服务器需要安装Docker,Docker-Compose

  • 解压文件

tar xf harbor-offline-installer-v2.5.0.tgz -C /usr/local/ && cd /usr/local/harbor

  • 基础配置

cp harbor.yml.tmpl harbor.yml
vim harbor.yml

进入到配置文件内容之后,如果没有其他特殊要求,其实我们只需要改动如下配置就可以正常的执行启动程序了

# 改为自己服务器的IP或者设置的域名
hostname: 192.168.10.201
http:
# http开放的端口,默认为80,
port: 80

# harbor默认账号的默认密码
harbor_admin_password: Harbor12345

这里要注意:我们暂时没有设置https,所以在配置的时候需要先将443相关的配置注释掉

# 需要注释掉
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

  • 编译执行

./install.sh

如果查看过install.sh文件的话就会发现,当前文件内容最终还是会执行​​docker-compose up -d​​来启动Harbor程序。这对我们来说整个安装就很简单了

深入浅出DevOps:私有镜像仓库Harbor_镜像仓库

当发现出现如下容器的时候,说明Harbor程序已经正常启动,那么我们通过​​http://ip:port​​来访问,通过admin/Harbor12345进入到控制台

等待出现如下界面,成功完成安装

深入浅出DevOps:私有镜像仓库Harbor_DevOps_02

停止服务

当执行完install.sh之后,在程序的目录下会生成​​docker-compose.yml​​文件,我们只需要操作它就能操作Harbor所启动的容器了

docker-compose stop

深入浅出DevOps:私有镜像仓库Harbor_镜像仓库_03

https配置

默认情况下,Harbor 不附带证书,但是Harbor推荐在生产环境上使用https的方式,能够很大程度上保证请求的安全

在上面的启动容器内我们发现,我们所访问的请求其实是通过nginx接收请求的,抽根烟的功夫一想就能明白。这其实就是为nginx设置https的方式

非必须配置,但是建议设置

那接下来我们就来看看整个设置的流程吧,整个流程根据官网文档一步步进行验证并总结,​​点击进入​​官方说明

不想看官网的同学继续往下看吧

生成CA证书

生产环境中,您应该从 CA 获取证书。在测试或开发环境中,我们自己生成一个证书就行

  • 生成私钥

openssl genrsa -out ca.key 4096

  • 生成证书

openssl req -x509 -new -nodes -sha512 -days 3650 \
-subj "/C=CN/ST=Beijing/L=Beijing/O=example/OU=Personal/CN=192.168.10.201" \
-key ca.key \
-out ca.crt

这里着重要注意​​-subj​​​下的​​CN=​​,根据自己的条件选择填写域名还是IP

生成服务器证书

证书通常包含一个​​.crt​​​文件和一个​​.key​​​文件。我们这里就设置为​​192.168.10.201.crt​​​和​​192.168.10.201.key​

  • 生成私钥

openssl genrsa -out 192.168.10.201.key 4096

  • 生成证书签名请求

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

还是一句话,注意​​CN=​

  • 生成 x509 v3 扩展文件

cat > v3.ext <<-EOF
authorityKeyIdentifier=keyid,issuer
basicCnotallow=CA:FALSE
keyUsage = digitalSignature, nonRepudiation, keyEncipherment, dataEncipherment
extendedKeyUsage = serverAuth
subjectAltName = @alt_names

[alt_names]
DNS.1=192.168.10.201
EOF

着重关注DNS,这里可以设置多个

  • 生成证书

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

文件归档
  • 复制到Harbor挂载目录下,用于配置

mkdir -p /data/cert
cp 192.168.10.201.crt /data/cert/ && cp 192.168.10.201.key /data/cert/

然后去配置​​harbor.yml​

# https related config
https:
# https port for harbor, default is 443
port: 443
# The path of cert and key files for nginx
certificate: /data/cert/192.168.10.201.crt
private_key: /data/cert/192.168.10.201.key

  • 生成客户端证书

openssl x509 -inform PEM -in 192.168.10.201.crt -out 192.168.10.201.cert

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

整体的目录必须是这样的

  • /etc/docker/certs.d/192.168.10.201

如果不采用默认443的端口,那么你需要创建如下目录

  • /etc/docker/certs.d/192.168.10.201:端口

然后复制文件

cp 192.168.10.201.cert /etc/docker/certs.d/192.168.10.201/
cp 192.168.10.201.key /etc/docker/certs.d/192.168.10.201/
cp ca.crt /etc/docker/certs.d192.168.10.201/

最后一步

重启docker服务,重新构建harbor容器

systemctl restart docker

cd /usr/local/harbor
./install.sh

看到如下的图,说明整个配置已经全部配置完成

深入浅出DevOps:私有镜像仓库Harbor_Harbor_04

深入浅出DevOps:私有镜像仓库Harbor_DevOps_05

基本使用

整个Harbor到目前为止就已经全部完成,接下来我们就使用起来吧。

项目这个功能属于Harbor的核心功能。我们可以将这个功能理解为隔离资源,通过不同的项目我们可以管理不同的的镜像文件

接下来我们就先来创建一个项目,然后看看如何将本地镜像上传上来吧

创建项目

深入浅出DevOps:私有镜像仓库Harbor_DevOps_06

相信这个功能就不用多说了,大家都理解。这里多说一句:

  • 将访问级别设置为公开,那么所有人都可访问公开的项目仓库

Docker配置

通过docker将本地镜像上传到Harbor主要分为三步:

  • 登录到Harbor上
  • 对本地镜像进行重命名
  • 推送镜像
登录到Harbor

登录作为最重要的一步,我们还是先来看如何操作吧

docker login -u admin -p Harbor12345 192.168.10.201

通过​​docker login​​的命令能够登录到对应的仓库上,但是我们如果直接这样登录Harbor的话,会出现如下的问题

深入浅出DevOps:私有镜像仓库Harbor_Harbor_07

还记得我们直接改过的​​daemon.json​​文件么,我们需要加一条配置使Docker能够支持Harbor

"insecure-registries":["192.168.10.201"]

随后重启docker

systemctl daemon-reload
systemctl restart docker

当我们启动之后再次登录,出现如下字样说明登录成功

深入浅出DevOps:私有镜像仓库Harbor_镜像仓库_08

这里要非常注意:
Harbor默认端口是443,如果没有https的话,在随后的操作中一定要带上http.port配置的端口,否则无法访问

镜像重命名

虽说是镜像重命名,但是我们可能不知道新的镜像名称如何配置,别慌。在Harbor项目下已经为我们说明了一切!!

深入浅出DevOps:私有镜像仓库Harbor_镜像仓库_09

这些知名开源产品还是非常贴心的,在很多地方都为我们给出了相关的说明。

那么我们就来看操作,在我本地的机器上有之前曾经构建过的项目,我来给大家查看一下。接下来我就将第一个项目上传到Harbor仓库中

深入浅出DevOps:私有镜像仓库Harbor_镜像仓库_10

直接将Harbor中的命令拷贝出来,我们调整一下

docker tag 26ee73ace20f 192.168.10.201/presentation/module01:v0.0.7

这里是可以直接通过镜像ID来操作的,展示结果看下图

别慌,他们就是属于同一个镜像文件,所以镜像ID是一样的

深入浅出DevOps:私有镜像仓库Harbor_Harbor_11

推送镜像

最终我们要推送的是我们重命名之后的镜像,那么我们接下来就通过push命令来操作吧

由于存在相同ID的镜像,所以这里采用名称来推送

docker push 192.168.10.201/presentation/module01:v0.0.7

深入浅出DevOps:私有镜像仓库Harbor_镜像仓库_12

完美收工,就这样已经推送完成了。

如果想要拉取下来的,直接通过​​docker pull 192.168.10.201/presentation/module01:v0.0.7​​就能拉取然后直接使用

最后

Harbor中除了关于项目的功能之外,其他的功能并没有提到,相对比而言是比较简单的。大家下来自己玩一玩这个东西,相信很快就能上手。

随后我们继续回归到Jenkins上,下一节的目标是这样的:

  • Jenkins通过docker将镜像push到Harbor中,测试服务器在Harbor上拉取镜像运行测试

敬请期待吧!!!