Docker网络

理解Docker0

原理

  1. 我们每启动一个docker容器,docker就会给docker容器分配一个ip,我们只要安装了docker,就会有一个网卡docker0 桥接模式,使用的技术是veth-pair技术!

  2. 每启动一个容器就会给容器分配一个网卡,发现网卡都是成对出现,这就是veth-pair技术,是一对虚拟设备接口,一段连着协议,一段彼此相连。veth-pair充当一个桥梁,连接各种虚拟网络设备。

  3. openstack,Docker容器之间的连接,OVS的连接,都是使用veth-pair技术

  4. 容器之间可以通过ip地址相互 ping 通。

    • docker0的网络模型图

     

     

    tomcat01和tomcat02是用的一个公用的路由器:docker0.

    s所有容器不指定网络下,都是使用docker0,docker会给容器分配一个默认的可用ip

    小结

    Docker使用的是linux的桥接,宿主机中是一个Docker容器的网桥 docker0 。

     

     

    Docker中所有的网络接口都是虚拟的,虚拟的转发效率高!(内网传递文件!)

    只要容器删除,对应的一对网桥就没有了。

     

     

    --link

    Docker中两个容器不用ip,直接用容器名进行 ping ,这是 ping 不通的。

     1  [root@VM-0-14-centos ~]# docker ps 
     2  CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                    NAMES
     3  345cdedafc19        tomcat              "catalina.sh run"   12 seconds ago      Up 12 seconds       0.0.0.0:9001->8080/tcp   tomcat02
     4  61537737e9c0        tomcat              "catalina.sh run"   20 seconds ago      Up 19 seconds       0.0.0.0:9000->8080/tcp   tomcat01
     5  [root@VM-0-14-centos ~]# docker exec -it tomcat02 ping tomcat01
     6  ping: tomcat01: Name or service not known
     7  #这里发现直接 ping 容器名字是 ping 不通,通过 --link 就能解决了
     8  [root@VM-0-14-centos ~]# docker run -d -P --name tomcat03 --link tomcat01 tomcat
     9  bc26e16b083d3ea1e52a4d8ee5762d31a4023e3dd72e476b600588678bb1e3a9
    10  [root@VM-0-14-centos ~]# docker exec -it tomcat03 ping tomcat01                         
    11  PING tomcat01 (172.17.0.2) 56(84) bytes of data.
    12  64 bytes from tomcat01 (172.17.0.2): icmp_seq=1 ttl=64 time=0.153 ms
    13  64 bytes from tomcat01 (172.17.0.2): icmp_seq=2 ttl=64 time=0.113 ms
    14  64 bytes from tomcat01 (172.17.0.2): icmp_seq=3 ttl=64 time=0.108 ms
    15  64 bytes from tomcat01 (172.17.0.2): icmp_seq=4 ttl=64 time=0.112 ms
    16  #反向是不可以 ping 通的
    17  [root@VM-0-14-centos ~]# docker exec -it tomcat01 ping tomcat03 
    18  ping: tomcat03: Name or service not known

     

  5. 
    

    这里显示创建容器docker自动给容器分配的ip

     

     

    在建立tomcat03时候就已经配置了和tomcat02连通的配置。如何查看配置?

     
    #查看hosts配置
     [root@VM-0-14-centos ~]# docker exec -it tomcat03 cat /etc/hosts
     127.0.0.1       localhost
     ::1     localhost ip6-localhost ip6-loopback
     fe00::0 ip6-localnet
     ff00::0 ip6-mcastprefix
     ff02::1 ip6-allnodes
     ff02::2 ip6-allrouters
     172.17.0.2      tomcat01 61537737e9c0
     172.17.0.4      bc26e16b083d

     

    --link 就是在hosts配置中增加了一个172.17.0.2 tomcat01 61537737e9c0 绑定了

    不建议使用--link太笨了。建议使用自定义网络。

    自定义网络

    查看所有docker网络  docker network ls

     

     

    网络模式

    bridge : 桥接模式 docker上面搭桥(默认)(自己创建也是使用桥接模式)

    none : 不配置网络

    host : 和宿主机共享网络

    container :容器网络连通(用得少)

    测试

     #我们直按启动的命令  --net bridge,而这个就是我们的docker0,默认是--net bridge
     docker run -d -p --name tomcat01 tomcat
     docker run -d -p --name tomcat01 --net bridge tomcat
     #  docker0特点:默认,域名不能访同, --link可以打通连接!
     ​
     ​
     #  我们可以自定义一个网络!
     #—-driver bridge
     #——subnet 192.168.0.0/16
     #—-gateway 192.168.0.1
     ​
     [root@VM-0-14-centos ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
     47053a6c6ad25977b5ccaca5996e7582e49a0ec0a361078505a805fb15ebe716
     [root@VM-0-14-centos ~]# docker network ls
     NETWORK ID          NAME                DRIVER              SCOPE
     1a796e623d62        bridge              bridge              local
     07b2cb229c0e        host                host                local
     47053a6c6ad2        mynet               bridge              local
     ee79b9f66b12        none                null                local
     7f0e24ce21ca        redis               bridge              local
     ​
     
    
     [root@VM-0-14-centos ~]# docker run -d -P--name tomcat-net-01 --net mynet tomcat
     unknown shorthand flag: '-' in ---name
     See 'docker run --help'.
     [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
     3cbdd9de3925fdb41cae22e761267697eec8faf67159ac8fa23ff4330ed5d6d5
     [root@VM-0-14-centos ~]# docker run -d -P --name tomcat-net-02 --net mynet tomcat 
     46b69f2c19844bbc1a136cc71dacf15e0d283c9be192c1f5ac794d5e662a3974
     [root@VM-0-14-centos ~]# docker network inspect mynet 
     [
         {
             "Name": "mynet",
             "Id": "47053a6c6ad25977b5ccaca5996e7582e49a0ec0a361078505a805fb15ebe716",
             "Created": "2020-09-17T14:34:12.808558135+08:00",
             "Scope": "local",
             "Driver": "bridge",
             "EnableIPv6": false,
             "IPAM": {
                 "Driver": "default",
                 "Options": {},
                 "Config": [
                     {
                         "Subnet": "192.168.0.0/16",
                         "Gateway": "192.168.0.1"
                     }
                 ]
             },
             "Internal": false,
             "Attachable": false,
             "Ingress": false,
             "ConfigFrom": {
                 "Network": ""
             },
             "ConfigOnly": false,
             "Containers": {
                 "3cbdd9de3925fdb41cae22e761267697eec8faf67159ac8fa23ff4330ed5d6d5": {
                     "Name": "tomcat-net-01",
                     "EndpointID": "126b689de44ddc3dbcfa2bd2fa952f54203a4233ec505b2b72193f8a56a6ba24",
                     "MacAddress": "02:42:c0:a8:00:02",
                     "IPv4Address": "192.168.0.2/16",
                     "IPv6Address": ""
                 },
                 "46b69f2c19844bbc1a136cc71dacf15e0d283c9be192c1f5ac794d5e662a3974": {
                     "Name": "tomcat-net-02",
                     "EndpointID": "b517ac34133f8653230f86814c835e1eb1d897b5e83b95600dc7a234d2805a33",
                     "MacAddress": "02:42:c0:a8:00:03",
                     "IPv4Address": "192.168.0.3/16",
                     "IPv6Address": ""
                 }
             },
             "Options": {},
             "Labels": {}
         }
     ]
     #  再次测试 ping 连接
     [root@VM-0-14-centos ~]# docker exec -it tomcat-net-01 ping 192.168.0.3
     PING 192.168.0.3 (192.168.0.3) 56(84) bytes of data.
     64 bytes from 192.168.0.3: icmp_seq=1 ttl=64 time=0.160 ms
     64 bytes from 192.168.0.3: icmp_seq=2 ttl=64 time=0.112 ms
     64 bytes from 192.168.0.3: icmp_seq=3 ttl=64 time=0.086 ms
     ^C
     --- 192.168.0.3 ping statistics ---
     3 packets transmitted, 3 received, 0% packet loss, time 1001ms
     rtt min/avg/max/mdev = 0.086/0.119/0.160/0.031 ms
     #  不使用--link也可以直接 ping 通
     [root@VM-0-14-centos ~]# docker exec -it tomcat-net-01 ping tomcat-net-02
     PING tomcat-net-02 (192.168.0.3) 56(84) bytes of data.
     64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.071 ms
     64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.156 ms
     64 bytes from tomcat-net-02.mynet (192.168.0.3): icmp_seq=3 ttl=64 time=0.096 ms

     

    自定义的网络docker已经分配好对应的关系。推荐平时这样使用

    好处:

     

    redis - 不同的集群使用不同的网络,保证集群是安全和健康的 mysql - 不同的集群使用不同的网络,保证集群是安全和健康的

    网络连通

    在docker0默认下创建tomcat01和tomcat02,然后用tomcat01去 ping tomcat-net-01是ping不通的

     

 

 

 #  测试打通tomcat01 - mynet
 ​
 #  连通之后就是将tomcat01放到了mynet网络下
 #  一个容器两个ip地址!
 #  阿里云服务,公网ip 私网ip
 ​

 

 

#  tomcat01成功连通了mynet网络
 [root@VM-0-14-centos ~]#  docker exec -it tomcat01 ping tomcat-net-01
 PING tomcat-net-01 (192.168.0.2) 56(84) bytes of data.
 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=1 ttl=64 time=0.106 ms
 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=2 ttl=64 time=0.093 ms
 64 bytes from tomcat-net-01.mynet (192.168.0.2): icmp_seq=3 ttl=64 time=0.111 ms
 #  tomcat02是打不通的
 [root@VM-0-14-centos ~]#  docker exec -it tomcat02 ping tomcat-net-01 
 ping: tomcat-net-01: Name or service not known

 

结论︰假设要跨网络操作别人,就需要使用docker network connect 连通!

posted @ 2020-09-17 15:15  我笑了傲江湖  阅读(291)  评论(0)    收藏  举报