Docker Network
前置知识
协议/接口/端口
在Linux输入ip addr
命令 第一个是本地回环地址, eth0是阿里云服务商分配内网地址,docker0是docker生成的地址。
Network
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
就会发现多出一个
再次启动一个容器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
当删除容器,对应的网桥一对就删除了。
容器互联
问题
当前有两个容器 tomcat01/ tomcat02
分别对应的IP地址
我们可以通过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
可以ping通
# 查看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
网络模式
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
当继续查看网络情况时, 可以看到刚才创建的容器
容器也可以通过服务名ping, 这就是自定义网络好处。
网络连通
docker connect
两个不同的网络如何打通呢?
怎样使用?
➜ ~ 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