一、 计算机网络模型 以及常用的命令
网卡:
计算机网络中,计算机要进行通信硬件支撑,唯一的MAC地址。
ip link show
ip a解读
状态:UP/DOWN/UNKOWN等
link/ether:MAC地址
inet:绑定的IP地址
在特定目录下,能够查看网卡
修改网卡信息
cd /etc/sysconfig/network-scripts/
ls
编辑网卡0的信息
给网卡添加IP地址
当然,这块可以直接修改ifcfg-*文件,但是我们通过命令添加试试
1)ip addr add 192.168.0.100/24 dev eth0
(2)删除IP地址
ip addr delete 192.168.0.100/24 dev eth0
网卡启动与关闭
重启网卡 :service network restart / systemctl restart network
启动/关闭某个网卡 :ifup/ifdown eth0 or ip link set eth0 up/down
二、网络通信两个不同的网卡之间通过virth-pair通信
1、 创建一个network namespace
ip netns add ns1
2、查看该namespace下网卡的情况
ip netns exec ns1 ip a
3、打开网卡
//打开网卡
ip netns exec ns1 ifup lo
4、查看网卡状态
//查看网卡状态
ip netns exec ns1 ip a
5、再次创建一个network namespace
6、此时想让两个namespace网络连通起来
veth pair :Virtual Ethernet Pair,是一个成对的端口,可以实现上述功能
7、创建一对link,也就是接下来要通过veth pair连接的link
ip link add veth-ns1 type veth peer name veth-ns2
8、查看link情况
ip link
9、将veth-ns1加入ns1中,将veth-ns2加入ns2中
ip link set veth-ns1 netns ns1
ip link set veth-ns2 netns ns2
10、查看宿主机和ns1,ns2的link情况
ip link
ip netns exec ns1 ip link
ip netns exec ns2 ip link
11、此时veth-ns1和veth-ns2还没有ip地址,显然通信还缺少点条件
ip netns exec ns1 ip addr add 192.168.0.11/24 dev veth-ns1
ip netns exec ns2 ip addr add 192.168.0.12/24 dev veth-ns2
12、再次查看,发现state是DOWN,并且还是没有IP地址
ip netns exec ns1 ip link
ip netns exec ns2 ip link
13、启动veth-ns1和veth-ns2
ip netns exec ns1 ip link set veth-ns1 up
ip netns exec ns2 ip link set veth-ns2 up
14、再次查看,发现state是UP,同时有IP
ip netns exec ns1 ip a
ip netns exec ns2 ip a
15、此时两个network namespace互相ping一下,发现是可以ping通的
ip netns exec ns1 ping 192.168.0.12
ip netns exec ns2 ping 192.168.0.11
三、两个Tomcat通信的原理分析验证
按照上面的描述,实际上每个container,都会有自己的network namespace,并且是独立的,我们可以进入
到容器中进行验证
第一步:先创建两个容器
docker run -d --name tomcat01 -p 8081:8080 tomcat
docker run -d --name tomcat02 -p 8082:8080 tomcat
第二步:进入到两个容器中,并且查看ip
docker exec -it tomcat01 ip a
docker exec -it tomcat02 ip a
在这里插入代码片
docker exec -it tomcat01 bash
ping 172.17.0.3
由此就引入了新的问题:
tomcat01和tomcat02属于两个network namespace,是如何能够ping通的?但是这里并不是上述提到的veth-pair技术。
Tomcat1与Dockers中的网卡 通过veth-pair技术连接,Tomcat2与Dockers中网卡 通过veth-pair技术连接,因为Docker0中的网卡,都在一个网段,类似通过Bridge的方式进行连接。
为什么宿主主机能够Ping通容器?
答:每一个容器都连在同一个网段当中,所以能够Ping通。
为什么容器能够互相Ping通?
答:每一个容器都连在同一个网段当中,所以能够Ping通。
(1)首先安装bridge-utils工具包
yum install bridge-utils
(2)查看Linux中的网桥
brctl show
(3)查看Tomcat中的网桥
docker exec -it tomcat01 ip a
docker exec -it tomcat02 ip a
所以,Tomcat1和Tomcat2在一个网段,并且能够互相Ping通。
docker network inspect bridge 查看桥接网络的详情
[
{
"Name": "bridge",
"Id": "b15aa1ecc25828e428cfa89a3a33843e112499b5936fc4939336b2548244fd3f",
"Created": "2021-07-10T04:48:08.630243664+02:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"08e054de3926d6af7e325caed69abe4ee3678cf4ba8e36385d738ae5c6c4d9a7": {
"Name": "tomcat02",
"EndpointID": "b1b3ccbd27ccc5c5a8d6c5d757c54c93c31900d7931141c6205301f1cb08b78d",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"10c78d9117d627c0c572cf86f0b78deb481f4bf33fd9b61f78065ec23572557f": {
"Name": "tomcat01",
"EndpointID": "4aae15f702fc518094ebd8bd14fd21931fca0bb7e7b420f864d43ff4013ccf50",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"51fc803bf26776726bc3aaec6c5523b85274b41ce9719bc51f11b06683c29917": {
"Name": "tomcat03",
"EndpointID": "8917d37597e376d572d417cc7df4d84ae73c1adc28833d606dacc2bf1bcd78cb",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/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": {}
}
]
四、对于不同网段的容器如何Ping通
- 首先第一步删除容器
docker rm -f $(docker ps -qa)
- 启动一个Tomcat
docker run -d --name tomcat01 tomcat
- 查看容器的网络信息
docker exec -it tomcat01 ip a
- 查看bridge的网络
docker network inspect bridge
- 创建一个Bridge类型的网络
docker network create tomcat-net
docker network ls
- 创建tomcat的容器,并且指定使用tomcat-net
docker run -d --name custom-net-tomcat --network tomcat-net tomcat
- 查看custom-net-tomcat容器的网络信息
docker exec -it custom-net-tomcat ip a
docker exec -it custom-net-tomcat bash
- Ping不通后的思路,将Tomcat01加入到Tomcat-net中
- 查看Tomcat01的网络信息
docker inspect tomcat01
发现只有一个网络信息
[
{
"Id": "706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b",
"Created": "2021-07-17T06:57:12.245072309Z",
"Path": "catalina.sh",
"Args": [
"run"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8748,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-07-17T06:57:12.84813853Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:36ef696ea43d360827271a0d69475cb11fde0029d26fda66ea3204c116908597",
"ResolvConfPath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/hostname",
"HostsPath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/hosts",
"LogPath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b-json.log",
"Name": "/tomcat01",
"RestartCount": 0,
"Driver": "devicemapper",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"DeviceId": "68",
"DeviceName": "docker-253:0-34148462-17e715b9db6bd0796cc41f9da23748590ef6d8c118b414a1076ba02665040fd8",
"DeviceSize": "10737418240"
},
"Name": "devicemapper"
},
"Mounts": [],
"Config": {
"Hostname": "706eba52a567",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8080/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/tomcat/bin:/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"JAVA_HOME=/usr/local/openjdk-11",
"LANG=C.UTF-8",
"JAVA_VERSION=11.0.11+9",
"CATALINA_HOME=/usr/local/tomcat",
"TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
"LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
"GPG_KEYS=48F8E69F6390C9F25CFEDCD268248959359E722B A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243",
"TOMCAT_MAJOR=9",
"TOMCAT_VERSION=9.0.50",
"TOMCAT_SHA512=06cd51abbeebba9385f594ed092bd30e510b6314c90c421f4be5d8bec596c6a177785efc2ce27363813f6822af89fc88a2072d7b051960e5387130faf69c447b"
],
"Cmd": [
"catalina.sh",
"run"
],
"Image": "tomcat",
"Volumes": null,
"WorkingDir": "/usr/local/tomcat",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "1ad99fcf623a208d11b27a6d99e8b46d6091c4c310306f35bf6414deca78fb01",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"8080/tcp": null
},
"SandboxKey": "/var/run/docker/netns/1ad99fcf623a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "4b453a7852e2d543e135ac1232464760a296e857e3f8b46f9d01d4500a0f8bb4",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "b15aa1ecc25828e428cfa89a3a33843e112499b5936fc4939336b2548244fd3f",
"EndpointID": "4b453a7852e2d543e135ac1232464760a296e857e3f8b46f9d01d4500a0f8bb4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
- 将Tomcat01加入到tomcat-net中
docker network connect tomcat-net tomcat01
- 查看Tomcat01的网络命令
docker inspect tomcat01
[
{
"Id": "706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b",
"Created": "2021-07-17T06:57:12.245072309Z",
"Path": "catalina.sh",
"Args": [
"run"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
"Restarting": false,
"OOMKilled": false,
"Dead": false,
"Pid": 8748,
"ExitCode": 0,
"Error": "",
"StartedAt": "2021-07-17T06:57:12.84813853Z",
"FinishedAt": "0001-01-01T00:00:00Z"
},
"Image": "sha256:36ef696ea43d360827271a0d69475cb11fde0029d26fda66ea3204c116908597",
"ResolvConfPath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/resolv.conf",
"HostnamePath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/hostname",
"HostsPath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/hosts",
"LogPath": "/var/lib/docker/containers/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b/706eba52a567f5fd3e5b29a4808aad4d8038a70973474fb0e88922f36b4c659b-json.log",
"Name": "/tomcat01",
"RestartCount": 0,
"Driver": "devicemapper",
"Platform": "linux",
"MountLabel": "",
"ProcessLabel": "",
"AppArmorProfile": "",
"ExecIDs": null,
"HostConfig": {
"Binds": null,
"ContainerIDFile": "",
"LogConfig": {
"Type": "json-file",
"Config": {}
},
"NetworkMode": "default",
"PortBindings": {},
"RestartPolicy": {
"Name": "no",
"MaximumRetryCount": 0
},
"AutoRemove": false,
"VolumeDriver": "",
"VolumesFrom": null,
"CapAdd": null,
"CapDrop": null,
"CgroupnsMode": "host",
"Dns": [],
"DnsOptions": [],
"DnsSearch": [],
"ExtraHosts": null,
"GroupAdd": null,
"IpcMode": "private",
"Cgroup": "",
"Links": null,
"OomScoreAdj": 0,
"PidMode": "",
"Privileged": false,
"PublishAllPorts": false,
"ReadonlyRootfs": false,
"SecurityOpt": null,
"UTSMode": "",
"UsernsMode": "",
"ShmSize": 67108864,
"Runtime": "runc",
"ConsoleSize": [
0,
0
],
"Isolation": "",
"CpuShares": 0,
"Memory": 0,
"NanoCpus": 0,
"CgroupParent": "",
"BlkioWeight": 0,
"BlkioWeightDevice": [],
"BlkioDeviceReadBps": null,
"BlkioDeviceWriteBps": null,
"BlkioDeviceReadIOps": null,
"BlkioDeviceWriteIOps": null,
"CpuPeriod": 0,
"CpuQuota": 0,
"CpuRealtimePeriod": 0,
"CpuRealtimeRuntime": 0,
"CpusetCpus": "",
"CpusetMems": "",
"Devices": [],
"DeviceCgroupRules": null,
"DeviceRequests": null,
"KernelMemory": 0,
"KernelMemoryTCP": 0,
"MemoryReservation": 0,
"MemorySwap": 0,
"MemorySwappiness": null,
"OomKillDisable": false,
"PidsLimit": null,
"Ulimits": null,
"CpuCount": 0,
"CpuPercent": 0,
"IOMaximumIOps": 0,
"IOMaximumBandwidth": 0,
"MaskedPaths": [
"/proc/asound",
"/proc/acpi",
"/proc/kcore",
"/proc/keys",
"/proc/latency_stats",
"/proc/timer_list",
"/proc/timer_stats",
"/proc/sched_debug",
"/proc/scsi",
"/sys/firmware"
],
"ReadonlyPaths": [
"/proc/bus",
"/proc/fs",
"/proc/irq",
"/proc/sys",
"/proc/sysrq-trigger"
]
},
"GraphDriver": {
"Data": {
"DeviceId": "68",
"DeviceName": "docker-253:0-34148462-17e715b9db6bd0796cc41f9da23748590ef6d8c118b414a1076ba02665040fd8",
"DeviceSize": "10737418240"
},
"Name": "devicemapper"
},
"Mounts": [],
"Config": {
"Hostname": "706eba52a567",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"8080/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/tomcat/bin:/usr/local/openjdk-11/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"JAVA_HOME=/usr/local/openjdk-11",
"LANG=C.UTF-8",
"JAVA_VERSION=11.0.11+9",
"CATALINA_HOME=/usr/local/tomcat",
"TOMCAT_NATIVE_LIBDIR=/usr/local/tomcat/native-jni-lib",
"LD_LIBRARY_PATH=/usr/local/tomcat/native-jni-lib",
"GPG_KEYS=48F8E69F6390C9F25CFEDCD268248959359E722B A9C5DF4D22E99998D9875A5110C01C5A2F6059E7 DCFD35E0BF8CA7344752DE8B6FB21E8933C60243",
"TOMCAT_MAJOR=9",
"TOMCAT_VERSION=9.0.50",
"TOMCAT_SHA512=06cd51abbeebba9385f594ed092bd30e510b6314c90c421f4be5d8bec596c6a177785efc2ce27363813f6822af89fc88a2072d7b051960e5387130faf69c447b"
],
"Cmd": [
"catalina.sh",
"run"
],
"Image": "tomcat",
"Volumes": null,
"WorkingDir": "/usr/local/tomcat",
"Entrypoint": null,
"OnBuild": null,
"Labels": {}
},
"NetworkSettings": {
"Bridge": "",
"SandboxID": "1ad99fcf623a208d11b27a6d99e8b46d6091c4c310306f35bf6414deca78fb01",
"HairpinMode": false,
"LinkLocalIPv6Address": "",
"LinkLocalIPv6PrefixLen": 0,
"Ports": {
"8080/tcp": null
},
"SandboxKey": "/var/run/docker/netns/1ad99fcf623a",
"SecondaryIPAddresses": null,
"SecondaryIPv6Addresses": null,
"EndpointID": "4b453a7852e2d543e135ac1232464760a296e857e3f8b46f9d01d4500a0f8bb4",
"Gateway": "172.17.0.1",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"MacAddress": "02:42:ac:11:00:02",
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "b15aa1ecc25828e428cfa89a3a33843e112499b5936fc4939336b2548244fd3f",
"EndpointID": "4b453a7852e2d543e135ac1232464760a296e857e3f8b46f9d01d4500a0f8bb4",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
},
"tomcat-net": {
"IPAMConfig": {},
"Links": null,
"Aliases": [
"706eba52a567"
],
"NetworkID": "e4b86298c1b57f26bc38a8c326347a999c0072a044f89427a3da0a3a3ff86315",
"EndpointID": "8b54d4d05487ade73362f8ebe389e638ac7153e59d3778d270900d9ec7824195",
"Gateway": "172.18.0.1",
"IPAddress": "172.18.0.3",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:12:00:03",
"DriverOpts": {}
}
}
}
}
]
- 经过上述操作,将Tomcat01加入到tomcat-net中后,我们来验证能否Ping通
// 进入到新的Tomcat中
docker exec -it custom-net-tomcat bash
// 获取容器的网络信息
ip a
最后发现能够Ping通
网络模型最终的结果如下:
五、桥接网络 连接的 容器可以通过 Ping 容器名来连通,因为生成了DNS记录;对于普通的网络,则不能通过Ping容器名来连通。
如下为默认网络无法Ping通的验证:
docker exec -it tomcat01 ping 172.17.03
docker ps
docker exec -it tomcat01 ping tomcat02
- 使用自定义的桥接网络来新建两个容器
docker run -d --name tomcat11 --network tomcat-net tomcat
docker run -d --name tomcat22 --network tomcat-net tomcat
- 查看两个新建的容器的ip
docker exec -it tomcat11 ip a ;
docker exec -it tomcat22 ip a
- 桥接网络Ping通IP和容器名称的实验
六、通过link技术增加一条DNS记录访问容器名称(与五结合这看)
docker rm -f tomcat01
docker run -d --name tomcat01 --link tomcat02 tomcat
docker exec -it tomcat01 ping tomcat02
结论:Docker中使用自定义桥接网络不仅能够解决互联互通的问题,而且能解决ping 容器名的问题。
七、Docker中网络的三种形式
桥接网络(bridge):
主机网络(host):
(None):
Docker网络(host、bridge、none)详细介绍
八、多机通信的原理
(1)使得两边的eth0能够通信
(2)前提要确保spring-boot-project container和mysql container的IP地址不一样
(3)将spring-boot-project中的所有信息当成eth0要传输给另外一端的信息
(4)具体通过vxlan技术实现
www.evoila.de/2015/11/06/what-is-vxlan-and-how-it-works
(5)处在vxlan的底层:underlay
处在xxlan的上层:overlay
多机网络通信的问题,底层一个实现技术是:overlay ------>vxlan
network namespace veth-pair 桥接模式 原理
bridge host null —> docker多机网络通信 overlay