Docker 的网络

Docker的网络

我们使用Docker来部署我们的服务是为了可以进行访问,那么既然与网络的用户发生交互,就必须有网络配置才能与网络上的用户发生交互。那么Docker是怎么进行交互的,怎么配置才能让Docker的镜像按照我们预想的进行部署呢。

Docker的网络驱动

docker 的网络驱动有多种形式,每种对应着不同的应用场景,docker默认采用的是bridge形式。
驱动形式:

  1. bridge
  2. host
  3. overlay
  4. container
  5. null

那么下面开始来看看这些网络驱动的形式都可以干些什么,都在什么情境下使用这些网络模式,又该怎么使用这些网络形式。

bridge网络模式

Docker进程启动的时候会自动在主机上创建一个docker0的虚拟网桥,默认分配网段172.17.0.0/16。
bridge模式是docker的默认网络模式,不写-net 参数,就是bridge模式。
当使用 docker run -p 的时候,docker是在iptables 做了端口转发,使用 iptables -t nat -vnl 可以进行查看。

host 网络模式

如果启动容器的时候使用 host模式,容器将不再获得一个独立的Network Namespace,而是与宿主机共用一个Network Namespace。容器不会虚拟自己的网卡,配置自己的IP,而是使用宿主机的IP和端口。
当我们在容器中执行ifconfig命令查看网络环境的时候,看到的都是宿主机上的信息,而外界访问容器中的应用,直接使用宿主机的IP加上端口就可以访问,不需要任何NAT转换,就像直接跑在宿主机一样。

使用host的方式启动容器

使用host的方式启动一个nginx的容器,使用80端口

docker run --name=ngin_host --net=host -p 80:80 -d nginx
host网络模式的优劣性

host模式的优势:

  1. 使用host可以很好的解决容器与外界通信的地址转换问题
  2. 可以直接使用宿主机的IP进行通信,不存在虚拟化网络带来的额外性能负担

host模式的劣势

  1. host驱动降低了容器与容器之间、容器与宿主机之间的网络隔离.
  2. host模式 由于网络隔离性低会引发网络资源竞争与冲突

所以host适用于容器集群规模不大的场景。

overlay网络驱动

采用IETF标准的VXLAN方式,是VXLAN中最适合大规模云计算虚拟化环境的SDN controller模式。
在使用过程功,需要一个额外的配置存储服务(如:Consul,etcd或者ZooKeeper),还需要在启动Docker daemon的时候额外添加参数来指定所使用的配置存储服务地址。
overlay网络驱动方式的特点:
可以跨主机通信
无需做端口管理
无需担心IP冲突
实际使用的需求:
看下图的内容
在这里插入图片描述
需求HostA上的ContainerA需要与HostB上的ContainerB进行通信。
我们使用overlay的网络驱动进行配置

overlay的使用

我们先查看一下docker的启动方式

ps -aux | grep docker

我们需要编写一下两个配置的文件
config1.sh

#!/bin/bash
[ -d /data] || mkdir /data
consul agent -server -bootstrp -data-dir /data-consul -bind=0.0.0.0 >/var/log/consul.log 2>&1 & #consul启动到后台
echo 'DOCKCER_OPTS="--kv-store=consul:localhost:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0 --default-network=overlay:multihost"' >/etc/default/docker

restart docker

config2.sh

#!/bin/bash
[ -d /data] || mkdir /data
consul agent -data-dir /data/consul -bin 0.0.0.0 >/var/log/consul.log 2>&1 &

sleep 2
consul join $IP

cat <<-EOS >/etc/default/docckerDOCKER_OPTS="--kv-store=consul:localhost:8500 --label=com.docker.network.driver.overlay.bind_interface=eth0 --label=com.docker.network.driver.overlay.neighbor_ip=$IP --default-network=overlay:multihost"
EOS


restart docker

HOSTA运行config1.sh文件启动consul,并且作为根节点,HOSTB运行config2.sh启动consul,并且作为子节点。
运行的命令格式

#根节点运行config1
IP=192.168.1.2 ./config1.sh
#子节点运行config2
IP=192.168.2.2 ./config2.sh
#发布一个新的网络空间
docker service publish test-bridge.bridge
#加入到这个网络空间
docker service attach test1 test-bridge.bridge

container网络驱动

多个容器使用同一个network namespace,当容器与容器的访问非常频繁的时候使用。other container网络模式的特点是:与主机网络空间隔离,容器间共享网络空间,适合容器间通信频繁。

docker run -it --name csp --net=container:容器A的名字

这样运行的两个容器的mac 和IP 完全相同。

请求发送
请求转发
容器B
容器A
veth
docker0
eth1

容器B会通过容器A的network namespace进行外部交互。

null 网络模式

使用null模式,Docker容器拥有自己的Network Namespace,但是不为Docker容器进行任何网络配置,就是容器没有网卡、IP和路由等信息,需要自行添加网卡、IP等

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值