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的端口5000

3、 --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-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
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值