Docker registry 、网络类型、跨主机访问 --3
9、Docker私有仓库registry
registry 非图形化的私有仓库(没有网页提供),它是一个服务,比如像nginx服务。既然要容器化,所以针对registry一般会把 registry服务运行在一个容器中,通过容器的共享存储路径,把上传到registry中的镜像,落盘到本地。
9.1 启动registry
[root@docekr ~]# docker pull registry
[root@docekr ~]# docker run -d -p 5000:5000 --restart=always --name="registry" -v /opt/registry:/var/lib/registry registry
[root@docekr ~]# docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61fa39886b83 registry "/entrypoint.sh /etc…" 27 seconds ago Up 26 seconds 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp registry
讲解:
1、 /var/lib/registry registry仓库的中的容器镜像位置
2、默认registry的端口50003、 --restart=always:如果没有此参数,dockers 服务重启后,之前的运行的容器不会重新启动,显示宕掉。注:此参数如果不加,默认等于重启后,容器不会自启动。
如何设置不加此参数,默认就是--restart=always,默认重启容器自启动:
在docker server 的配置文件/etc/docker/daemon.json下加入“live-restore”:ture,代表重启docker, 所有容器重新拉起来。
例子:vi /etc/docker/daemon.json { .................. .................. “live-restore”:ture }
9.2 配置调取本地私有仓库中容器镜像
思考:目前为止拉取镜像直接输入想要的服务程序的名称,默认自动拉取的是dockerhub官网的镜像,如何修改让docker认识registry镜像服务仓库。
修改daemon.jso配置文件,让docker知道有这个地方可以拉去镜像
注意:daemon.json为json格式的文件,所以每行的结尾都要家逗号,例如
[root@docekr ~]# vim /etc/docker/daemon.json
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"], # 为阿里云加速
"insecure-registries": ["10.4.7.7:5000"] # 可以从10.4.7.7的5000端口pull镜像
}
重启docker:
[root@docekr ~]# systemctl restart docker
9.3 push(推)镜像到registry 仓库
思考:已经告知docker认识registry镜像服务仓库,如何拉取registry镜像服务仓库的镜像。
1、镜像名称的格式必须满足要求:
registry仓库IP : 端口 / 镜像名称 / 项目名称 : 标签tag (如10.4.7.7:5000/jerry/nginx:v1)
例子:nginx:v1.14 打成registry 仓库能识别的镜像
[root@docekr ~]# docker image ls |grep nginx
nginx latest ea335eea17ab 3 weeks ago 141MB
nginx 1.14 295c7be07902 2 years ago 109MB
[root@docekr ~]# docker tag nginx:1.14 10.4.7.7:5000/jerry/nging:v1
[root@docekr ~]# docker image ls |grep jerry/nging
10.4.7.7:5000/jerry/nging v1 295c7be07902 2 years ago 109MB
2、推镜像到registry 仓库
[root@docekr docker]# docker push 10.4.7.7:5000/jerry/nging:v1
The push refers to repository [10.4.7.7:5000/jerry/nging]
82ae01d5004e: Pushed
b8f18c3b860b: Pushed
5dacd731af1b: Pushed
v1: digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078 size: 948
如果需要验证可以pull 10.4.7.7:5000/jerry/nginx:v1
3、search搜索镜像
search搜索镜像,查询不到
[root@docekr docker]# docker search 10.4.7.7:5000/jerry/
Error response from daemon: Unexpected status code 404
[root@docekr docker]#
通过http形式访问registry仓库:
注:为了更直观的显示,我们有给registry仓库增加一个镜像
[root@docekr docker]# docker image ls |grep centos
centos 7 eeb6ee3f44bd 2 months ago 204MB
centos 6.9 2199b8eb8390 2 years ago 195MB
[root@docekr docker]# docker tag centos:6.9 10.4.7.7:5000/jerry/centos:v6.9
[root@docekr docker]# docker push 10.4.7.7:5000/jerry/centos:v6.9
1、获取仓库类的镜像:
# 由于registry仓库容器5000被映射在宿主机的5000端口,所以访问宿主机的5000端口就是访问registry仓库容器
[root@docekr docker]# curl -XGET http://10.4.7.7:5000/v2/_catalog
{"repositories":["jerry/centos","jerry/nging"]}
[root@docekr docker]#
2、获取某个镜像的标签列表:
格式:curl -XGET http://容器IP:5000/v2/镜像名称/项目名称/tags/list
[root@docekr docker]# curl -XGET http://10.4.7.7:5000/v2/jerry/centos/tags/list
{"name":"jerry/centos","tags":["v6.9"]}
解决对私有的registry仓库服务进行docker search
背景
使用docker官方项目docker-registry构建好自己私有的docker镜像的registry仓库服务后,测试了docker pull和docker push的功能,都没有问题,但是突然发现我没有办法对私有的registry仓库服务进行docker search。 官方的docker search的使用方法中没有提及怎样使用docker search命令搜索私有的registry,google之后得到的比较靠谱的答案来自于stackoverflow: how-to-search-images-from-private-registry-in-docker ,但是它依然是通过docker-registry的REST API来获得搜索结果。
基本原理分析
先来看看docker search的工作原理
docker hub作为docker默认的官方public registry仓库服务,docker search默认是会去访问它的search api,然后解析搜索结果返回。要想让docker去搜索private registry,那实际上就是让docker deamon访问你的private registry的API,并解析返回的结果。
docker代码实现分析:
根据以上分析,假设我们自己的private registry的search API与docker hub的search API不一样,那这个工作就费劲了;好在我们的private registry的使用的是docker-registry,其search api与docker hub兼容。所以只需要将访问registry的endpoint修改为我们自己private registry就应该可以了。即将https://index.docker.io/v1/search?q=registry修改为http://10.4.7.7:5000/v1/search?q=registry。
hostname, term, err := ResolveRepositoryName(term) endpoint, err := NewEndpoint(hostname) r, err := NewSession(authConfig, HTTPRequestFactory(metaHeaders), endpoint, true) results, err := r.SearchRepositories(term)
我们现在可以通过从代码反推出docker search的用法,上面的代码是从docker/registry/service.go的search函数中抽取出来的,ResolveRepositoryName函数功能就是从用户输入的term(搜索字段)中解析出reigstry的地址和image的名字,我们一般使用docker search时,都是输入centos或者 jim/centos:7这样的字段,不会可以输入docker hub的地址,因为那是docker默认的。那么如果我们输入的搜索字段是 10.4.7.7:5000/redis,从代码逻辑上看解析出来的hostname就应该是10.4.7.7:5000.
总结
假设你的private registry的地址是10.4.7.7:5000,那么你想在自己的私有仓库中搜索镜像,命令应该是:
docker search 192.168.1.104:5000/redis
9.4 异地验证pull registry仓库镜像
1、在其他的Linux系统中,先配置daemon.json认识registry仓库
[root@hdss7-8 ~]# vim /etc/docker/daemon.json
{
......
"insecure-registries": ["10.4.7.7.5000"]# 添加此内容
}
重启docker:
[root@hdss7-8 ~]# systemctl daemon-reload;systemctl restart docker
2、pull registry仓库镜像
[root@hdss7-8 ~]# docker pull 10.4.7.7:5000/jerry/nginx:v1
v1: Pulling from jerry/nginx
27833a3ba0a5: Pull complete
0f23e58bd0b7: Pull complete
8ca774778e85: Pull complete
Digest: sha256:706446e9c6667c0880d5da3f39c09a6c7d2114f5a5d6b74a2fafd24ae30d2078
Status: Downloaded newer image for 10.4.7.7:5000/jerry/nginx:v1
问题1: 替换后指向本地registry 容器,想要下载官方镜像能下载么
问题2: 镜像格式满足要求:192.168.78.4:5000/ / : 如果我想把Cnetos:6.9 上传镜像,能否通过pull centos:6.9 下载镜像
答:192.168.78.4:5000/ / : 如192.168.78.4:5000/oldguo/nginx:v1
为什么写出这样子,因为当你拉取镜像,从192.168.78.4服务器的5000端口访问里面是否存在需要的镜像
问题3:为什么自己制作的docker 不能
docker search 92.168.78.4:5000/oldguo/nginx:v1 找不到
设置密码验证,不能谁都能上传镜像,访问registry 容器通过http协议 5000端口访问 http就是apache, 所以对http设置密码
所以说白了就是registry 容器有http服务,也有httpd-tools工具,所以,只需要在本地安装httpd-tools,生成用户名密码的密钥对,
传到registry 容器里面,registry 容器调取http passwd
9.5 本地仓库加安全认证
生成密码:
[root@localhost ~]# yum install httpd-tools -y httpd-tools http自动生成密钥的工具,用户名密码的密钥对
[root@localhost ~]# mkdir /opt/registry-auth/ -p
[root@localhost ~]# htpasswd -Bbn oldguo 123 >/opt/registry-auth/htpasswd htpasswd -Bbn 用户名 密码
多用户 htpasswd -Bbn 用户名 密码 >> /opt/registry-auth/htpasswd
[root@localhost ~]# cd /opt/registry-auth/
[root@localhost registry-auth]# ll
总用量 4
-rw-r--r-- 1 root root 69 9月 2 05:41 htpasswd
[root@localhost registry-auth]# cat htpasswd
oldguo:$2y$05$B/fZ/LKA6jQGzzGYDKrA0eYc1KiViNUmePSjepT.kjQa1V8rsB67u
9.6 重新启动带有秘钥功能的registry容器
-e 需要加密钥的配置信加上
docker rm -f `docker ps -aq`
docker run -d -p 5000:5000 -v /opt/registry-auth/:/auth/ -v /opt/registry:/var/lib/registry --name register-auth -e "REGISTRY_AUTH=htpasswd" -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" -e "REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd" registry
使用-e,来为秘钥添加配置
[root@localhost registry-auth]# docker run --help
-e、 --env list设置环境变量
--环境变量文件中读取的环境文件列表
--expose list暴露一个或一系列端口
--gpu gpu请求gpu设备添加到容器中(“all”传递所有gpu)
--组添加列表添加要加入的其他组
--运行以检查运行状况的health cmd string命令
--运行状况间隔运行检查之间的持续时间(ms | s | m | h)(默认为0s)
--运行状况重试需要报告不正常的连续故障
--运行状况启动周期持续时间启动运行状况重试倒计时之前容器初始化的开始时间段(ms | s | m | h)(默认为0s)
--运行状况超时持续时间允许运行一个检查的最大时间(ms | s | m | h)(默认为0s)
验证:
[root@localhost ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 6.9 295c7be07902 17 months ago 109MB
[root@docker ~]# docker tag centos:6.9 192.168.78.4:5000/centos/centos:v1 把centos重命名
[root@docker ~]# docker push 192.168.78.4:5000/centos/centos:v1 上传镜像
The push refers to repository [192.168.78.4:5000/centos/centos]
8f38003860b1: Preparing
报错:no basic auth credentials 没有验证
9.7 push镜像,需要进行login
[root@oldboy ~]# docker login 192.168.78.4:5000
Username: oldguo
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@localhost registry-auth]# docker push 192.168.78.4:5000/centos/centos:v1
The push refers to repository [192.168.78.4:5000/centos/centos]
05d69de71693: Pushing [=======> ] 31.76MB/220.2MB
aaa5621d7c01: Pushing [=======> ] 28.74MB/194.8MB
另一台机器:第一次pull,需要登录密码验证。下次就算你退出shell,也不需要登录密码验证
[root@localhost ~]# docker pull 192.168.78.4:5000/centos/centos:v1
Error response from daemon: Get http://192.168.78.4:5000/v2/centos/centos/manifests/v1: no basic auth credentials
[root@localhost ~]# docker login 192.168.78.4:5000
Username: oldguo
Password:
Login Succeeded
[root@localhost ~]# docker pull 192.168.78.4:5000/centos/centos:v1
05d69de71693: pulling [=======> ] 31.76MB/220.2MB
aaa5621d7c01: pulling [=======> ] 28.74MB/194.8MB
10. 重启docker服务,容器全部退出的解决办法
方法一:docker run --restart=always
方法二:"live-restore": true
docker server配置文件/etc/docker/daemon.json参考
{
.....
......
"live-restore": true
}
11. 删除镜像
1)进入docker registry的容器中
docker exec -it registry /bin/sh
2) 删除repo
rm -fr /var/lib/registry/docker/registry/v2/repositories/nginx
3) 清楚掉blob
registry garbage-collect /etc/docker/registry/config.yml
12. habor实现图形化register
1. 安装:
第一步:安装docker和docker-compose
yum install -y docker-compose
第二步:下载harbor-offline-installer-vxxx.tgz
第三步:上传到/opt,并解压
第四步:修改harbor.cfg配置文件
hostname = 10.0.0.100
harbor_admin_password = 123456
第五步:执行install.sh
2. 使用方法:
修改各个节点的docker配置文件
{
"registry-mirrors": ["https://uoggbpok.mirror.aliyuncs.com"],
"insecure-registries": ["10.0.0.100:5000","10.0.0.100"],
"live-restore": true
}
systemctl restart docker
3. 在habor中添加项目
略.
4. 制作镜像并上传habor
[root@docker harbor]# docker tag centos:6.9 10.0.0.100/oldguo/centos:v1
[root@docker harbor]# docker login 10.0.0.100
[root@docker harbor]# docker push 10.0.0.100/oldguo/centos:v1
5. 在节点中pull habor中的镜像
docker pull 10.0.0.100/oldguo/centos:v1
13. Docker本地网络类型
默认情况下,他会支持几种网络类型,供宿主机与容器网络通信
13.1查看支持网络类型
一般为4个,container、bridge、 host 、 none container: 单机很少使用一般在集群 k8s
docker network ls
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
db9b5b22bde4 bridge bridge local
22d4a06bc608 harbor_harbor bridge local
029d5921c6ce host host local
8935b5114cca none null local
13.2 测试使用各类网络类型
docker run --network=xxx 默认都不加,等同于--network=bridge
none : 无网络模式,只有127.0.0.1
[root@localhost ~]# docker run -it --name="cc_none" --network=none centos:6.9 /bin/bash
[root@b19d6aad45a9 /]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
bridge : 默认模式,相当于NAT, 默认启动容器开启的类似nat模式,也就是docker 0 默认 bridge nat的网桥,
实现功能:1、宿主机跟容器之间的通信。2、容器访问外网,通过docker 0 进行转发 3、提供外部访问内部,需要用到docker0+iptables
root@localhost ~]# docker run -it --name="c_bri1" --network=bridge centos:6.9 /bin/bash
什么不加默认 --network=bridge
启动容器后,没有ping命令,yum install -y iputils,可以安装,说明可以访问外网存在的问题 :跨主机的访问,宿主机1,开启的nginxr容器如何访问宿主机2,开启的mysql容器。 → host
host : 公用宿主机Network NameSapce,本地宿主机公用地址端口,也就是说,在容器中其端口即使宿主机启动一个什么端口
docker 有几大部分组成?或者做了那些隔离,,其中NameSapce名命空间的隔离host,uts,network,进程等。只是网络端口不隔离。其他的是隔离的,比如删除文件、进程ps -aux等。
所以能达到:不隔离network,容器网络部分使用宿主机的。达到公用网络[root@localhost ~]# docker run -it --name="c_host" --network=host centos:6.9 /bin/bash
[root@localhost /]# 回车后,只是变成 /
[root@localhost /]# ifconfig
br-22d4a06bc608 Link encap:Ethernet HWaddr 02:42:1E:89:4A:36
inet addr:172.18.0.1 Bcast:172.18.255.255 Mask:255.255.0.0
等等
docker0 Link encap:Ethernet HWaddr 02:42:05:D2:82:87
inet addr:172.17.0.1 Bcast:172.17.255.255 Mask:255.255.0.0
等等
ens33 Link encap:Ethernet HWaddr 00:0C:29:86:CF:BA
inet addr:192.168.78.5 Bcast:192.168.78.255 Mask:255.255.255.0
等等
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
等等
veth4dcc6ce Link encap:Ethernet HWaddr DE:F3:CB:94:DB:2A
inet6 addr: fe80::dcf3:cbff:fe94:db2a/64 Scope:Link
等等
virbr0 Link encap:Ethernet HWaddr 52:54:00:60:1E:ED
inet addr:192.168.122.1 Bcast:192.168.122.255 Mask:255.255.255.0
等等
[root@localhost /]# docker 如何区分是宿主机还是容器,容器没有docker命令
bash: docker: command not found优点:性能好,不用iptabnles. 缺点:每一个端口唯一
container:容器与其他容器公用Network Namespace
用处:容器1 down后,立马启动一个一摸一样的容器2接管,防止业务断档,k8s中自愈模式
14. 跨主机访问
需求:想让两个跨主机的访问,宿主机1,开启的nginxr容器如何访问宿主机2,开启的mysql容器。
不想用k8s,或者host那么麻烦,早docker中有很多软件支持操作做这个事情,软件模拟交换机
14.1、 Docker跨主机访问-macvlan实现 docker自带的轻量级
macvlan:隧道通到,虚拟的网络设备,实现:容器与容器之间的通讯。缺点:如果启动容器加入都这个通道中,是不能访问外网的,只能在这个通道内的机器之间互相访问,包括加入这个网络的宿主机
配置:自己定制需要地址段--subnet=,网关--gateway=,互通通过外网的某个接口或者端口parent=,两边都的需要创建.
其中自己定制地址段、网关都是随意起,因为你是启动一个模拟网络,所以即使是本地网络是192.168.78.0,自己定制的网络为100.0.0.0/24 100.0.0.255。但是外网的某个接口或者端口parent= 必须是宿主机的一个端口
[root@localhost ~]#docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=ens33 macvlan_1 创建macvlan
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
f7e377f26841 bridge bridge local
029d5921c6ce host host local
2f9e6ebb1da4 macvlan_1 macvlan local
8935b5114cca none null local
错误做法:在不指定地址的情况下 ,容器会启动地址为100.0.0.1
宿主机1:
[root@localhost ~]#docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=ens33 macvlan_1 [root@localhost ~]# docker run -it --network macvlan_1 centos:6.9 /bin/bash [root@27cd7345cbaf /]# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:64:00:00:01 inet addr:100.0.0.1 Bcast:100.0.0.255 Mask:255.255.255.0
宿主机2:
[root@localhost ~]# docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=ens33 macvlan_1 [root@localhost ~]# docker run -it --network macvlan_1 centos:6.9 /bin/bash [root@d3940f301c4b /]# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:64:00:00:01 inet addr:100.0.0.1 Bcast:100.0.0.255 Mask:255.255.255.0
报错:
解决方案:由于没开启IPV4地址转发
[root@d3940f301c4b /]# cat /proc/sys/net/ipv4/ip_forward
0
[root@d3940f301c4b /]# echo 1 >/proc/sys/net/ipv4/ip_forward
正确做法:
宿主机1:
把上文的yum ping 的程容器做成镜像 [root@localhost ~]#docker commit c_bri1 centos6.9_ping:v1 [root@localhost ~]#docker network create --driver macvlan --subnet=100.0.0.0/24 --gateway=100.0.0.254 -o parent=ens33 macvlan_1 [root@localhost ~]# docker run -it --network macvlan_1 --ip=100.0.0.12 centos6.9_ping:v1 /bin/bash [root@2cc1e448b510 /]# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:64:00:00:0C inet addr:100.0.0.12 Bcast:100.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:48 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2880 (2.8 KiB) TX bytes:0 (0.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 问题: [root@localhost ~]# docker run -it --network macvlan_1 --ip=10.0.0.12 centos:6.9 /bin/bash docker: Error response from daemon: Invalid address 10.0.0.12: It does not belong to any of this network's subnets. ERRO[0000] error waiting for container: context canceled 地址打错了-ip=10.0.0.12
宿主机2:
[root@localhost ~]# docker run -it --network macvlan_1 --ip=100.0.0.13 centos:6.9 /bin/bash [root@2cc1e448b510 /]# ifconfig eth0 Link encap:Ethernet HWaddr 02:42:64:00:00:0C inet addr:100.0.0.13 Bcast:100.0.0.255 Mask:255.255.255.0 UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:48 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:2880 (2.8 KiB) TX bytes:0 (0.0 b) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
宿主机1:容器 100.0.0.12 ping 宿主机2 :容器 100.0.0.13 可以ping 通
14.2、Docker 跨主机访问-overlay实现 轻量级
实现:容器与容器之间的通讯,可以能够访问外网
overlay与bridge联系区别:overlay使用了bridge功能,容器可以通过→eth0→docker0→eth1访问外网,外网通过eth1→iptables端接映射→docker0→eth0访问容器。另外通过eth1进行容器与容器之间的通讯
macvlan 与 overlay对于IP区别:
macvlan :在宿主机1创建IP:100.0.0.12容器,在宿主机2也可以创建IP:100.0.0.12容器,不报错,但是导致IP冲突。他们以各自为站,只是通道是同的。没有同统一管控
overlay:可以同统一管控,他会启动一个容器记录IP,在启动容器会自动分配IP
一、启动 consul 服务
实现网络的统一配置管理,存网络相关的,地址、端口号、接口,
[root@localhost ~]# docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
配置:
使得各个主机能访问这个配置文件,使得各个节点听从consul,注意:各个节点的宿主机主机名一定是不一致
宿主机1:
1、修改名字:
[root@localhost ~]#hostname server1 名字随便起,只要不跟其他宿主机一致
[root@localhost ~]#bash
[root@lserver1 ~]#
2、启动consul容器,在一台机器上,配置consul,其它节点不需要启动consul容器,只需要加入
[root@server1 ~]# docker run -d --restart always -p 8400:8400 -p 8500:8500 -p 8600:53/udp -h consul progrium/consul -server -bootstrap -ui-dir /ui
--restart 正常启动, always 长启动 8500页面访问端口 53号dns端口,端口解析 -h 进入容器hostname的名字 -server -bootstrap 以server形式独立起来 -ui-dir /ui图形化界面
3、进入consul容器网站
[root@server1 ~]# netstat -tulpn |grep 8500 8500页面访问端口
tcp6 0 0 :::8500 :::* LISTEN 31108/docker-proxy
访问http://192.168.78.4:8500/ui/#/dc1/services/consul
4、配置宿主机1的docker,使其启动容器后,自动加入consul,并听从consul分配
两种配置方式:在17版本之前,需要改 /etc/docker/daemon.json
[root@server2 ~]# docker version
Client: Docker Engine - Community
Version: 19.03.12
Server: Docker Engine - Community
Engine:
Version: 19.03.12
vim /etc/docker/daemon.json
{
"hosts":["tcp://0.0.0.0:2376","unix:///var/run/docker.sock"],
"cluster-store": "consul://192.168.78.4:8500",
"cluster-advertise": "192.168.78.4:2376"
}
在18版本之后,需要改/usr/lib/systemd/system/docker.service
[root@server1 ~]# vi /usr/lib/systemd/system/docker.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://192.168.78.4:8500 --cluster-advertise=ens33:2376
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
:wq 保存后,退出
标红的是增加,--cluster-store指定使用的consul地址是多少,cluster-advertise=ens33:2376 通过那个端口映射的
5、重启引擎、重启docker
[root@server1 ~]#systemctl daemon-reload
[root@server1 ~]# systemctl restart docker
6、访问KEY/VALUSE → docker
访问nodes/
192.168.78.4:2376 已经加入
宿主机2:
1、修改名字:
[root@localhost ~]#hostname server2 名字随便起,只要不跟其他宿主机一致
[root@localhost ~]#bash
[root@lserver2 ~]#
2、配置宿主机2的docker,使其启动容器后,自动加入宿主机1开启的192.168.78.4:8500 consul,并听从consul分配
[root@server1 ~]# vi /usr/lib/systemd/system/docker.service
[Service]
Type=notify
# the default is not to use systemd for cgroups because the delegate issues still
# exists and systemd currently does not support the cgroup feature set required
# for containers run by docker
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --cluster-store=consul://192.168.78.4:8500 --cluster-advertise=ens33:2376
ExecReload=/bin/kill -s HUP $MAINPID
TimeoutSec=0
RestartSec=2
Restart=always
:wq 保存后,退出
标红的是增加,--cluster-store指定使用的consul地址是多少,cluster-advertise=ens33:2376 通过那个端口映射的
3、重启引擎、重启docker
[root@server1 ~]#systemctl daemon-reload
[root@server1 ~]# systemctl restart docker
4、192.168.78.5:2376 已经加入
二、创建overlay网络
1、创建ol1 通道,只需要在一个宿主机创建即刻,全局的
[root@server1 ~]# docker network create -d overlay --subnet 172.16.0.0/24 --gateway 172.16.0.254 ol1
c976d19a0eee4916e925a85b936009420a48baef1af1b6591d257a684a98d2f4
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
0289eb4e76e6 bridge bridge local
9c33ecfada87 host host local
3e92edf9e2ae macvlan_1 macvlan local
4829b260e64e none null local
c976d19a0eee ol1 overlay global global 全局类
在宿主机2,也可以读到 ol1
[root@server2 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
8e131afa41ef bridge bridge local
22d4a06bc608 harbor_harbor bridge local
029d5921c6ce host host local
2f9e6ebb1da4 macvlan_1 macvlan local
8935b5114cca none null local
c976d19a0eee ol1 overlay global
三、两边启动容器测试
每个容器有两块网卡,eth0实现容器间的通讯,eth1实现容器访问外网
宿主机1:
[root@server1 ~]# docker run -it --network ol1 busybox /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:01 eth0 启动的是172.16.也就是对内的
inet addr:172.16.0.1 Bcast:172.16.0.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 02:42:AC:12:00:02 eth1 启动的是 172.18,bridge
inet addr:172.18.0.2 Bcast:172.18.255.255 Mask:255.255.0.0
宿主机2:
[root@server2 ~]# docker run -it --network ol1 busybox /bin/sh
/ # ifconfig
eth0 Link encap:Ethernet HWaddr 02:42:AC:10:00:02
inet addr:172.16.0.2 Bcast:172.16.0.255 Mask:255.255.255.0
eth1 Link encap:Ethernet HWaddr 02:42:AC:13:00:02
inet addr:172.19.0.2 Bcast:172.19.255.255 Mask:255.255.0.0
宿主机1:
/ # ping www.baidu.com
PING www.baidu.com (39.156.66.14): 56 data bytes
64 bytes from 39.156.66.14: seq=0 ttl=127 time=65.137 ms
64 bytes from 39.156.66.14: seq=1 ttl=127 time=72.464 ms
/ # ping 172.16.0.2
PING 172.16.0.2 (172.16.0.2): 56 data bytes
64 bytes from 172.16.0.2: seq=0 ttl=64 time=63.618 ms
64 bytes from 172.16.0.2: seq=1 ttl=64 time=0.580 ms
相关文章
- 【Docker】解决docker通过volumes挂载文件不生效,修改后容器内数据不同步,需要重启容器才能同步的问题
- 使用weave管理docker网络
- [Docker] Build multi stage image
- Docker 必须要懂的经典网络模式 bridge 网络
- 启动docker容器时报错:iptables failed: iptables --wait -t nat -A DOCKER -p tcp -d 0/0 --dport 5000 -j DNAT -
- 【云原生 | Kubernetes 系列】Docker 面试题2则--取数据库连接数和docker-compose
- 【云原生 | Kubernetes 系列】Docker 面试题2则--取数据库连接数和docker-compose
- 83.第十七章 企业级容器技术docker -- Docker Compose、Docker 仓库管理(十一)
- y22.第二章 Docker从入门到精通 -- Cgroups和docker 的资源限制(四)
- 【云原生之Docker实战】使用docker部署DokuWiki知识库系统
- 【云原生之Docker实战】使用docker部署Snapdrop文件传输工具
- 【云原生之Docker实战】使用docker部署koel家庭个人音乐服务器
- 【云原生之Docker实战】使用docker部署o2oa企业OA平台
- 通过 docker-compose 快速部署 Hadoop 集群详细教程
- docker 搭建 ftp服务器
- Docker学习笔记13:docker使用之Compose
- Docker的四种网络模型(十)