Javascript is required
Docker Network

Docker Network

前置知识

协议/接口/端口

image-20210121131552164

在Linux输入ip addr命令 第一个是本地回环地址, eth0是阿里云服务商分配内网地址,docker0是docker生成的地址。

Network

image-20210121123316115

Docker网络用于允许容器彼此良好隔离,如果容器需要能够彼此通信,也可以使用它们。

Docker网络具有不同的驱动程序,可支持不同类型的网络。默认驱动程序称为“桥接”驱动程序,当启动容器而不指定特定网络时,该容器将在名为“ bridge”的桥接网络上运行。但是,如果不同的容器需要相互通信,则Docker建议使用用户定义的桥接网络。

测试

# 拉取
docker pull tomcat

# 运行
[root@tl ~]# docker run -d -p 5000:8080 --name tomcat01 tomcat

# 进入容器
[root@tl ~]# docker exec -it tomcat01  bash

# 查看ip 
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  e0134db88614

# 容器外执行docker ps
e0134db88614   tomcat    "catalina.sh run" ......
       
# Linux ping 容器内部 Ok
ping 172.17.0.2

每启动一个Docker容器。就会分配一个IP,只要安装docker就会有一个docker0桥接模式,使用的技术是evth-pair技术。

当在宿主机再次执行ip addr 就会发现多出一个

image.png

image.png

再次启动一个容器Tomcat02测试

[root@tl ~]# docker run -d --name tomcat02 -p 9100:8080 tomcat
9cf7f876090b53c36f58e10af7a64350238eb877481b5a0a0386a7f7d3c030c4

[root@tl ~]# docker exec -it 9cf7f876090b ip addr
1: lo:
28: eth0@if29:
  inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0

容器带来的网卡,都是一对对的。

evth-pair都是一对的虚拟设备接口。都是成对出现的。一段连接协议,一段彼此相连。

Evth-pair充当一个桥梁,连接各种虚拟网络设备的。

Docker0 172.18.0.1 充当公用的一个路由器。

所有容器不指定网络的情况下,都是docker0路由的。docker会给我们的容器分配一个默认可用的IP。

默认子网掩码 255.255.0.1/16

当删除容器,对应的网桥一对就删除了。

image-20210121144750185

image-20210121145045416

容器互联

问题

当前有两个容器 tomcat01/ tomcat02

image-20210121150209266

分别对应的IP地址

image-20210121150352967

我们可以通过ip来ping 毋庸置疑。 但是如果通过服务名称呢?

[root@tl ~]# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

所以引入--link

# Tomcat03
[root@tl ~]# docker run -d --name tomcat03 -p 9200:8080 --link tomcat02  tomcat

image-20210121150635878

可以ping通

image-20210121150707375

# 查看docker network
[root@tl ~]# docker network ls
NETWORK ID          NAME                DRIVER              SCOPE
260fb856dece        bridge              bridge              local
6047504703ef        host                host                local
19e2a7bd0904        mynet               bridge              local

第一个是docker自带的桥接, 查看详情

[root@tl ~]# docker network inspect 260fb856dece
[
    {
        "Name": "bridge",
        "Id": "260fb856dece031e11c857f171dd182eef1096d885f5414a88d2241e8db33713",
        "Created": "2021-01-21T14:35:43.23329434+08:00",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.18.0.0/16",// 默认的IP Docker0
                    "Gateway": "172.18.0.1"  // 网关
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "ConfigFrom": {
            "Network": ""
        },
        "ConfigOnly": false,
        // 容器列表 代表了三个Tomcat容器
        "Containers": {
            "0314894344d0fe9eaf9e2dfd89db8851531aba3f1757531ca30b91d118aec074": {
                "Name": "tomcat03", // 自定义名称
                "EndpointID": "a034c14c7a4dfc5ff379ceca77f90542cc189ac93aacb6de32f7e57f66b303da",
                "MacAddress": "02:42:ac:12:00:04", // Mac地址
                "IPv4Address": "172.18.0.4/16", // IP地址
                "IPv6Address": ""
            },
            "14ec0323adb6235963a029593c95f349582959d6367a658e3b8c078985b17f79": {
                "Name": "tomcat02",
                "EndpointID": "3b04a4b49625b2843613ce2d760f5e2c136c1cabe5b2330380f39960b60bb0a9",
                "MacAddress": "02:42:ac:12:00:03",
                "IPv4Address": "172.18.0.3/16",
                "IPv6Address": ""
            },
            "e711ebe5833c93948fa82415dd76de7310b4d0ae5a8ce4dd6e9317b04afc2025": {
                "Name": "tomcat01",
                "EndpointID": "156bbe1b52b6dd39d13462d1df2002d3c0ca373053ed20df77b4575cd519b00d",
                "MacAddress": "02:42:ac:12:00:02",
                "IPv4Address": "172.18.0.2/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

原理探究

[root@tl ~]# 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.18.0.3      tomcat02 14ec0323adb6 // 当加入--link 就会在这里添加映射
172.18.0.4      0314894344d0 // 自己的IP

自定义网络

查看所有网络

docker network ls

image-20210121151428604

网络模式

bridge: 桥接模式

none: 不配置网络

host:主机模式 (和宿主机共享网络)

Container: 容器内网络连通

当我们创建容器

# 默认创建容器 --net bridge是默认添加的
docker run 
    -d 
  -p 5000:8080 
  --name tomcat01 
    --net bridge
tomcat

创建

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

查看详情

[root@tl ~]# docker network inspect d362266394e53bc7be6b5c25dbd7deaeede11c9d31c66bf177c335ddd7fdf7eb

[
    {
        "Name": "inet",
        "Id": "d362266394e53bc7be6b5c25dbd7deaeede11c9d31c66bf177c335ddd7fdf7eb",
        "Created": "2021-01-21T15:22:23.98395782+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@tl ~]# docker run -d -p 9000:8080 --name tomcat01 --net inet tomcat
901bf2ffbac3a368562c7bd06eece224576fc6bd2d1e8449952209bc59f230a4
[root@tl ~]# docker run -d -p 9100:8080 --name tomcat02 --net inet tomcat
1345258d7a23aaf973ef57d43e1851ef2e413f03466054a56fb8c63525345276
[root@tl ~]# docker run -d -p 9200:8080 --name tomcat03 --net inet tomcat
cef4c63b939aad614d8e3b5fb11456557339acff77e758ae39983e92600ed39e

当继续查看网络情况时, 可以看到刚才创建的容器

image-20210121152542116

image-20210121152615725

容器也可以通过服务名ping, 这就是自定义网络好处。

image-20210121152943227

网络连通

docker connect

两个不同的网络如何打通呢?

image-20210121153506485

怎样使用?

  ~ docker network connect --help

Usage:  docker network connect [OPTIONS] 网络_id 容器_id

在网络打通容器连通

参数:
      --alias strings           Add network-scoped alias for the
                                container
      --driver-opt strings      driver options for the network
      --ip string               IPv4 address (e.g., 172.30.100.104)
      --ip6 string              IPv6 address (e.g., 2001:db8::33)
      --link list               Add link to another container
      --link-local-ip strings   Add a link-local address for the
                                container
# 例子
[root@tl ~]# docker network  connect inet tomcat_default
# 测试
docker exec -it tomcatBase ping tomcat01