基本网络配置、自定义网络、容器通信
一、Docker原生网络
- docker的镜像是令人称道的地方,但网络功能还是相对薄弱的
部分。 - docker安装后会自动创建3种网络:bridge、host、none
- 可以使用以下命令查看:
[root@server1 ~]# docker run -d --name demo nginx
420b622af5e1a25b79b7ac31acc269bb3b5bca1ce0c4e583b176de9487667138
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
420b622af5e1 nginx "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 80/tcp demo
1.bridge网络
- docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
- bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的,但容器通过宿主机的NAT规则后可以访问外网
2.host模式
- host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。host网络模式需要在容器创建时指定–network=host
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server1 ~]# docker run -d --name demo --network=host nginx
c59841230be3d8b6ba7f1c1c67b02efadab2a7ecaa2e4c869d308795579db376
[root@server1 ~]# brctl show
3.none网络
-
none模式是指禁用网络功能,只有lo接口,在容器创建时使用 --network=none指定。
-
Container 网络模式是 Docker 中一种较为特别的网络的模式。在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
-
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个
容器之间可以使用localhost高效快速通信。
[root@server1 ~]# yum install -y bridge-utils
[root@server1 ~]# brctl show
[root@server1 ~]# docker run -d --name demo nginx
[root@server1 ~]# docker rm -f demo
demo
[root@server1 ~]# brctl show
二、Docker自定义网络
1.简介
- 自定义网络模式,docker提供了三种自定义网络驱动:
- bridge
- overlay
- macvlan
- bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,overlay和macvlan是用于创建跨主机网络。
- 建议使用自定义的网络来控制哪些容器可以相互通信,还可
以自动DNS解析容器名称到IP地址。
[root@server2 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@server2 ~]# docker network create mynet1
11f2c2d1a87e36ef83728c22549c225b817564fb2537eac6d4d0170078b36779
[root@server2 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
1742bfd1d359 bridge bridge local
c5342bf3f5ed host host local
11f2c2d1a87e mynet1 bridge local
15130254f68b none null local
[root@server2 ~]# docker inspect demo
[root@server2 ~]# docker run -d --name demo1 --network=mynet1 game2048
3be27a3ab248e78a4f349452a9eab7b23bbf49856d01da656d319b96c78f71a3
2.自定义网桥
[root@server1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4aea56af23f3 nginx "/docker-entrypoint.…" 6 minutes ago Up 6 minutes demo
[root@server1 ~]# docker network create mynet1
757f35b459e6c2900caa6254f0f7245e6551157f20e2ef1be6efb40913167a63
[root@server1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
fc9a888df2b3 bridge bridge local
4c94aee4e765 harbor_harbor bridge local
af758bd837cc harbor_harbor-chartmuseum bridge local
69dc4aefc8dd harbor_harbor-clair bridge local
c6abd970defd harbor_harbor-notary bridge local
fde416c81c9f harbor_notary-sig bridge local
8f2f908b8ad4 host host local
757f35b459e6 mynet1 bridge local
88f88be8be8b none null local
[root@server1 ~]# docker inspect demo
[root@server1 ~]# docker run -it --rm --network=mynet1 nginx
[root@server1 ~]# docker run -it --rm --network=mynet1 busybox
[root@server2 ~]# docker stop demo
demo
[root@server2 ~]# docker stop demo1
demo2
[root@server2 ~]# docker start demo1
demo2
[root@server2 ~]# docker start demo
demo
3.自定义网段
[root@server2 ~]# docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 net1
[root@server2 ~]# docker network ls
6009d43a932a net1 bridge local
[root@server2 ~]# docker inspect net1
"Subnet": "172.20.0.0/24",
"Gateway": "172.20.0.1"
[root@server2 ~]# ip addr
三、Docker容器通信
- 容器之间除了使用ip通信外,还可以使用容器名称通信。
- docker 1.10开始,内嵌了一个DNS server。
- dns解析功能必须在自定义网络中使用。
- 启动容器时使用 --name 参数指定容器名称。
1.–link可以用来链接2个容器
- -link 可以用来链接2个容器。
- -link的格式:
- -link :alias
name和id是源容器的name和id,alias是源容器在link下的别名。
容器如何访问外网是通过iptables的SNAT实现的
[root@server2 ~]# docker load -i nginx.tar
d0f104dc0a1f: Loading layer 72.49MB/72.49MB
0338db614b95: Loading layer 64.31MB/64.31MB
a4d893caa5c9: Loading layer 3.072kB/3.072kB
22ea89b1a816: Loading layer 4.096kB/4.096kB
550333325e31: Loading layer 3.584kB/3.584kB
Loaded image: nginx:latest
[root@server2 ~]# docker run -d --name demo nginx
[root@server2 ~]# docker run -it --rm --link demo:nginx busybox
[root@server2 ~]# docker run -d --name demo2 nginx
[root@server2 ~]# docker stop demo
demo
[root@server2 ~]# docker inspect demo2
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.4",
[root@server2 ~]# docker start demo
demo
[root@server2 ~]# docker inspect demo
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
2.外网如何访问容器
端口映射
-p 选项指定映射端口
- 外网访问容器用到了docker-proxy和iptables DNAT
- 宿主机访问本机容器使用的是iptables DNAT
- 外部主机访问容器或容器之间的访问是docker-proxy实现
[root@server2 ~]# docker run -d --name demo1 -p 8080:8080 nginx
b8ee081228936bdc317062e225317d94d2d7d983b9fae7c14e7577f0cf3c2117
[root@server2 ~]# iptables -t nat -nL
[root@server2 ~]# cd /etc/docker/
[root@server2 docker]# ls
certs.d daemon.json key.json
[root@server2 docker]# vim daemon.json
[root@server2 docker]# systemctl reload docker
[root@server2 docker]# docker pull radial/busyboxplus
[root@server2 docker]# docker tag radial/busyboxplus:latest busyboxplus:latest
[root@server2 docker]# docker rmi radial/busyboxplus
[root@server2 docker]# docker images
[root@server2 docker]# docker run -it --rm busyboxplus
[root@server2 docker]# curl localhost:8080
curl: (7) Failed connect to localhost:8080; Connection refused
[root@server1 ~]# curl 172.17.0.2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
四、跨主机容器网络
跨主机容器网络
- 跨主机网络解决方案
- docker原生的overlay和macvlan
- 第三方的flannel、weave、calico
- 众多网络方案是如何与docker集成在一起的
- libnetwork docker容器网络库
- CNM (Container Network Model)这个模型对容器网络进行了抽象
- CNM分三类组件
- Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
- Endpoint:作用是将sandbox接入network (veth pair)
- Network:包含一组endpoint,同一network的endpoint可以通信。
- macvlan网络方案实现
- LInux kernel提供的一种网卡虚拟化技术。
- 无需Linux bridge,直接使用物理接口,性能极好。
1.在两台docker主机上各添加一块网卡,打开网卡混杂模式:
2.配置网卡
[root@server1 ~]# cd /etc/sysconfig/network-scripts/
[root@server1 network-scripts]# ls
[root@server1 network-scripts]# cp ifcfg-eth0 ifcfg-eth1
[root@server1 network-scripts]# vim ifcfg-eth1
[root@server1 network-scripts]# cat ifcfg-eth1
BOOTPROTO=none
DEVICE=eth1
ONBOOT=yes
[root@server1 ]# ip link set eth1 promisc on #打开混杂模式
[root@server1 ]# ip addr show eth1
[root@server2 ]# ip link set eth1 promisc on
3.在两台docker主机上各创建macvlan网络:
[root@server1 ]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway=172.21.0.1 -o parent=eth1 macvlan1
[root@server2 ]# docker network create -d macvlan --subnet 172.20.0.0/24 --gateway=172.21.0.1 -o parent=eth1.1 macvlan2
[root@server1 ]# docker run -it --rm --network macvlan1 --ip 172.21.0.11 busybox
[root@server2 ]# docker run -it --rm --network macvlan1 --ip 172.21.0.12 busybox
[root@server1 harbor]# docker run -it --rm --network macvlan2 --ip 172.22.0.21 busybox
/ # ping 172.22.0.22
[root@server2 docker]# docker run -it --rm --network macvlan2 --ip 172.22.0.22 busybox
- macvlan网络间的隔离和连通
- macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
- 可以在三层上通过网关将macvlan网络连通起来。
- docker本身不做任何限制,像传统vlan网络那样管理即可。
五、总结
- 主要讲解了docker各种网络模型的配置与实现,并从ip管理、隔离、性能等方面做了对比。
docker network子命令
connect 连接容器到指定网络
create 创建网络
disconnect 断开容器与指定网络的连接
inspect 显示指定网络的详细信息
ls 显示所有网络
rm 删除网络