docker0
很多时候,容器之间需要互相进行访问。这时候就需要用到docker的网络。
docker有一个默认的网络,叫docker0,桥接模式,使用的技术是veth-pair技术。
所有的容器不指定网络的情况下,都是docker0路由的,docker会给我们的容器分配一个默认的可用ip。
#使用命令查看网络
[root@localhost ~]# ip addr
#本机回环地址
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:f8:f0:85 brd ff:ff:ff:ff:ff:ff
inet 192.168.88.140/24 brd 192.168.88.255 scope global noprefixroute ens33
valid_lft forever preferred_lft forever
inet6 fe80::e2de:8cb7:304a:8bc8/64 scope link noprefixroute
valid_lft forever preferred_lft forever、
#docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:06:a6:72:5f 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:6ff:fea6:725f/64 scope link
valid_lft forever preferred_lft forever
可以看到docker0 的网络为172.17.0.1/16
现在创建一台centos1
#创建centos1
[root@localhost ~]# docker run -it -d --name=centos1 centos /bin/bash
ad3c44413322ee4e9479eeaa9f9b585aec9af855ae7294a3c3efd7a5c097c618
[root@localhost ~]# ip addr
#略 本机回环地址 内网 docker0...
# 发现多了一个
133: vethb8c56f2@if132: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether aa:82:c2:a4:26:92 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet6 fe80::a882:c2ff:fea4:2692/64 scope link
valid_lft forever preferred_lft forever
#查看centos1 的网络
[root@localhost ~]# docker exec -it centos1 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
132: eth0@if133: <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
# 发现宿主机网络有个一编号为133的接口连接 容器centos1中的接口 132.
# 同时 容器中的132接口也连接着宿主机中的接口133
# 获取容器 IP
[root@localhost ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos1
172.17.0.2
#发现 容器属于docker0网络
再创建一台centos2
#创建centos2
[root@localhost ~]# docker run -it -d --name=centos2 centos /bin/bash
5f489e76ea39dd01609dbb07fe24dc7f0799476496c35f4c1aba981c35b05a8c
[root@localhost ~]# ip addr
#略 本机回环地址 内网 docker0 133 ...
135: veth8bce591@if134: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue master docker0 state UP group default
link/ether 32:23:d0:44:3f:6f brd ff:ff:ff:ff:ff:ff link-netnsid 1
inet6 fe80::3023:d0ff:fe44:3f6f/64 scope link
valid_lft forever preferred_lft forever
#发现多了一个135
#同时 centos2 中存在一个134
[root@localhost ~]# docker exec -it centos2 ip addr
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default 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
134: eth0@if135: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff link-netnsid 0
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
# 获取容器 IP
[root@localhost ~]# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' centos2
172.17.0.3
#发现 容器属于docker0网络
可以发现,每创建一台虚拟机,就会多一对网桥
现在,该如何使用 centos1 访问 centos2 ?在已知ip的情况下,直接访问即可。
# 进入centos1
[root@localhost ~]# docker exec -it centos1 /bin/bash
# 尝试连接centos2 的ip
[root@ad3c44413322 /]# ping 172.17.0.3
PING 172.17.0.3 (172.17.0.3) 56(84) bytes of data.
64 bytes from 172.17.0.3: icmp_seq=1 ttl=64 time=0.122 ms
64 bytes from 172.17.0.3: icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from 172.17.0.3: icmp_seq=3 ttl=64 time=0.058 ms
#发现可以连通
#但是更多时候,希望直接使用使用虚拟机的名字来连接,这该如何操作? 如ping centos2
#比较费劲的方法是配置容器的hosts文件
[root@ad3c44413322 /]# vi /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 ad3c44413322
#添加centos2的ip
172.17.0.3 centos2
#尝试连接centos2
[root@ad3c44413322 /]# ping centos2
PING centos2 (172.17.0.3) 56(84) bytes of data.
64 bytes from centos2 (172.17.0.3): icmp_seq=1 ttl=64 time=0.073 ms
64 bytes from centos2 (172.17.0.3): icmp_seq=2 ttl=64 time=0.067 ms
64 bytes from centos2 (172.17.0.3): icmp_seq=3 ttl=64 time=0.077 ms
#但是这种连接是单向的,也就是说centos2 不能通过 ping centos1 直接访问。除非也修改hosts文件
同时可以发现,centos1 网桥连接的是宿主机,容器centos1 中134 网桥对应这宿主机的133。
所以centos1 想要访问centos2 ,那么必须要将信息发送至 docker0 ,然后 docker0再发送到centos2
--link
上文使用centos1去连接centos2 ,但是,使用修改hosts文件的方式比较麻烦,能否简化这个操作?
--link #在创建容器的时候,使用该参数连接其他容器
#创建一个centos3 ,并连接centos1 centos2
[root@localhost ~]# docker run -it -d --name=centos3 --link centos1 --link centos2 centos /bin/bash
a193d0bde89f2f29c366064d94e6b36aaa685fea96f4cb4a784bf1a2fb387f86
#进入容器,并打开hosts
[root@a193d0bde89f /]# 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 centos1 ad3c44413322
172.17.0.3 centos2 5f489e76ea39
172.17.0.4 a193d0bde89f
# 发现 ,--link就是使用修改hosts文件的方式来连接其他容器。
# 那么也就是说centos1 和 centos2 并不能直接ping centos3 来访问该容器。除非再它们的hosts文件中添加centos3
但是这种方式也比较麻烦,需要再创建容器的时候,一个个的去指定,是否有更简单的方式。
自定义网络
#创建自定义的网络
docker network
connect -- Connect a container to a network
create -- Creates a new network with a name specified by the
disconnect -- Disconnects a container from a network
inspect -- Displays detailed information on a network
ls -- Lists all the networks created by the user
prune -- Remove all unused networks
rm -- Deletes one or more networks
一般有四种模式
1、bridge:桥接docker(默认,自己创建也是用bridge模式)
2、none:不配置网络,一般不用
3、host:和所有主机共享网络
4、container:容器网络连通(用的少,局限很大)
#创建一个网络
[root@localhost ~]# docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet
902de831c83373c872921de5d1afe85ba7657182f141224d93f19501ef93df54
#使用该网络创建 centos4 和centos5 两台容器
[root@localhost ~]# docker run -d -it --name=centos4 --net mynet centos /bin/bash
6f1175a385cffca456b6d75cefdb8265275108c4c6ad4aa8481b461a039ff3f8
[root@localhost ~]# docker run -d -it --name=centos5 --net mynet centos /bin/bash
dd8913b1afd223863d07aab2853160270249711408b8c2d7c5af69b59454f012
#进入centos4
[root@localhost ~]# docker exec -it centos4 /bin/bash
#发现可以直接连接centos5
[root@6f1175a385cf /]# ping centos5
PING centos5 (192.168.0.3) 56(84) bytes of data.
64 bytes from centos5.mynet (192.168.0.3): icmp_seq=1 ttl=64 time=0.099 ms
64 bytes from centos5.mynet (192.168.0.3): icmp_seq=2 ttl=64 time=0.073 ms
#同时只要在这个网络中的虚拟机,就能直接进行访问,不需要修改hosts文件