关于系统的改造探索
第一部分——Docker篇
第一章 Docker容器
第二章 Docker安装
第三章 构建自定义镜像
第四章 搭建镜像仓库
第五章 容器编排
第六章 容器监控
前言
随着业务的发展,传统的架构已经不符合项目的要求了。双活、集群也渐渐提上了日程。。。
云上开发,最不方便的地方就是不能连外网,查资料,下载东西非常麻烦。上边配置的 Docker仓库,就无法连接上阿里云,并且我们自己构建的 镜像 需要上传到一个公共的地方,方便各个机子拉取。这时候就需要搭建 Docker私服
搭建 Docker私服 有几种方式:Registry、Nexus、Harbor 这里逐一搭建下吧
Registry
Registry 是官方提供的镜像仓库。仅能使用api和json进行操作,不够友好,所以一般情况下不用这个,了解即可
- 运行Registry
docker run -itd -p 5000:5000 --name registry registry
访问:http://ip:5000/v2/_catalog,不出意外的话,会出现以下界面:
- 推送镜像
在操作之前,需要配置一下/etc/docker/daemon.json文件,具体配置如下:
{
"registry-mirrors": ["加速地址"],
//这里配置是让docker信任该地址,否则会提示https安全问题
"insecure-registries":["registry-ip:5000"]
}
重启下 Docker:
systemctl daemon-reload
systemctl restart docker
这样私有仓库就配置完成了
在上传进行之前还需要重命名下 镜像 的名称,Docker 会根据镜像名称选择上传的仓库。如下:
#重命名成registry仓库地址
docker tag nginx 192.168.233.130:5000/nginx
#上传镜像
docker push 192.168.233.130:5000/nginx
再次访问:http://ip:5000/v2/_catalog,出现 Nginx 镜像。如下:
- 拉取 镜像
执行下列命令从私服拉取 镜像:
docker pull 192.168.233.130:5000/nginx
注:这里拉取的时候需要添加私服地址,这涉及到docker镜像命名的问题,如果直接通过镜像拉取,并不是像Maven那样:先去私服找,再去公网找,即使配置了私服地址也没用,官方貌似拒绝了这个提案。RedHat系统可以添加 --add-registry 和 --block-registry 进行覆盖,其他系统就不行了,github也有相应的讨论
Nexus
现在 Docker镜像 的仓库已不少了,之所以带 Nexus 玩,主要还是因为之前 Maven私服 也是用 Nexus 搭建的,这样可以充分利用资源。嘿嘿~~
- 安装 Nexus
Nexus 还是用 Docker 进行安装,先启动 Nexus,命令如下:
docker run -d -p 8081:8081 -p 8082:8082 -p 8083:8083 -v /etc/localtime:/etc/localtime --name nexus3 sonatype/nexus3
Nexus3 默认用户名是 admin,密码需要进入容器内部进行查看。如下:
#进入容器内部
docker exec -it nexus3 bash
tail -200f /nexus-data/admin.password
2.创建仓库
现在只需要在 Nexus提供的界面上建立 Docker仓库 即可。具体步骤如下:
按照上面配置直接创建仓库即可。创建完成 Nexus 会多个 Docker仓库
- 推送 镜像
推送镜像和Registry 一样,配置一下 /etc/docker/daemon.json 文件。如下:
{
"registry-mirrors": ["加速地址"],
//这里配置是让docker信任该地址,否则会提示https安全问题
"insecure-registries":["nexus-ip:8082","registry-ip:5000"]
}
重启下 Docker:
systemctl daemon-reload
systemctl restart docker
接着需要先登录到 Nexus(Nexus存在权限校验)再进行推送。如下:
#登录Nexus
docker login -u admin -p admin nexus-ip:8082
#重命名成nexus私库地址
docker tag nginx 192.168.233.130:8082/nginx
#推送镜像
docker push 192.168.233.130:8082/nginx
- 拉取 镜像
拉取镜像和 Registry 一样了,就不一一赘述了
注:不论是Registry还是Nexus,这里只是简单的示例,无法用于实际环境。如果确定使用docker部署,要把数据持久化到服务器,否则容器终止,数据也会消失
Harbor
接下来欢迎本次的主角——Harbor。以下是它的自我介绍:
Harbor 是一个开源可信云原生注册表项目,用于存储、签名和扫描内容。 Harbor 通过添加用户通常需要的功能(例如安全性、身份和管理)来扩展开源 Docker 发行版。让注册表更接近构建和运行环境可以提高映像传输效率。 Harbor 支持注册表之间的镜像复制,还提供高级安全功能,例如用户管理、访问控制和活动审核
看不懂,反正很厉害就是了。之所以选择 Harbor ,还有个原因是:Harbor 也可以作为 Helm仓库( k8s 包管理工具)。让我们先抛弃这些晦涩的概念,先学会怎么用吧
下载 Harbor
虽然 Harbor 是用 Docker 部署的,但是分为几个模块,官方对其进行了整合,还是得下载下安装包。先去官方的github整个安装包(根据实际情况选择版本),这里以2.9.1为例解压
tar -zxvf harbor-offline-installer-v2.9.1.tgz
解压后的目录结构,如下:
可以看到 Harbor 已经准备好了一切
- 安装
在正式安装之前,先改下文件夹名称、添加下配置文件:
mv harbor harbor-install
cd harbor-install
cp harbor.yml.tmpl harbor.yml
再修改下配置文件,打开 harbor.yml,参考配置如下:
#主机名,这里改成ip
hostname: 192.168.233.130
http:
#访问端口,根据实际情况配置
port: 8080
# https相关配置,这里不需要,直接注释,否则会报错
#https:
# port: 443
# certificate: /your/certificate/path
# private_key: /your/private/key/path
#登录密码
harbor_admin_password: Harbor12345
# Harbor DB configuration
database:
password: root123
max_idle_conns: 100
max_open_conns: 900
conn_max_lifetime: 5m
conn_max_idle_time: 0
# 数据存储位置
data_volume: /usr/local/docker/harbor/data
trivy:
ignore_unfixed: false
skip_update: false
offline_scan: false
security_check: vuln
insecure: false
jobservice:
max_job_workers: 10
job_loggers:
- STD_OUTPUT
- FILE
logger_sweeper_duration: 1 #days
notification:
webhook_job_max_retry: 3
webhook_job_http_client_timeout: 3 #seconds
log:
level: info
local:
rotate_count: 50
rotate_size: 200M
#日志存储位置
location: /usr/local/docker/harbor/logs
_version: 2.9.0
proxy:
http_proxy:
https_proxy:
no_proxy:
components:
- core
- jobservice
- trivy
upload_purging:
enabled: true
age: 168h
interval: 24h
dryrun: false
cache:
enabled: false
expire_hours: 24
配置完成后,直接安装即可:
./install.sh
直接访问ip:8080(端口、密码根据上边配置进行填写)
- 推送 镜像
在推送 镜像 之前,先新增一个项目:
接下来的操作,就和 Nexus 大同小异了。配置 /etc/docker/daemon.json 文件。如下:
{
"registry-mirrors": ["加速地址"],
//这里配置是让docker信任该地址,否则会提示https安全问题
"insecure-registries":["harbor-ip:8080","nexus-ip:8082","registry-ip:5000"]
}
重启 Docker:
systemctl daemon-reload
systemctl restart docker
登录、推送。如下:
#登录到Harbor
docker login -u admin -p Harbor12345 192.168.233.130:8080
#重命名为Harbor地址
docker tag nginx 192.168.233.130:8080/test/nginx
#推送到Harbor
docker push 192.168.233.130:8080/test/nginx
相较于 Nexus,Harbor 路径多了个 test,这个即之前创建的项目名
- 拉取 镜像
拉取镜像和推送一样,需要带上项目名:
docker pull 192.168.233.130:8080/test/nginx
总结
上边大致概括了几种搭建 Docker私服 的方式,可根据项目情况进行选择,如果还有其他更方便部署方式,欢迎大家进行补充