原生网络
三种网络bridge、host、none
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5e5795e54bd1 bridge bridge local
bfa2410c5e3f host host local
9e0b3e5e44f4 none null local
- bridge
运行一个容器
[root@server1 ~]# docker run -d --name demo nginx
9ae9ea680fafbd75dfd216b1d73c72a1fe0b3c43f7327734c061c351c9f727f4
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9ae9ea680faf nginx "/docker-entrypoint.…" 18 seconds ago Up 16 seconds 80/tcp demo
网桥连接
[root@server1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242d1d9d203 no veth433938f
veth433938f桥接到docker0上
在server1上ping容器
[root@server1 ~]# docker inspect demo
"IPAddress": "172.17.0.2",
[root@server1 ~]# ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.063 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.045 ms
再开一个容器
[root@server1 ~]# docker run -d --name demo2 nginx
30ed0671ad3f965da91f07f8efe183c13ae9f950393dda485a0649b1ffcd630c
[root@server1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242d1d9d203 no veth14cdfa5
veth433938f
新的容器会自动桥接到接口
- host
删除所有容器
运行一个容器,并且对容器的network做说明 使用host
[root@server1 ~]# docker run -it --rm --network host busybox
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 52:54:00:24:de:51 brd ff:ff:ff:ff:ff:ff
inet 172.25.12.1/24 brd 172.25.12.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::5054:ff:fe24:de51/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:d1:d9:d2:03 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:d1ff:fed9:d203/64 scope link
valid_lft forever preferred_lft forever
- none
[root@server1 ~]# docker run -it --rm --network none busybox
/ # ls
bin dev etc home proc root sys tmp usr var
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
/ # ^C
自定义网络
三种自定义网络驱动:
bridge
overlay
macvlan
- 自定义网桥
现在创建一个网络名为mynet1且driver为bridge的网络:(默认创建的就是bridge)
[root@server1 ~]# docker network create mynet1
fbf299ccc03631140b04985d25c4028d0192ae0ee3fdf580c57d8d9757dbd6fd
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5e5795e54bd1 bridge bridge local
bfa2410c5e3f host host local
fbf299ccc036 mynet1 bridge local
9e0b3e5e44f4 none null local
可以看到我们创建的mynet1的driver是bridge
- 用mynet1创建一个demo1一个demo2
[root@server1 ~]# docker run -d --name demo1 --network mynet1 busybox
509e058ff953b1cf28a5e2341b57a9c53232431fc11561526df049db38f04ac3
[root@server1 ~]# docker run -d --name demo2 --network mynet1 busybox
0512e6d0f2384bf616fb22d5d6d34f53cb9c706ad482d976e8c6d
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
509e058ff953 busybox "sh" 23 seconds ago Up 22 seconds demo2
0512e6d0f238 busybox "sh" 32 seconds ago Up 31 seconds demo1
[root@server1 ~]# docker inspect demo1 | grep '"IPAddress"'
"IPAddress": "",
"IPAddress": "172.22.0.2",
[root@server1 ~]# docker inspect demo2 | grep '"IPAddress"'
"IPAddress": "",
"IPAddress": "172.22.0.3",
并且可以看到他们的ip分别是172.22.0.2和172.22.0.3
进入demo1 ping demo2
[root@server1 ~]# docker attach demo1
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
243: eth0@if244: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:16:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.22.0.2/16 brd 172.22.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping demo2
PING demo2 (172.22.0.3): 56 data bytes
64 bytes from 172.22.0.3: seq=0 ttl=64 time=0.092 ms
64 bytes from 172.22.0.3: seq=1 ttl=64 time=0.091 ms
^C
- 自定义网段
在创建时指定参数:–subnet 、–gateway
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1dd3fbd23551 bridge bridge local
59c0518887a4 harbor_harbor bridge local
655003c309d7 host host local
e3b37c15a2fd none null local
[root@server1 ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 mynet1
d1197bdb695f22dd20828f1da287ffe8125ff0b0804dc0f9baebf17dc7795188
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1dd3fbd23551 bridge bridge local
59c0518887a4 harbor_harbor bridge local
655003c309d7 host host local
d1197bdb695f mynet1 bridge local
e3b37c15a2fd none null local
[root@server1 ~]# docker network inspect mynet1 | grep Gateway
"Gateway": "172.20.0.1"
[root@server1 ~]# docker network inspect mynet1 | grep Subnet
"Subnet": "172.20.0.0/24",
[root@server1 ~]# docker run -d --name test1 --network mynet1 nginx:latest
219a6a25cca4e8be741e4340daf6aa2c1aa7afcfe0bff2a87515662b0ca8ea37
[root@server1 ~]# docker inspect test1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.20.0.2",
可以ping通
[root@server1 ~]# docker tag busybox:latest localhost:5000/busybox:latest
[root@server1 ~]# docker run -it --rm --network mynet1 localhost:5000/busybox:latest
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:14:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.20.0.3/24 brd 172.20.0.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 172.20.0.2
PING 172.20.0.2 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.139 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.087 ms
64 bytes from 172.20.0.2: seq=2 ttl=64 time=0.085 ms
^C
--- 172.20.0.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss
round-trip min/avg/max = 0.085/0.103/0.139 ms
/ # [root@server1 ~]#
- 令不同网桥的容器互通
[root@server1 ~]# docker network create --subnet 172.19.0.0/24 --gateway 172.19.0.1 mynet2
82783161d267dfafbc5fb89390286392a00170a81f5267026fc9bac72574c113
[root@server1 ~]# docker inspect test1 | grep Gateway
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.20.0.1",
"IPv6Gateway": "",
[root@server1 ~]# docker inspect test1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.20.0.2",
[root@server1 ~]# docker network connect mynet2 test1
[root@server1 ~]# docker inspect test1 | grep Gateway
"Gateway": "",
"IPv6Gateway": "",
"Gateway": "172.20.0.1",
"IPv6Gateway": "",
"Gateway": "172.19.0.1",
"IPv6Gateway": "",
[root@server1 ~]# docker inspect test1 | grep IPAddress
"SecondaryIPAddresses": null,
"IPAddress": "",
"IPAddress": "172.20.0.2",
"IPAddress": "172.19.0.2",
[root@server1 ~]# docker run -it --rm --network mynet2 localhost:5000/busybox:latest
/ # ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue 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
14: eth0@if15: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:13:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.19.0.3/24 brd 172.19.0.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping 172.19.0.2
PING 172.19.0.2 (172.19.0.2): 56 data bytes
64 bytes from 172.19.0.2: seq=0 ttl=64 time=0.131 ms
64 bytes from 172.19.0.2: seq=1 ttl=64 time=0.103 ms
^C
--- 172.19.0.2 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.103/0.117/0.131 ms
/ # [root@server4 ~]#
容器通信
容器之间还可以使用名称通信,dns解析必须在自定义网络内使用
[root@server1 ~]# docker run -d --name test1 --network mynet1 nginx:latest
[root@server1 ~]# docker run -it --rm --network mynet1 localhost:5000/busybox:latest
/ # ping test1
PING test1 (172.20.0.2): 56 data bytes
64 bytes from 172.20.0.2: seq=0 ttl=64 time=0.420 ms
64 bytes from 172.20.0.2: seq=1 ttl=64 time=0.188 ms
^C
--- test1 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.188/0.304/0.420 ms
/ # 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.20.0.4 f461900d19a4
/ #
容器访问外网
[root@server1 docker run -d --name test2 -p 80:80 nginx:latest
96559e8ac7b17de2bebb0f6533aa3c7c539666ce658cd2a06ae0a2d00646e786
[root@server1 ~]# docker port test2
80/tcp -> 0.0.0.0:80
[root@server1 ~]# netstat -anltp | grep :80
tcp6 0 0 :::80 :::* LISTEN 15539/docker-proxy
外网访问容器使用了docker-proxy和iptables DNAT
宿主机访问容器使用的是iptables DNAT
主机访问容器和容器之间的访问是docker-proxy实现
未完