一、搭建配置harbor私有仓库
由于harbor的环境依赖docker和docker-compose工具,所以在搭建harbor私有仓库之前需先安装docker和docker-compose
1.使用yum安装docker-ce:
sudo yum install -y yum-utils
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo sed -i 's+https://download.docker.com+https://mirrors.tuna.tsinghua.edu.cn/docker-ce+' /etc/yum.repos.d/docker-ce.repo
安装docker-ce
sudo yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
2.安装docker-compose:
先安装python3-pip
更新pip
使用pip安装docker-compose
docker-compose安装成功
3.修改harbor的配置文件
解压harbor安装包到的harbor目录,进入harbor目录,修改harbor的配置文件harbor.yml,修改如下配置
4.运行脚本部署harbor
运行install脚本,附加扫描器功能
运行成功
在本地hosts文件中添加域名解析后,就可以通过浏览器访问harbor的页面
5.测试docker push镜像
要想是docker能push到该私有registry上镜像,需要先登录,并且接受不安全的harbor站点地址,
在/etc/docker/daemon.json文件中添加insecure-registries选项,将harbor的地址写进去:
修改后,重启docker
docker info中能看到添加的insecure-registries
docker登录该私有仓库,用户名密码与登录web的相同
给本地镜像打私有仓库的tag:
push镜像
成功后可以通过web查看push成功的镜像
6.测试docker pull镜像
从另外一台机器上测试docker pull镜像
7.配置harbor的https
创建自签证书
在配置文件/usr/local/src/harbor/harbor.yml里打开https协议、端口、证书、key的参数(每行缩进格式要对齐,否则运行install.sh脚本时会报错)
二、配置harbor仓库之间的复制规则及高可用
首先搭建两个harbor镜像仓库(harbor1和harbor2,搭建步骤如上文),在两个harbor仓库之上使用haproxy代理实现负载均衡,搭配harbor自带的复制功能保证两边的数据同步;
在Harbor1上添加目标仓库harbor2(仓库管理--新建目标,这里有个坑,目标仓库地址最好使用IP地址的url,使用域名的url怎么也连不上):
关于通过域名url连不上的问题原因:做实验时在节点上的/etc/hosts文件里添加了域名解析,但运行harbor的harbor-jobserver容器查不到这个解析,他是递归查询容器自己的/etc/hosts文件-->宿主机的nameserver,不会查询宿主机的/etc/hosts文件。最好的解决方法是将域名解析写到nameserver里。
在Harbor1上新建复制规则,一般选择Push-based,本地有新镜像了自动推到目标仓库,资源过滤器表示可以过滤一些tag、标签,目标仓库就是上面添加的目标仓库,目标名称空间不写默认推到本地仓库的相同名称空间,仓库扁平化指镜像复制后harbor会对应的修改镜像的拉取地址,替换级别如下图,触发模式有手动、定时和时间驱动,一般选事件驱动;
保存后,可先指定push到harbor1上,测试一下能否成功触发自动复制,复制规则下可以看到复制任务的状态、日志等
测试没问题后,同样的步骤在Harbor2上添加目标仓库harbor1,新建复制规则,双向复制测试成功,就表示双仓库的同步配置完成。
从另外一台虚机上部署haproxy,代理两台harbor,实现负载均衡,即使调度到不同harbor上,也能保证数据同步;
安装haproxy,可以使用yum、可使用源码编译安装,这里不详述;
配置文件/etc/haproxy/haproxy.cfg
添加listen bind mode balance server 参数,之后启动haproxy
在docker虚机上添加对haproxy IP的域名解析,就可以通过haproxy的域名访问后端的两台harbor机器;
同样的将haproxy的访问地址添加到docker虚机的insecure-registries里,然后docker login https://haproxy就可以测试镜像的push/pull
三、docker网络
1.通过自定义容器别名互联
在同一个宿主机上容器之间可以通过自定义容器名称/别名相互访问,由于容器在启动的时候其内部IP地址是HDCP分配的,IP地址不容易固定,使用自定义容器名称相对比较固定,此方式最少需要两个容器之间操作;
#docker run -d --name 新容器名称 --link 目标容器名称:自定义容器别名 -p 本地端口:容器端口 镜像名称
其中目标容器名称可以变,只要自定义容器别名不变,新容器里/etc/hosts文件里始终会保存目标容器IP 目标容器名称 自定义容器别名的对应关系,新容器可以通过自定义容器别名访问新的目标容器;
2.docker网络模型
Bridge模式
使用参数--net=bridge指定,docker网络默认就是bridge模式
Host模式
使用参数--net=host指定,新建容器时不会创建容器自己的虚拟网卡,容器直接使用宿主机的网络信息,在容器里查看到的IP信息与宿主机的IP信息是一致的,访问容器时直接访问宿主机的IP+端口,此模式网络性能最高,但各容器之间端口不能相同,适用于运行容器端口比较固定的业务,此模式不支持端口映射,运行容器时不能用-p参数指定端口映射;
None模式
使用参数--net=none指定,使用none模式的容器没有虚拟网卡,没有IP,没有路由,因此默认无法与外界通信,适用于单独跑一些数据分析、数据计算等应用;
Container模式
使用参数--net=container:容器名称或容器ID指定,此模式的容器需指定和一个已经存在的容器共享网络,共享指定容器的IP和端口范围,因此这个容器的端口不能与被指定容器的端口冲突,两个容器可以通过lo网卡进行通信;
四、安装docker-compose并利用它组装一个多容器的服务
docker-compose安装如上文安装harbor的过程;
使用docker-compose启动一个或多个容器
通过docker-compose.yaml文件定义容器的service、container参数,与k8s的yaml文件格式类似;
必须在docker-compose.yaml文件所在的目录下执行
#docker-compose up -d #根据docker-compose.yaml文件定义的参数启动容器 -d表示后台运行容器
#docker-compose stop #停止当前docker-compose.yaml文件里的所有service、container
#docker-compse start #启动当前docker-compose.yaml文件里的所有service、container
#docker-compose ps --service #查看当前docker-compose.yaml文件里的所有service名称
示例:
1.准备haproxy、nginx、tomcat镜像,并push到自己搭建的harbor上;
2.准备haproxy、nginx的配置文件和nginx、tomcat的网页文件,实现通过nginx可以访问静态页面,通过tomcat访问动态页面
haproxy.cfg文件
nginx.conf文件
3.准备docker-compose.yml文件,haproxy代理nginx、tomcat的应用
4.在docker-compose.yml文件所在目录执行docker-compose up -d部署该示例
5.测试效果
通过宿主机8082端口默认能访问到nginx容器下的静态页面
t
通过宿主机的8082/app路径能访问到tomcat容器下的动态页面,并能根据nginx.conf配置的负载均衡策略进行轮询
通过宿主机的9999/haproxy_status路径可看到haproxy代理应用的状态
扫一扫关注作者公众号