docker网络

文章目录

一、Docker原生网络

docker安装后会自动创建3种网络:bridge、host、none
docker网络
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
docker网络
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后可以访问外网。
docker网络
host网络模式需要在容器创建时指定 --network=host

docker run -d --name demo --network host nginx

docker网络
docker网络
docker网络
docker网络
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
docker网络
none模式是指禁用网络功能,只有lo接口,在容器创建时使用
–network=none指定。

docker run -d --network none nginx

docker网络
访问本机被拒绝
docker网络

二、Docker自定义网络

自定义网络模式,docker提供了三种自定义网络驱动:
bridge
overlay
macvlan
bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
overlay和macvlan是用于创建跨主机网络。
docker网络

docker网络
docker网络

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。
创建自定义网桥:

docker network create -d bridge mynet1

docker网络

docker network inspect mynet1

docker网络
docker网络
也可以自定义网段

docker network create -d bridge --subnet 10.0.0.1/24 --gateway 10.0.0.1 mynet1

docker网络
docker网络
docker网络
清空docker ps
docker网络
docker网络
docker网络
docker网络
使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的。
docker网络

ip a

docker网络
那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为vm1添加一块my_net2 的网卡。
docker网络
docker网络
docker网络
docker网络

三、Docker容器通信

容器之间除了使用ip通信外,还可以使用容器名称通信。

  • docker 1.10开始,内嵌了一个DNS server。
  • dns解析功能必须在自定义网络中使用。
  • 启动容器时使用 --name 参数指定容器名称。
    docker网络
    docker网络
    Joined容器一种较为特别的网络模式。
    在容器创建时使用–network=container:web1指定。(web1指定的是运行的容器名)
    docker网络
    –link 可以用来链接2个容器。
--link的格式:
--link <name or id>:alias

name和id是源容器的name和id,alias是源容器在link下的别名。
docker网络
docker网络
docker网络
docker网络
外网如何访问容器:
通过端口映射外网可以访问到容器

-p 选项指定映射端口

docker网络

iptables -t nat -nL

docker网络
外网访问server11主机,访问成功。
docker网络
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
docker网络
docker网络
docker网络
docker网络
docker网络
docker网络
docker网络
docker网络
docker网络
此时POSTROUTING中还有172.17.0.0/16的路由docker网络
真机联网,进入任一容器ping外网,发现可以通信
docker网络
删除172.17.0.0/16的路由

iptables -t nat -D POSTROUTING 1	#删除路由POSTROUTING的第一条
iptables -t nat -I POSTROUTING -s 172.17.0.0/16 -j MASQUERADE	#添加路由到POSTROUTING中
iptables -t nat -nL	#查看

docker网络
再次再容器中ping外网,发现网络不通
docker网络
将删除的路由添加回来并检查
docker网络
再次进入容器ping外网,发现可以通信
docker网络

四、跨主机容器网络

跨主机网络解决方案
docker原生的overlay和macvlan
第三方的flannel、weave、calico
众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象
准备第二台主机,安装docker-ce并配置好docker专属的软件仓库

实验准备:

server101:
cd /etc/yum.repos.d
scp docker.repo server102:/etc/yum.repos.d
cd /etc/sysctl.d
scp docker.conf server102:/etc/sysctl.d
server102:
yum install -y docker-ce等众多软件\
systemctl start docker 
docker info
sysctl --systemd
systemctl enable --now docker 

为server101和server102添加一块网卡,同时需要修改网卡配置文件,之后检查

virt-manager
关闭server101,添加网卡后重启
cd /etc/sysconfig/network-scripts
cp ifcfg-eth0 icfg-eth1
ip addr show eth1

macvlan网络方案实现

  • Linux kernel提供的一种网卡虚拟化技术。
  • 无需Linux bridge,直接使用物理接口,性能极好。

在两台docker主机上各添加一块网卡,打开网卡混杂模式:
docker网络
docker网络
docker网络
在两台docker主机上各创建macvlan网络:
docker网络
docker网络

macvlan网络结构分析
没有新建linux bridge
容器的接口直接与主机网卡连接,无需NAT或端口映射。
docker网络
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4096个逻辑网络,彼此隔离.
docker网络
docker网络
实验:
docker网络
docker网络
docker网络

docker网络
docker网络

上一篇:Java设计模式——桥接模式【Bridge Pattern】


下一篇:php 通过 java-bridge 调用 java 程序 错误处理(1)