Docker学习(四) 网络

理解docker0

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# docker 是如何处理容器网络访问的

(base) root@linux:/home/cpss# docker run -d -P --name tomcat01 tomcat

# 查看容器的内部网络地址 ip addr
# 发现容器启动的时候会得到一个 eth0@if34 ip地址,docker分配的
(base) root@linux:/home/cpss# docker exec -it tomcat01 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
33: eth0@if34: <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

# 思考:linux能不能ping通容器内部
(base) root@linux:/home/cpss# 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.107 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.055 ms

# linux 可以ping通docker容器内部

原理

  • 我们每启动一个docker容器,docker就会给docker容器分配一个ip,只要安装了docker,就会有一个网卡docker0 桥接模式,使用的技术是 evth-pair技术

    现在再在宿主机执行ip addr,发现多了一个

再启动一个容器测试

1
2
3
4
5
6
7
(base) root@linux:/home/cpss# docker run -d -P --name tomcat02 tomcat
# 每启动一个就多一个网卡

# 发现这个容器带来的网卡,都是一对一对的
# evth-pair 就是一对的虚拟设备端口,他们都是成对出现的,一段连着协议,一段彼此相连
# 正因为有这个特性,evth-pair 充当一个桥梁,连接各种虚拟网络设备的
# Openstac,Docker容器之间的链接,ovs的链接,都是使用这个技术

测试一下tomcat01和tomcat02是否能ping通

1
2
3
4
5
6
7
8
(base) root@linux:/home/cpss# docker exec -it tomcat02 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.135 ms
64 bytes from 172.17.0.2: icmp_seq=2 ttl=64 time=0.086 ms
64 bytes from 172.17.0.2: icmp_seq=3 ttl=64 time=0.067 ms


# 结论 容器之间可以互相ping通的

Tomcat01 和tomcat02 是公用的一个路由器,docker0

所有的容器不指定网络的情况下,都是使用docker0路由的,docker会给我们的容器分配一个默认的可用ip

小结

docker 使用的是桥接,宿主机中是一个docker容器的网桥 docker0

docker 中所有的网络端口都是虚拟的,虚拟的转发效率高(内网传递)

思考一个场景,编写了一个微服务,database url=ip:, 项目不重启,数据库ip换掉了,我们希望可以处理这个问题,可以通过名字来进行访问容器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
(base) root@linux:/home/cpss# docker exec -it tomcat02 ping tomcat01
ping: tomcat01: Name or service not known

(base) root@linux:/home/cpss# docker run -d -P --name tomcat03 --link tomcat02 tomcat
6f62526ba5484b2c542bc31b0891a1f06c1baedbdb8667322b9b051a1f443e06

# 通过--link 可以解决
(base) root@linux:/home/cpss# docker exec -it tomcat03 ping tomcat02
PING tomcat02 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat02 (172.17.0.3): icmp_seq=1 ttl=64 time=0.108 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=2 ttl=64 time=0.066 ms
64 bytes from tomcat02 (172.17.0.3): icmp_seq=3 ttl=64 time=0.069 ms

# 反向 ping不通
(base) root@linux:/home/cpss# docker exec -it tomcat02 ping tomcat03
ping: tomcat03: Name or service not known


(base) root@linux:/home/cpss# docker network ls
NETWORK ID NAME DRIVER SCOPE
27abb1e4b0d3 bridge bridge local
e69e785a705e host host local
2412989a4eb3 none null local


# 其实这个tomcat03就是在本地配置了tomcat02的配置
# --link 就是我们在hosts配置中增加了一个 映射
(base) root@linux:/home/cpss# 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.17.0.3 tomcat02 9de7a985a568
172.17.0.4 6f62526ba548

现在玩docker已经不建议使用 —link了

自定义网络! 不适用docker0

docker0问题:他不支持容器名链接访问

自定义网络 (容器互联)

1
2
3
4
5
6
7
8
9
(base) root@linux:/home/cpss# docker network --help
Commands:
connect Connect a container to a network
create Create a network
disconnect Disconnect a container from a network
inspect Display detailed information on one or more networks
ls List networks
prune Remove all unused networks
rm Remove one or more networks
1
2
3
4
5
(base) root@linux:/home/cpss# docker network ls
NETWORK ID NAME DRIVER SCOPE
27abb1e4b0d3 bridge bridge local
e69e785a705e host host local
2412989a4eb3 none null local

网络模式

  • bridge:桥接docker (默认)
  • none: 不配置网络
  • host: 和宿主机共享网络
  • container:容器内网络连通 (用的少,局限性大)

测试

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
# 我们之间启动的命令 --net bridge 而这个就是我们的docker0
docker run -d -P --name tomcat01 tomcat
docker run -d -P --name tomcat01 --net bridge tomcat

# docker0 特点。默认,域名不能访问, --link可以打通

# 我们可以自定义个网络
(base) root@linux:/home/cpss# docker network create --help
Options:
--attachable Enable manual container attachment
--aux-address map Auxiliary IPv4 or IPv6 addresses used by Network driver (default map[])
--config-from string The network from which to copy the configuration
--config-only Create a configuration only network
-d, --driver string Driver to manage the Network (default "bridge")
--gateway strings IPv4 or IPv6 Gateway for the master subnet
--ingress Create swarm routing-mesh network
--internal Restrict external access to the network
--ip-range strings Allocate container ip from a sub-range
--ipam-driver string IP Address Management Driver (default "default")
--ipam-opt map Set IPAM driver specific options (default map[])
--ipv6 Enable IPv6 networking
--label list Set metadata on a network
-o, --opt map Set driver specific options (default map[])
--scope string Control the network's scope
--subnet strings Subnet in CIDR format that represents a network segment



docker network create --driver bridge --subnet 192.168.0.0/16 --gateway 192.168.0.1 mynet

不使用—link 也能连接了

我们自定义的网络docker都已经帮我们维护好了对应的关系

好处:

不同的集群使用不同的网络,保证集群是安全健康的。

网络连通

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
(base) root@linux:/home/cpss# docker network --help
connect Connect a container to a network

(base) root@linux:/home/cpss# docker network connect --help
Options:
--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



# 测试打通 tomcat01 - mynet
# 连通之后就是将tomcat01 放到了mynet网络下

结论:假设要跨网络操作别人,就需要使用docker network connect