Docker 网络,自定义网络!

理解Dcoker0

先清空所有环境

测试

Docker 网络,自定义网络!_第1张图片

三个网络

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

Docker 网络,自定义网络!_第2张图片

# 启动一个tomcat

Docker 网络,自定义网络!_第3张图片

# 查看ip
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker exec -it tomcat01 ip addr
1: lo:  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:  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 通容器内部!  

Docker 网络,自定义网络!_第4张图片

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

原理

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

再次测试ip addr

Docker 网络,自定义网络!_第5张图片

再启动一个容器

[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker run -d -P --name tomcat02 tomcat
369e4fb8fd1eed8887dabb4dfa1607c9db6fa3244a632d88f73d751f888dc84d

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

Docker 网络,自定义网络!_第6张图片

查看ip

Docker 网络,自定义网络!_第7张图片

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

测试 tomcat02 ping tomcat01

Docker 网络,自定义网络!_第8张图片

结论:容器和容器之间是可以互相ping通的!

Docker 网络,自定义网络!_第9张图片

小结

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

Docker 网络,自定义网络!_第10张图片

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

测试删掉容器

Docker 网络,自定义网络!_第11张图片

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

希望用名字来访问容器

启动tomcat01

Docker 网络,自定义网络!_第12张图片

直接用名字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 网络,自定义网络!_第13张图片

Docker 网络,自定义网络!_第14张图片

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

自定义网络

查看所有的Docker网络

Docker 网络,自定义网络!_第15张图片

[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 :不配置网络

container:容器网络连通(用的少!局限很大!)

测试,清空容器

[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

自定义一个网络

Docker 网络,自定义网络!_第16张图片

docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
ce6c831fa98c8e809096eb37b682abf1ce9b541d73b75f4c7126dfe8748c5971
[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

# 查看信息
[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": {}
    }
]
# 到这里网络就创建好了

# 用自己的网络启动容器
[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
[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 一下

Docker 网络,自定义网络!_第17张图片

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

网络连通

Docker 网络,自定义网络!_第18张图片

测试

Docker 网络,自定义网络!_第19张图片

这是不可能的!需要打通

Docker 网络,自定义网络!_第20张图片

Docker 网络,自定义网络!_第21张图片

Docker 网络,自定义网络!_第22张图片

# 测试打通 tomcat01 - mynet
[root@iz2zeaet7s13lfkc8r3e2kz ysl]# docker network connect mynet tomcat01

# 看一下网络信息
docker network inspect mynet

Docker 网络,自定义网络!_第23张图片

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

再次ping

Docker 网络,自定义网络!_第24张图片

https://space.bilibili.com/95256449/dynamic

你可能感兴趣的:(Docker 网络,自定义网络!)