Docker(七)之网络驱动及使用

简介

  • 在本文中,你将了解Docker的默认网络,网络驱动种类,如何创建及使用;
  • 默认情况下,存在bridgehostoverlaymacvlannone5种网络驱动程序;

默认网络

  • 在安装Docker时,它会自动创建三个网络,使用docker network ls命令查看;
1
$ docker network ls
  • Docker内置这三种网络类型,在运行容器时,可以使用--network--net参数来指定容器连接到哪个网络;

bridge

介绍

  • Docker的默认网络模式,Docker守护进程会自动创建名为docker0的网桥,一个虚拟的以太网桥,用于自动转发与之连接的任意网络接口间的数据包;
  • 桥接网络适用于在同一个Docker守护程序主机上运行的容器;
  • bridge模式下,连在同一网桥上的容器可以相互通信;
  • 使用docker network inspect NAME命令获取指定网络的信息;
  • 若无容器运行时,Containers标签中无内容;
  • 默认的docker0网桥不支持容器名解析,若希望容器能够按照容器名解析IP地址,可以选择自定义网络;
1
$ docker network inspect bridge
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
[
{
"Name": "bridge",
"Id": "6d4655b4463085d1da3f562b1dc260e998d16a874d3924ca89aec147dec9e477",
"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,
"Containers": {},
"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": {}
}
]
  • 使用bridge模式,运行一个Nginx容器
1
$ docker run -d --rm --name nginx-server-1 -p 8080:80 nginx
  • 对于在不同Docker守护进程主机上运行的容器之间的通信,您可以在操作系统级别管理路由,也可以使用覆盖(overlay)网络;

自定义网桥

与默认网桥相比

  • 用户自定义的网桥提供了更好的隔离和集装箱化应用程序之间的互操作性;
  • 用户自定义的网桥提供了容器之间的自动DNS解析,默认网桥只能通过IP地址访问彼此,除非使用--link选项(不推荐);
  • 用户自定义的网桥允许容器在运行状态下连接或分离,默认网桥则不允许这样操作;
  • 用户自定义的网络允许更加自由化的配置,满足不同的网络需求;
  • 连接在默认网桥上的容器共享环境变量,用户自定义网桥则不允许,但可以通过其他方式实现;

创建网桥

  • 创建1个名为br0的网桥:
1
2
3
4
5
6
docker network create \
--driver=bridge \
--subnet=172.18.0.0/16 \
--ip-range=172.18.5.0/24 \
--gateway=172.18.5.254 \
br0

获取网络信息

1
$ docker network inspect br0

运行容器

  • 使用自定义的br0网桥运行一个Nginx容器:
1
$ docker run -d --rm --name nginx-server-2 --network br0 -p 8081:80 nginx

host

  • 与宿主机共享网络,就网络而言,宿主机和容器之间没有隔离;

  • 使用host模式,运行一个Nginx容器(无需端口映射,占用宿主机的80端口):

1
$ docker run -d --rm --network=host --name nginx-server-3 nginx

none

  • none模式只能访问本地网络,无法访问外网;

overlay

  • Overlay网络将多个Docker守护进程连接在一起,并使集群服务之间能够彼此通信,该策略消除掉了不同主机的容器之间通信需要OS级别的路由;

前置条件

  • 一个能够访问的分布式键值存储,Engine支持Consul, EtcdZooKeeper
  • 集群中的各节点能够连接到该分布式键值存储服务;
  • 在集群中的每台主机必须正确地配置Engine daemondockerd支持overlay网络的选项有:--cluster-store--cluster-advertise--cluster-store-opt

键值存储服务

Consul

  • 下载Consul安装包:
1
2
$ CONSUL_VERSION='1.1.0'
$ wget https://releases.hashicorp.com/consul/${CONSUL_VERSION}/consul_${CONSUL_VERSION}_linux_amd64.zip
  • 解压Consul安装包:
1
$ unzip consul_${CONSUL_VERSION}_linux_amd64.zip -d /usr/local/bin/
  • 获取Consul版本:
1
$ consul --version
  • 运行首个Server服务:
1
2
3
4
5
6
7
8
9
10
$ rm -rf /opt/consul
$ nohup consul agent \
-server \
-bootstrap-expect 3 \
-node consul-1 \
-data-dir /opt/consul \
-bind 172.18.20.2 \
-client 0.0.0.0 \
-datacenter xiao \
-ui &
  • 运行第2Server服务:
1
2
3
4
5
6
7
8
9
10
$ rm -rf /opt/consul
$ nohup consul agent \
-server \
-node consul-2 \
-join 172.18.20.2 \
-data-dir /opt/consul \
-bind 172.18.20.4 \
-client 0.0.0.0 \
-datacenter xiao \
-ui &
  • 运行第3Server服务:
1
2
3
4
5
6
7
8
9
10
$ rm -rf /opt/consul
$ nohup consul agent \
-server \
-node consul-3 \
-join 172.18.20.2 \
-data-dir /opt/consul \
-bind 172.18.20.5 \
-client 0.0.0.0 \
-datacenter xiao \
-ui &
  • 一个高可用的Consul集群需要3Server服务,测试环境也可以选择1Server2Client服务:
1
2
3
4
5
6
7
8
$ nohup consul agent \
-node consul-client \
-join 172.18.20.2 \
-data-dir /opt/consul \
-bind 172.18.20.10 \
-client 0.0.0.0 \
-datacenter xiao \
-ui &
  • 手动加入到集群中(备用):
1
$ consul join 172.18.20.2
  • 获取集群中成员的信息:
1
$ consul members

Docker服务

Consul

  • 配置Engine daemon
1
$ vim /lib/systemd/system/docker.service
1
ExecStart=/usr/bin/dockerd -H tcp://0.0.0.0:2376 -H unix:///var/run/docker.sock --cluster-store=consul://localhost:8500 --cluster-advertise=eth0:2376
  • 重启Docker服务:
1
2
$ systemctl daemon-reload
$ systemctl restart docker.service

自定义覆盖网络

创建网络

  • 此时在任意一个节点创建Overlay网络都会同步到其他节点:
1
2
3
4
5
6
7
$ docker network create \
--driver overlay \
--subnet=10.10.0.0/24 \
--gateway=10.10.0.1 \
--opt com.docker.network.bridge.name=overlay0 \
--opt com.docker.network.driver.mtu=1500 \
overlay0

获取网络信息

1
$ docker network inspect overlay0

运行容器并测试

  • 在不同主机上,都指定--network overlay0,测试网络是否连通;
1
$ docker run -dit --rm --name busybox-1 --network overlay0 busybox
1
$ docker run -dit --rm --name busybox-2 --network overlay0 busybox
  • 通过docker exec进入到容器中,获取其IP地址;
1
2
$ docker exec -it busybox-1 /bin/sh
$ ip addr
  • 通过ping命令测试连通性:
1
$ ping IP
  • 由于Overlay网络为我们自定义,所以也提供了容器之间的自动DNS解析;
1
$ ping busybox-2

有你就有世界,感谢有你,昕!
0%