docker网络
[root@mcw1 ~]$ docker network ls #docker安装时,自动创建了三个网络 NETWORK ID NAME DRIVER SCOPE 494faac7d060 bridge bridge local cd41eede7725 host host local f1ca2d33644e none null local
指定none或者host网络运行容器
指定none网络运行容器 docker run -it --network=none busybox [root@mcw1 ~]$ docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5f32a681a40e registry:2 "/entrypoint.sh /etc…" 4 days ago Up 16 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp vigorous_golick [root@mcw1 ~]$ [root@mcw1 ~]$ docker run -it --network=none busybox / # ifconfig lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 UP LOOPBACK RUNNING MTU:65536 Metric:1 RX packets:0 errors:0 dropped:0 overruns:0 frame:0 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B) / # / # ping 10.0.0.131 PING 10.0.0.131 (10.0.0.131): 56 data bytes ping: sendto: Network is unreachable / # ping 127.0.0.1 PING 127.0.0.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: seq=0 ttl=64 time=0.172 ms
桥接网络(brctl)
[root@mcw1 ~]$ brctl #没有查看命令 -bash: brctl: command not found 解决方法: [root@mcw1 ~]$ yum install bridge-utils [root@mcw1 ~]$ brctl show #查看桥接网络 bridge name bridge id STP enabled interfaces docker0 8000.024297f6f9f5 no veth1e4bc85 veth43e82ce [root@mcw1 ~]$ docker run -d httpd #运行一个容器后,再看桥接网络 2f2c3267c3fea477975160249c4854190693dda7df2fbe8ea556dc96a971a1d3 [root@mcw1 ~]$ brctl show #发现运行一个容器后,docker0多个个接口 bridge name bridge id STP enabled interfaces docker0 8000.024297f6f9f5 no veth1e4bc85 veth43e82ce vethcde8cf7
[root@mcw1 ~]$ docker ps #查看容器 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f2c3267c3fe httpd "httpd-foreground" 6 minutes ago Up 6 minutes 80/tcp gifted_franklin 86193a633fa7 centos "/bin/bash" 11 minutes ago Up 11 minutes laughing_liskov 5f32a681a40e registry:2 "/entrypoint.sh /etc…" 4 days ago Up 39 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp vigorous_golick [root@mcw1 ~]$ docker exec -it 861 /bin/bash #进入容器 [root@86193a633fa7 /]# ls bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var [root@86193a633fa7 /]# ip a #查看容器网卡信息 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1 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 21: eth0@if22: <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 [root@86193a633fa7 /]# exit [root@mcw1 ~]$ brctl show bridge name bridge id STP enabled interfaces docker0 8000.024297f6f9f5 no veth1e4bc85 veth43e82ce vethcde8cf7 [root@mcw1 ~]$ [root@mcw1 ~]$ docker network inspect bridge #查看桥接网络 [ { "Name": "bridge", "Id": "494faac7d0608e95196457a5c9fbadd888ad69db2db3ef567965dd86ae9456a6", "Created": "2021-12-31T09:13:37.431413692+08: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": { "2f2c3267c3fea477975160249c4854190693dda7df2fbe8ea556dc96a971a1d3": { "Name": "gifted_franklin", "EndpointID": "478447d435355c772111ae2e72c0f18248eb25dc1345a68bb31e3b138471cc0c", "MacAddress": "02:42:ac:11:00:03", "IPv4Address": "172.17.0.3/16", "IPv6Address": "" }, "5f32a681a40e44455a9016cb7bc8a365aaaee83470c75988399d93fe7db93a81": { "Name": "vigorous_golick", "EndpointID": "de6459bd4d725fe5a2c0808d42e93f68fc563883a6af7dc72b10ba4feed7c1a2", "MacAddress": "02:42:ac:11:00:04", "IPv4Address": "172.17.0.4/16", "IPv6Address": "" }, "86193a633fa74957ef4f09b3abbe6bf8c19f6139824247f4b2ee3aa1b04202be": { "Name": "laughing_liskov", "EndpointID": "fc15ac2a2296481a56047d08aa1f0f39df28225d0a6229c040d7cd3552fba05a", "MacAddress": "02:42:ac:11:00:02", "IPv4Address": "172.17.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@mcw1 ~]$ ip a #查看宿主机网卡信息 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1 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 inet6 ::1/128 scope host valid_lft forever preferred_lft forever 2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:d3:09:d5 brd ff:ff:ff:ff:ff:ff inet 10.0.0.131/24 brd 10.0.0.255 scope global ens33 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fed3:9d5/64 scope link valid_lft forever preferred_lft forever 3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000 link/ether 00:0c:29:d3:09:df brd ff:ff:ff:ff:ff:ff inet 172.16.1.131/24 brd 172.16.1.255 scope global ens37 valid_lft forever preferred_lft forever inet6 fe80::20c:29ff:fed3:9df/64 scope link valid_lft forever preferred_lft forever 4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP link/ether 02:42:97:f6:f9:f5 brd ff:ff:ff:ff:ff:ff inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0 valid_lft forever preferred_lft forever inet6 fe80::42:97ff:fef6:f9f5/64 scope link valid_lft forever preferred_lft forever 14: veth43e82ce@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether 1e:02:6d:67:dc:b1 brd ff:ff:ff:ff:ff:ff link-netnsid 2 inet6 fe80::1c02:6dff:fe67:dcb1/64 scope link valid_lft forever preferred_lft forever 22: veth1e4bc85@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether be:ba:17:78:b7:85 brd ff:ff:ff:ff:ff:ff link-netnsid 0 inet6 fe80::bcba:17ff:fe78:b785/64 scope link valid_lft forever preferred_lft forever 24: vethcde8cf7@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP link/ether e2:ab:b3:bd:ea:44 brd ff:ff:ff:ff:ff:ff link-netnsid 1 inet6 fe80::e0ab:b3ff:febd:ea44/64 scope link valid_lft forever preferred_lft forever [root@mcw1 ~]$ brctl show bridge name bridge id STP enabled interfaces docker0 8000.024297f6f9f5 no veth1e4bc85 veth43e82ce vethcde8cf7 [root@mcw1 ~]$ docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2f2c3267c3fe httpd "httpd-foreground" 10 minutes ago Up 10 minutes 80/tcp gifted_franklin 86193a633fa7 centos "/bin/bash" 16 minutes ago Up 16 minutes laughing_liskov 5f32a681a40e registry:2 "/entrypoint.sh /etc…" 4 days ago Up 43 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp vigorous_golick [root@mcw1 ~]$
由图可知,创建一个docker容器,默认在桥接docker0网卡上创建一个接口。接口名称和网卡@前面的值一样,。@后面的f 然后接网卡前面的数字,
[root@mcw1 ~]$ ifconfig docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255 inet6 fe80::42:97ff:fef6:f9f5 prefixlen 64 scopeid 0x20<link> ether 02:42:97:f6:f9:f5 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 5 bytes 438 (438.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 10.0.0.131 netmask 255.255.255.0 broadcast 10.0.0.255 inet6 fe80::20c:29ff:fed3:9d5 prefixlen 64 scopeid 0x20<link> ether 00:0c:29:d3:09:d5 txqueuelen 1000 (Ethernet) RX packets 14427 bytes 9387349 (8.9 MiB) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 7727 bytes 774908 (756.7 KiB) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet 172.16.1.131 netmask 255.255.255.0 broadcast 172.16.1.255 inet6 fe80::20c:29ff:fed3:9df prefixlen 64 scopeid 0x20<link> ether 00:0c:29:d3:09:df txqueuelen 1000 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 10 bytes 768 (768.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536 inet 127.0.0.1 netmask 255.0.0.0 inet6 ::1 prefixlen 128 scopeid 0x10<host> loop txqueuelen 1 (Local Loopback) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 0 bytes 0 (0.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth1e4bc85: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::bcba:17ff:fe78:b785 prefixlen 64 scopeid 0x20<link> ether be:ba:17:78:b7:85 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 veth43e82ce: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::1c02:6dff:fe67:dcb1 prefixlen 64 scopeid 0x20<link> ether 1e:02:6d:67:dc:b1 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 vethcde8cf7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500 inet6 fe80::e0ab:b3ff:febd:ea44 prefixlen 64 scopeid 0x20<link> ether e2:ab:b3:bd:ea:44 txqueuelen 0 (Ethernet) RX packets 0 bytes 0 (0.0 B) RX errors 0 dropped 0 overruns 0 frame 0 TX packets 8 bytes 648 (648.0 B) TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 [root@mcw1 ~]$
bridge网络
[root@mcw1 ~]$ brctl #没有查看命令
-bash: brctl: command not found
解决方法:
[root@mcw1 ~]$ yum install bridge-utils
[root@mcw1 ~]$ brctl show #查看桥接网络
bridge name bridge id STP enabled interfaces
docker0 8000.024297f6f9f5 no veth1e4bc85
veth43e82ce
[root@mcw1 ~]$ docker run -d httpd #运行一个容器后,再看桥接网络
2f2c3267c3fea477975160249c4854190693dda7df2fbe8ea556dc96a971a1d3
[root@mcw1 ~]$ brctl show #发现运行一个容器后,docker0多个个接口
bridge name bridge id STP enabled interfaces
docker0 8000.024297f6f9f5 no veth1e4bc85
veth43e82ce
vethcde8cf7
[root@mcw1 ~]$ docker ps #查看容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f2c3267c3fe httpd "httpd-foreground" 6 minutes ago Up 6 minutes 80/tcp gifted_franklin
86193a633fa7 centos "/bin/bash" 11 minutes ago Up 11 minutes laughing_liskov
5f32a681a40e registry:2 "/entrypoint.sh /etc…" 4 days ago Up 39 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp vigorous_golick
[root@mcw1 ~]$ docker exec -it 861 /bin/bash #进入容器
[root@86193a633fa7 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var
[root@86193a633fa7 /]# ip a #查看容器网卡信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
21: eth0@if22: <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
[root@86193a633fa7 /]# exit
[root@mcw1 ~]$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024297f6f9f5 no veth1e4bc85
veth43e82ce
vethcde8cf7
[root@mcw1 ~]$
[root@mcw1 ~]$ docker network inspect bridge #查看桥接网络
[
{
"Name": "bridge",
"Id": "494faac7d0608e95196457a5c9fbadd888ad69db2db3ef567965dd86ae9456a6",
"Created": "2021-12-31T09:13:37.431413692+08: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": {
"2f2c3267c3fea477975160249c4854190693dda7df2fbe8ea556dc96a971a1d3": {
"Name": "gifted_franklin",
"EndpointID": "478447d435355c772111ae2e72c0f18248eb25dc1345a68bb31e3b138471cc0c",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"5f32a681a40e44455a9016cb7bc8a365aaaee83470c75988399d93fe7db93a81": {
"Name": "vigorous_golick",
"EndpointID": "de6459bd4d725fe5a2c0808d42e93f68fc563883a6af7dc72b10ba4feed7c1a2",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
},
"86193a633fa74957ef4f09b3abbe6bf8c19f6139824247f4b2ee3aa1b04202be": {
"Name": "laughing_liskov",
"EndpointID": "fc15ac2a2296481a56047d08aa1f0f39df28225d0a6229c040d7cd3552fba05a",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.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@mcw1 ~]$ ip a #查看宿主机网卡信息
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1
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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d3:09:d5 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.131/24 brd 10.0.0.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed3:9d5/64 scope link
valid_lft forever preferred_lft forever
3: ens37: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000
link/ether 00:0c:29:d3:09:df brd ff:ff:ff:ff:ff:ff
inet 172.16.1.131/24 brd 172.16.1.255 scope global ens37
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fed3:9df/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP
link/ether 02:42:97:f6:f9:f5 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:97ff:fef6:f9f5/64 scope link
valid_lft forever preferred_lft forever
14: veth43e82ce@if13: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether 1e:02:6d:67:dc:b1 brd ff:ff:ff:ff:ff:ff link-netnsid 2
inet6 fe80::1c02:6dff:fe67:dcb1/64 scope link
valid_lft forever preferred_lft forever
22: veth1e4bc85@if21: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether be:ba:17:78:b7:85 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::bcba:17ff:fe78:b785/64 scope link
valid_lft forever preferred_lft forever
24: vethcde8cf7@if23: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP
link/ether e2:ab:b3:bd:ea:44 brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::e0ab:b3ff:febd:ea44/64 scope link
valid_lft forever preferred_lft forever
[root@mcw1 ~]$ brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024297f6f9f5 no veth1e4bc85
veth43e82ce
vethcde8cf7
[root@mcw1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2f2c3267c3fe httpd "httpd-foreground" 10 minutes ago Up 10 minutes 80/tcp gifted_franklin
86193a633fa7 centos "/bin/bash" 16 minutes ago Up 16 minutes laughing_liskov
5f32a681a40e registry:2 "/entrypoint.sh /etc…" 4 days ago Up 43 minutes 0.0.0.0:5000->5000/tcp, :::5000->5000/tcp vigorous_golick
[root@mcw1 ~]$
查看docker0网卡
[root@mcw1 ~]$ ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:97ff:fef6:f9f5 prefixlen 64 scopeid 0x20<link>
ether 02:42:97:f6:f9:f5 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 5 bytes 438 (438.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens33: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 10.0.0.131 netmask 255.255.255.0 broadcast 10.0.0.255
inet6 fe80::20c:29ff:fed3:9d5 prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d3:09:d5 txqueuelen 1000 (Ethernet)
RX packets 14427 bytes 9387349 (8.9 MiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 7727 bytes 774908 (756.7 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
ens37: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.16.1.131 netmask 255.255.255.0 broadcast 172.16.1.255
inet6 fe80::20c:29ff:fed3:9df prefixlen 64 scopeid 0x20<link>
ether 00:0c:29:d3:09:df txqueuelen 1000 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 10 bytes 768 (768.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
inet6 ::1 prefixlen 128 scopeid 0x10<host>
loop txqueuelen 1 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth1e4bc85: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::bcba:17ff:fe78:b785 prefixlen 64 scopeid 0x20<link>
ether be:ba:17:78:b7:85 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
veth43e82ce: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::1c02:6dff:fe67:dcb1 prefixlen 64 scopeid 0x20<link>
ether 1e:02:6d:67:dc:b1 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
vethcde8cf7: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet6 fe80::e0ab:b3ff:febd:ea44 prefixlen 64 scopeid 0x20<link>
ether e2:ab:b3:bd:ea:44 txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 8 bytes 648 (648.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@mcw1 ~]$
==============
user-defined网络
1、指定桥接驱动创建网络,
[root@mcw1 ~]$
[root@mcw1 ~]$ docker network create --driver bridge my_net #创建桥接网络,起个网络名字
063dd5ed24ecf85fe466dc5ce847ea0f5a54529fa1c3baf943d25c3f0e4e2507
[root@mcw1 ~]$ brctl show #查看网络,第一个 就是新建的网络,这里没有显示名字
bridge name bridge id STP enabled interfaces
br-063dd5ed24ec 8000.02425a7ddc7f no
docker0 8000.0242201cab73 no
[root@mcw1 ~]$ docker network inspect my_net #网络查看 my_net ,能看到网络名字,id,创建时间,驱动是桥接,
[ #网络的子网网段,以及网关等信息。网段是docker自动分配的网段
{
"Name": "my_net",
"Id": "063dd5ed24ecf85fe466dc5ce847ea0f5a54529fa1c3baf943d25c3f0e4e2507",
"Created": "2022-01-01T07:47:52.597628781+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@mcw1 ~]$
2、指定ip网段创建容器,同时创建网络
[root@mcw1 ~]$ docker network #tab键查看用创建,连接,断开冷静,列出,prune,删除网络等功能
connect create disconnect inspect ls prune rm
[root@mcw1 ~]$ docker network ls #查看网络,能看到自己创建的网络my_net。然后使用inspect指定网络名字来查看网络的具体信息
NETWORK ID NAME DRIVER SCOPE #ls 查看,根据名字再inspect查看具体信息,比如网段网关,根据id查看是哪个网卡
f83b92c6db8b bridge bridge local
cd41eede7725 host host local
063dd5ed24ec my_net bridge local
f1ca2d33644e none null local
[root@mcw1 ~]$ docker network create --driver bridge --subnet 172.22.16.0/24 --gateway 172.22.16.1 my_net2
10247a1ada112adc856b86c36c449a7d992dabc242457c01b5ad5bd48b7b6e14 #使用命令指定ip网段创建新的网络
[root@mcw1 ~]$ docker network inspect my_net2 #查看网络
[
{
"Name": "my_net2",
"Id": "10247a1ada112adc856b86c36c449a7d992dabc242457c01b5ad5bd48b7b6e14",
"Created": "2022-01-01T08:00:03.066442093+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.22.16.0/24", #可以看到网段和网关都是指定的
"Gateway": "172.22.16.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
[root@mcw1 ~]$ ip a|grep 10247a #根据id过滤新建网卡的全名
6: br-10247a1ada11: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
inet 172.22.16.1/24 brd 172.22.16.255 scope global br-10247a1ada11
[root@mcw1 ~]$ ifconfig br-10247a1ada11 #根据网卡名字查出网卡的信息,显示网卡的ip,即该网段的网关
br-10247a1ada11: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.22.16.1 netmask 255.255.255.0 broadcast 172.22.16.255
ether 02:42:d7:55:5b:0e txqueuelen 0 (Ethernet)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
3、指定新建的网络,运行容器,动态为容器分配ip
[root@mcw1 ~]$ docker run -it --network=my_net2 busybox # 指定新建的网络,运行容器
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1 #容器中显示回环地址
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
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue #eth0@xx,容器网卡信息
link/ether 02:42:ac:16:10:02 brd ff:ff:ff:ff:ff:ff
inet 172.22.16.2/24 brd 172.22.16.255 scope global eth0 #容器被动态分配到的ip。网络类型,桥接,
valid_lft forever preferred_lft forever
/ #
4、指定新建的网络,运行容器,为容器分配指定静态ip
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox #指定新建的网络,运行容器,为容器分配指定静态ip
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:16:10:03 brd ff:ff:ff:ff:ff:ff
inet 172.22.16.3/24 brd 172.22.16.255 scope global eth0 #为容器指定的静态ip
valid_lft forever preferred_lft forever
/ #
5、各种问题
没有指定子网--network,会报错
[root@mcw1 ~]$ docker run -it --network=my_net --ip 172.22.16.3 busybox
ERRO[0000] error waiting for container: context canceled
docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
[root@mcw1 ~]$ docker inspect my_net
[
{
"Name": "my_net",
"Id": "063dd5ed24ecf85fe466dc5ce847ea0f5a54529fa1c3baf943d25c3f0e4e2507",
"Created": "2022-01-01T07:47:52.597628781+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]
问题二;
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox #ip地址被使用了的
docker: Error response from daemon: Address already in use.
[root@mcw1 ~]$
问题三:
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 192.168.16.3 busybox #指定了不存在的网段的ip
ERRO[0000] error waiting for container: context canceled
docker: Error response from daemon: Invalid address 192.168.16.3: It does not belong to any of this network's subnets.
问题四:
[root@mcw1 ~]$ docker run -it --network=my_net --ip 172.22.16.3 busybox 么有指定子网
ERRO[0000] error waiting for container: context canceled
docker: Error response from daemon: user specified IP address is supported only when connecting to networks with user configured subnets.
问题五:
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox #容器退出,释放ip,能继续使用,否则再次使用会报错ip已被使用
/ #
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox
/ #
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox
/ #
6、在同一个网络下创建的容器,网络相互之间互通
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox
/ #
/ #
/ # ping 172.22.16.4
PING 172.22.16.4 (172.22.16.4): 56 data bytes
64 bytes from 172.22.16.4: seq=0 ttl=64 time=0.356 ms
64 bytes from 172.22.16.4: seq=1 ttl=64 time=0.074 ms
^C
--- 172.22.16.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.074/0.215/0.356 ms
/ #
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.3 busybox
docker: Error response from daemon: Address already in use.
[root@mcw1 ~]$ docker run -it --network=my_net2 --ip 172.22.16.4 busybox
/ # ping 172.22.16.4
PING 172.22.16.4 (172.22.16.4): 56 data bytes
64 bytes from 172.22.16.4: seq=0 ttl=64 time=0.158 ms
^C
--- 172.22.16.4 ping statistics ---
1 packets transmitted, 1 packets received, 0% packet loss
round-trip min/avg/max = 0.158/0.158/0.158 ms
/ #
7、在不同的网络下,网络不通,以及解决方法
运行一个httpd,默认在docker0下
[root@mcw1 ~]$ docker run -it --network=my_net centos
[root@1f0e216d08e4 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
31: eth0@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@1f0e216d08e4 /]# ping 172.22.16.4 #使用my_net创建的容器,不能ping通my_net2创建的容器
PING 172.22.16.4 (172.22.16.4) 56(84) bytes of data.
解决方法:
[root@mcw1 ~]$ ip r #查看路由,每个网段都有一条路由,包括my_net1和2的。如果缺少路由咋样,如何模拟
default via 10.0.0.2 dev ens33 proto static metric 100
default via 172.16.1.2 dev ens37 proto static metric 101
10.0.0.0/24 dev ens33 proto kernel scope link src 10.0.0.131 metric 100
172.16.1.0/24 dev ens37 proto kernel scope link src 172.16.1.131 metric 100
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.18.0.0/16 dev br-063dd5ed24ec proto kernel scope link src 172.18.0.1
172.22.16.0/24 dev br-10247a1ada11 proto kernel scope link src 172.22.16.1
查看ip转发配置,已经配置了的
[root@mcw1 ~]$ sysctl net.ipv4.ip_forward
net.ipv4.ip_forward = 1
当给没有他们添加一块共有的网络,然后里面就通了
[root@mcw1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f0e216d08e4 centos "/bin/bash" 12 minutes ago Up 12 minutes peaceful_volhard
6be00b1ef2fd httpd "httpd-foreground" 16 minutes ago Up 16 minutes 0.0.0.0:1008->80/tcp, :::1008->80/tcp inspiring_varahamihira
bd5489bdf75d busybox "sh" 32 minutes ago Up 32 minutes focused_khayyam
27c94878750c busybox "sh" 34 minutes ago Up 34 minutes goofy_jones
[root@mcw1 ~]$ docker network connect my_net2 1f0e
[root@mcw1 ~]$ docker run -it --network=my_net centos
[root@1f0e216d08e4 /]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
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
31: eth0@if32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
[root@1f0e216d08e4 /]# ping 172.22.16.4
PING 172.22.16.4 (172.22.16.4) 56(84) bytes of data.
64 bytes from 172.22.16.4: icmp_seq=777 ttl=64 time=0.244 ms
64 bytes from 172.22.16.4: icmp_seq=778 ttl=64 time=0.066 ms
容器间通信
ip 通信,或者dns通信。
ip不确定性,所以容器间通信可以用dns,也就是可以用容器名称。--name 指定容器名称。只能在用户自定义网络中使用
[root@mcw1 ~]$ docker run -it --network=my_net2 --name=bbox1 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
37: eth0@if38: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:16:10:03 brd ff:ff:ff:ff:ff:ff
inet 172.22.16.3/24 brd 172.22.16.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 172.22.16.4
PING 172.22.16.4 (172.22.16.4): 56 data bytes
64 bytes from 172.22.16.4: seq=0 ttl=64 time=0.177 ms
64 bytes from 172.22.16.4: seq=1 ttl=64 time=0.080 ms
^C
--- 172.22.16.4 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.080/0.128/0.177 ms
/ # ping bbox1
PING bbox1 (172.22.16.3): 56 data bytes
64 bytes from 172.22.16.3: seq=0 ttl=64 time=0.104 ms
64 bytes from 172.22.16.3: seq=1 ttl=64 time=0.073 ms
^C
--- bbox1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.073/0.088/0.104 ms
[root@mcw1 ~]$ docker run -it --network=my_net2 --name=bbox2 busybox
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
39: eth0@if40: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:16:10:04 brd ff:ff:ff:ff:ff:ff
inet 172.22.16.4/24 brd 172.22.16.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
joined两个或多个容器共享一个网络栈,共享网卡和配置信息,可以通过回环地址通信
[root@mcw1 ~]$
[root@mcw1 ~]$ docker run -it --network=container:^C
[root@mcw1 ~]$
[root@mcw1 ~]$ docker run -d -it --name=web1 httpd
f01b71afcc0d8ad11001cde6be0d83537ebf189ea2f397fdb18a322713493cb6
[root@mcw1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f01b71afcc0d httpd "httpd-foreground" 10 seconds ago Up 9 seconds 80/tcp web1
f2b8bd0e9ab3 busybox "sh" 10 minutes ago Up About a minute bbox2
fb98c05ef10f busybox "sh" 10 minutes ago Up About a minute bbox1
6be00b1ef2fd httpd "httpd-foreground" 38 minutes ago Up 38 minutes 0.0.0.0:1008->80/tcp, :::1008->80/tcp inspiring_varahamihira
[root@mcw1 ~]$ docker run -it --network=container:web1 busybox #执行之后,容器与web1的容器mac地址和ip完全一样,可以通过127,。0.0.1访问web上的各个端口
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1
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
45: eth0@if46: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
将容器与外部世界连接之容器访问外网
[root@mcw1 ~]$ hostname -I
10.0.0.131 172.16.1.131 172.17.0.1 172.18.0.1 172.22.16.1
[root@mcw1 ~]$ ping -c 1 www.bing.com #在宿主机上查看,网络是通外网的
PING china.bing123.com (202.89.233.100) 56(84) bytes of data.
64 bytes from 202.89.233.100 (202.89.233.100): icmp_seq=1 ttl=128 time=5.18 ms
--- china.bing123.com ping statistics ---
1 packets transmitted, 1 received, 0% packet loss, time 0ms
rtt min/avg/max/mdev = 5.187/5.187/5.187/0.000 ms
[root@mcw1 ~]$ docker run -it busybox #运行容器,默认是在docker0网卡上,这里ping书上是通外网的,但是我试验却不通外网,哪里有问题呢
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # ping -c 1 www.bing.com
ping: bad address 'www.bing.com'
/ # ping -c 1 223.5.5.5
PING 223.5.5.5 (223.5.5.5): 56 data bytes
--- 223.5.5.5 ping statistics ---
1 packets transmitted, 0 packets received, 100% packet loss
/ #
如何查看容器所在网络,以及网络的详情
[root@mcw1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4cb48985e52 busybox "sh" 15 minutes ago Up 15 minutes infallible_bartik
f01b71afcc0d httpd "httpd-foreground" 8 hours ago Up 8 hours 80/tcp web1
f2b8bd0e9ab3 busybox "sh" 8 hours ago Up 8 hours bbox2
fb98c05ef10f busybox "sh" 8 hours ago Up 8 hours bbox1
6be00b1ef2fd httpd "httpd-foreground" 8 hours ago Up 8 hours 0.0.0.0:1008->80/tcp, :::1008->80/tcp inspiring_varahamihira
[root@mcw1 ~]$ docker inspect infallible_bartik -f "{{json .NetworkSettings.Networks }}"
{"bridge":{"IPAMConfig":null,"Links":null,"Aliases":null,"NetworkID":"f83b92c6db8bbebf45b2b02377ec1d6f7a6ba2c4844abbac23138fa1f515d3b9","EndpointID":"866ef51a2dfde0cc11d132b02dfdb4f3cad100e4c0ff76168c619a7067229303","Gateway":"172.17.0.1","IPAddress":"172.17.0.4","IPPrefixLen":16,"IPv6Gateway":"","GlobalIPv6Address":"","GlobalIPv6PrefixLen":0,"MacAddress":"02:42:ac:11:00:04","DriverOpts":null}}
[root@mcw1 ~]$ docker network inspect f83b92c6d
[
{
"Name": "bridge",
"Id": "f83b92c6db8bbebf45b2b02377ec1d6f7a6ba2c4844abbac23138fa1f515d3b9",
"Created": "2022-01-01T06:01:31.608746019+08: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": {
"6be00b1ef2fdbfa9689348513d3db0c11ec3a1e0ebc40ecad93ced117ea06c16": {
"Name": "inspiring_varahamihira",
"EndpointID": "f38cf94e00f9fe6ce35afdcb346fd25e3dd7ee06f19db09e8825ce1263bc17b3",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
},
"f01b71afcc0d8ad11001cde6be0d83537ebf189ea2f397fdb18a322713493cb6": {
"Name": "web1",
"EndpointID": "605645d40ada656d764b0db410748f856fa353e6651bbb25a74d5e08118d797c",
"MacAddress": "02:42:ac:11:00:03",
"IPv4Address": "172.17.0.3/16",
"IPv6Address": ""
},
"f4cb48985e52c0109f35967e6a6e8ab3e5fcc742a21d9c552bfce777e91e1117": {
"Name": "infallible_bartik",
"EndpointID": "866ef51a2dfde0cc11d132b02dfdb4f3cad100e4c0ff76168c619a7067229303",
"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": {}
}
]
上面这个参数显示是docker0网卡
"com.docker.network.bridge.name": "docker0",
Containersx下还有当前查看的容器网络信息
"f4cb48985e52c0109f35967e6a6e8ab3e5fcc742a21d9c552bfce777e91e1117": {
"Name": "infallible_bartik",
"EndpointID": "866ef51a2dfde0cc11d132b02dfdb4f3cad100e4c0ff76168c619a7067229303",
"MacAddress": "02:42:ac:11:00:04",
"IPv4Address": "172.17.0.4/16",
"IPv6Address": ""
}
由上可知,我的容器是docker0网卡,但是为啥不是像其它人的案例那样,能直接通外网呢?
在宿主机上,访问容器ip加web服务端口,是可以访问到的
[root@mcw1 ~]$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4cb48985e52 busybox "sh" 25 minutes ago Up 25 minutes infallible_bartik
f01b71afcc0d httpd "httpd-foreground" 8 hours ago Up 8 hours 80/tcp web1
f2b8bd0e9ab3 busybox "sh" 8 hours ago Up 8 hours bbox2
fb98c05ef10f busybox "sh" 8 hours ago Up 8 hours bbox1
6be00b1ef2fd httpd "httpd-foreground" 9 hours ago Up 9 hours 0.0.0.0:1008->80/tcp, :::1008->80/tcp inspiring_varahamihira
[root@mcw1 ~]$ docker exec -it 6be0 hostname -i
172.17.0.2 172.22.16.2
[root@mcw1 ~]$ wget 172.17.0.2:80
--2022-01-01 17:23:22-- http://172.17.0.2/
Connecting to 172.17.0.2:80... connected.
HTTP request sent, awaiting response... 200 OK
Length: 45 [text/html]
Saving to: ‘index.html’
100%[========================================================================================================================================>] 45 --.-K/s in 0s
2022-01-01 17:23:22 (5.82 MB/s) - ‘index.html’ saved [45/45]
[root@mcw1 ~]$
在同一个网络docker0下,容器内直接访问其它容器的ip加端口,服务是可以被访问到的
[root@mcw1 ~]$ docker run -it busybox
WARNING: IPv4 forwarding is disabled. Networking will not work.
/ # wget 172.17.0.2:80
Connecting to 172.17.0.2:80 (172.17.0.2:80)
saving to 'index.html'
index.html 100% |**********************************************************************************************************************************| 45 0:00:00 ETA
'index.html' saved
/ # cat index.html
<html><body><h1>It works!</h1></body></html>
/ #
回头再细研究研究,容器出外网的事情
如何查看在容器中ping外网,使用tcpdump命令
tcpdump -i docker0 -n icmp #指定icmp协议,指定网卡是docker0
tcpdump -i ens33 -n icmp #再指定网卡是外网ens33
前容器默认不能通外网的原因,未开通ipv4转发
[root@mcw1 ~]$ sysctl -p #执行命令,未发现ipv4转发的配置 ,如果是检查开启了哪些服务,测试上用这命令查可以,生产上还是另找查询生效配置的方式, net.ipv4.tcp_fin_timeout = 2 net.ipv4.tcp_tw_reuse = 1 [root@mcw1 ~]$ tail -1 /etc/sysctl.conf #现在添加转发并使之生效 net.ipv4.ip_forward = 1 然后查看使用docker0网卡的容器,是否能通外网,这里显示可以通外网了。也就是容器默认是能 访问外网的,不能访问,或许是未开启IPv4转发 / # hostname -i 172.17.0.4 / # ping -c 1 www.baidu.com PING www.baidu.com (110.242.68.4): 56 data bytes 64 bytes from 110.242.68.4: seq=0 ttl=127 time=12.046 ms --- www.baidu.com ping statistics --- 1 packets transmitted, 1 packets received, 0% packet loss round-trip min/avg/max = 12.046/12.046/12.046 ms 容器默认通外网,tcpdump检查网络 [root@mcw1 ~]$ tcpdump -i docker0 -n icmp #指定网络接口,docker0网卡, 指定监听协议, #如下可以看到,icmp协议包,有请求,有响应,每个请求和响应都有id,seq和length。 #容器ip172.17.0.4访问外网www.bing.com,有请求,有响应。这中间是否做了其它事情,下面再看 tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on docker0, link-type EN10MB (Ethernet), capture size 262144 bytes 17:48:48.903693 IP 172.17.0.4 > 202.89.233.101: ICMP echo request, id 18, seq 24, length 64 17:48:48.909830 IP 202.89.233.101 > 172.17.0.4: ICMP echo reply, id 18, seq 24, length 64 17:48:49.905262 IP 172.17.0.4 > 202.89.233.101: ICMP echo request, id 18, seq 25, length 64 17:48:49.910749 IP 202.89.233.101 > 172.17.0.4: ICMP echo reply, id 18, seq 25, length 64 17:48:50.907280 IP 172.17.0.4 > 202.89.233.101: ICMP echo request, id 18, seq 26, length 64 17:48:50.913014 IP 202.89.233.101 > 172.17.0.4: ICMP echo reply, id 18, seq 26, length 64 ^C 6 packets captured 6 packets received by filter 0 packets dropped by kernel [root@mcw1 ~]$ iptables-save |grep docker0|grep MASQUERADE #执行命令是查看还是保存,不太清楚,回头再验证。 -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE #现在先看,从容器172.17.0.4发给docker0网卡的包,源ip是172.17.0.0/16网段,符合要;想要通过docker0网卡出去,去外网也符合,然后脚本-j MASQUERADE动作处理,这是个snat,就是将源地址修改为本机ip地址。这样出去的包就成了从宿主机ip地址10.0.0.131向外网www.bing.com发起请求,因为宿主机本身通外网,这样就实现了容器通外网了 [root@mcw1 ~]$ tcpdump -i ens33 -n icmp tcpdump: verbose output suppressed, use -v or -vv for full protocol decode listening on ens33, link-type EN10MB (Ethernet), capture size 262144 bytes 17:53:40.957791 IP 10.0.0.131 > 202.89.233.101: ICMP echo request, id 18, seq 315, length 64 17:53:40.966779 IP 202.89.233.101 > 10.0.0.131: ICMP echo reply, id 18, seq 315, length 64 17:53:41.958746 IP 10.0.0.131 > 202.89.233.101: ICMP echo request, id 18, seq 316, length 64 17:53:41.963919 IP 202.89.233.101 > 10.0.0.131: ICMP echo reply, id 18, seq 316, length 64‘ ’
外部世界访问容器
[root@mcw1 ~]$ docker run -d -p 80 httpd 4c3b0df65183bd97ca8e48c84f64d148d6892ced92a553ce4c5eeb9ad11319fa [root@mcw1 ~]$ docker ps #ps查看容器映射80 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 4c3b0df65183 httpd "httpd-foreground" 8 seconds ago Up 6 seconds 0.0.0.0:49153->80/tcp, :::49153->80/tcp friendly_noyce [root@mcw1 ~]$ docker port 4c3b #port查看容器映射端口 80/tcp -> 0.0.0.0:49153 80/tcp -> :::49153 [root@mcw1 ~]$ curl 10.0.0.131:49153 #通过访问宿主机ip,宿主机映射端口,来访问容器内部服务 <html><body><h1>It works!</h1></body></html> [root@mcw1 ~]$ docker run -d -p 8080:80 httpd #也可以指定映射端口让外部访问 进程来处理容器的流量 [root@mcw1 ~]$ ps -ef|grep docker-proxy 每一个映射端口,都会启动一个docker-proxy root 2126 1737 0 22:14 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 49153 -container-ip 172.17.0.2 -container-port 80 root 2130 1737 0 22:14 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 49153 -container-ip 172.17.0.2 -container-port 80 root 2331 1737 0 22:40 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 8080 -container-ip 172.17.0.3 -container-port 80 root 2335 1737 0 22:40 ? 00:00:00 /usr/bin/docker-proxy -proto tcp -host-ip :: -host-port 8080 -container-ip 172.17.0.3 -container-port 80 root 2528 1467 0 23:12 pts/0 00:00:00 grep --color=auto docker-proxy