• Docker网络详细理解-容器网络互通


    这篇文章主要解决以下几个问题:
    1.同一个网段的容器互相之间通过ip进行ping通
    2.同一个网段的容器互相之间通过容器名,通过使用--link进行ping通,已放弃这种方法
    3.同一个网段的容器互相之间通过容器名,通过创建自定义网络进行ping通,建议采用这种方法
    4.不同网段的容器互相之间通过容器名,通过创建自定义网络,某个网段内的容器关联到另一个网段(则该容器有俩IP地址),进行ping通,建议采用这种方法
    (容器没有关联到另一个网段则没法ping通)

    不同主机之间的docker容器网络互通查看这个文章:https://www.cnblogs.com/sanduzxcvbnm/p/11578827.html

    清空所有环境

    # 停止并删除所有容器
    docker stop `docker ps -q`
    docker rm `docker ps -a -q`
    
    # 删除所有镜像
    docker rmi `docker images -q` -f
    

    测试

    问题:docker 是如何处理容器网络访问的

    启动一个tomcat

    docker run -d -P --name tomcat01 tomcat
    
    # 查看ip
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat01 ip addr
    1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
        link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
        inet 127.0.0.1/8 scope host lo
           valid_lft forever preferred_lft forever
    146: eth0@if147: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
        inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
           valid_lft forever preferred_lft forever
    # 发现容器启动 eth0@if147 ip地址,docker分配的!
    
    测试,Linux能不能 ping 通容器内部?
    

    Linux宿主机是可以 ping 通 docker容器内部的 (禁ping除外)

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

    再次测试ip addr

    再启动一个容器

    docker run -d -P --name tomcat02 tomcat
    

    再次测试ip addr 发现又多了一对网卡

    查看ip

    # 发现这个容器带来的网卡都是一对对的
    # veth-pair 就是一对的虚拟设备接口,他们都是成对出现的,一端连着协议,一端彼此相连
    # veth-pair 充当一个桥梁,链接各种虚拟网络设备的
    # OpenStack,Docker容器之间的链接,ovs的链接,都是使用的 veth-pair 技术
    

    测试 tomcat02 ping tomcat01

    结论:容器和容器之间通过ip形式是可以互相ping通的! (都是在同一个网络命令中,bridge桥接)

    小结:Docker使用的是Linux的桥接,宿主机中是一个Docker容器的网桥 docker0,最多能分配约65535

    Docker中的所有的网络接口都是虚拟的。虚拟的转发效率高!

    测试删掉容器

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

    希望用名字来访问容器

    启动tomcat01

    直接用名字ping

    解决

    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat03 --link tomcat02 tomcat
    6eac1dfba29cda8a2a20aea6e820f3b2ebbd85d0d9223b650306b34febb820b0
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat03 ping tomcat02
    PING tomcat02 (172.17.0.3) 56(84) bytes of data.
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.127 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.092 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.088 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=4 ttl=64 time=0.087 ms
    64 bytes from tomcat02 (172.17.0.3): icmp_seq=5 ttl=64 time=0.098 ms
    # 通过 --link 就可以解决
    
    # 但是反向ping就不行了
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat02 ping tomcat03
    ping: tomcat03: Name or service not known
    

    探究: 查看 hosts 文件


    现在Docker已经不建议使用 --link 了!

    自定义网络

    查看所有的Docker网络

    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    8ce5d63292ee        bridge              bridge              local
    b01be88b9d12        host                host                local
    54b9e50084dd        none                null                local
    

    网络模式

    bridge :桥接 docker(默认)
    host :和宿主机共享网络
    none :不配置网络
    

    测试,清空容器

    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker rm -f $(docker ps -aq)
    6eac1dfba29c
    4e2db5c641fd
    369e4fb8fd1e
    
    # 直接启动的命令默认会有一个 --net bridge 操作,这个就是docker0
    docker run -d -P --name tomcat01 tomcat
    docker run -d -P --name tomcat01 --net bridge tomcat
    

    自定义一个网络

    # 自定义一个网段,名称是mynet
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
    ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971
    
    # 查看docker网络,多了一个桥接的mynet
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network ls
    NETWORK ID          NAME                DRIVER              SCOPE
    8ce5d63292ee        bridge              bridge              local
    b01be88b9d12        host                host                local
    ce6c831fa98c        mynet               bridge              local
    54b9e50084dd        none                null                local
    
    # 查看mynet信息,可以看到没有关联的容器
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971",
            "Created": "2020-05-27T16:30:22.691575681+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": {},
            "Options": {},
            "Labels": {}
        }
    ]
    # 到这里网络就创建好了
    
    # 用刚才自定义的网络mynet启动容器
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat-net-01 --net mynet tomcat
    0dcb6a5f014415cb6c98c93c9dac21b7f5cae21df5cc5e42f331cc6e07a1ec93
    
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat-net-02 --net mynet tomcat
    eec65d6dc9cdad33f85d3874fcf8291ed46c97893ae1298c7d23d9d85e7dda87
    
    # 再次查看mynet信息,可以看到有两个关联的容器
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network inspect mynet
    [
        {
            "Name": "mynet",
            "Id": "ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971",
            "Created": "2020-05-27T16:30:22.691575681+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": {
                "0dcb6a5f014415cb6c98c93c9dac21b7f5cae21df5cc5e42f331cc6e07a1ec93": {
                    "Name": "tomcat-net-01",
                    "EndpointID": "2364095efd247b368c6787bef9889fa60e58fa0dbc588e59f3f34894044f158f",
                    "MacAddress": "02:42:c0:a8:00:02",
                    "IPv4Address": "192.168.0.2/16",
                    "IPv6Address": ""
                },
                "eec65d6dc9cdad33f85d3874fcf8291ed46c97893ae1298c7d23d9d85e7dda87": {
                    "Name": "tomcat-net-02",
                    "EndpointID": "1dfd0a22eb575215d2a2b899bf10079fba54cabda082a89b672b8bf4ec0c585e",
                    "MacAddress": "02:42:c0:a8:00:03",
                    "IPv4Address": "192.168.0.3/16",
                    "IPv6Address": ""
                }
            },
            "Options": {},
            "Labels": {}
        }
    ]
    

    测试 用名字 ping 一下,可以互相通过容器名称进行ping通

    现在不使用 --link 也可以ping名字了!

    不同网段的容器网络连通

    测试

    这是不可能的!需要打通


    # 测试打通 tomcat01 - mynet
    [root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network connect mynet tomcat01
    
    # 看一下网络信息
    docker network inspect mynet
    

    连通之后就是将tomcat01 放到了 mynet 网络下!一个容器两个ip地址

    再次ping

  • 相关阅读:
    第八次课程作业
    第七次课程作业
    第六次课程作业
    第五次课程作业
    第三次课程作业
    第二次课程作业
    第一次课程作业
    FZU.Software Engineering1816 · First Homework -Preparation
    个人简介
    福大软工1816 · 第二次作业
  • 原文地址:https://www.cnblogs.com/sanduzxcvbnm/p/13367071.html
Copyright © 2020-2023  润新知