Docker Docker的网络
Docker的网络
我们使用Docker来部署我们的服务是为了可以进行访问,那么既然与网络的用户发生交互,就必须有网络配置才能与网络上的用户发生交互。那么Docker是怎么进行交互的,怎么配置才能让Docker的镜像按照我们预想的进行部署呢。
Docker的网络驱动
docker 的网络驱动有多种形式,每种对应着不同的应用场景,docker默认采用的是bridge形式。
驱动形式:
- bridge
- host
- overlay
- container
- 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模式的优势:
- 使用host可以很好的解决容器与外界通信的地址转换问题
- 可以直接使用宿主机的IP进行通信,不存在虚拟化网络带来的额外性能负担
host模式的劣势
- host驱动降低了容器与容器之间、容器与宿主机之间的网络隔离.
- 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的network namespace进行外部交互。
null 网络模式
使用null模式,Docker容器拥有自己的Network Namespace,但是不为Docker容器进行任何网络配置,就是容器没有网卡、IP和路由等信息,需要自行添加网卡、IP等