Docker 网络基础
Docker启动时,会自动在主机上创建一个docker0虚拟网桥,实际上是Linux的一个bridge,可以理解为一个软件交换机,它会而挂载到它的网口之间进行转发 当创建一个Docker容器的时候,同理会创建一对veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包),这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头。
- Docker容器的DNS和主机名
实际上容器中/etc目录下有3个文件是容器启动后被虚拟文件覆盖掉的,分别是/etc/hostname、/etc/hosts、/etc/resolve.conf,通过在容器中运行mount命令可以查看。
- Docker容器的5种网络模式
在使用docker run创建docker容器时,可以用--net选项指定容器的网络模式,Docker有以下5种网络模式:
- bridge模式
使用docker run --net=bridge指定,bridge模式是Docker默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上。 此模式与外界通信使用NAT协议,增加了通讯的复杂性,在复杂场景下使用会有诸多限制。
route -n 查看 IP routing tables;
iptables -t nat -L -n 查看iptables rules.
- host模式
使用docker run --net=host指定,这种模式Docker Server将不为Docker容器创建网络协议栈,即不会创建独立的network namespace,Docker容器中的进程处于宿主机的网络环境中,相当于Docker容器的宿主机共用同一个network namespace,使用宿主机的网卡、IP、端口等信息。此模式没有网络隔离性,同时会引起网络资源的竞争与冲突。
- container模式
使用docker run --net=container:othercontainer_name指定,这种模式与host模式相似,指定新创建的容器和已经存在的某个容器共享同一个network namespace, 以下两种模式都共享network namespace,区别就在于host模与宿主机共享,而container模式与某个存在的容器共享。 在container模式下,两个容器的进程可以通过lo回环网络设备通讯,增加了容器间通讯的便利性和效率。container模式的应用场景就在于可以将一个应用的多个组件放在不同的容器趾,这些 容器配成container模式的网络,这样它们可以作为一个整体对外提供服务。同时,这种模式也降低了容器间的隔离性。
docker run -it --name helloworld busybox sh docker run -it --name helloword-con --net=container:helloword busybox sh
- none模式
使用docker run --net=none指定,在这种模式下,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。这种模式如果不进行特定的配置是无法正常使用的,但它也给了用户最大的自由度来自定义容器的网络环境。
- overlay模式
overlay网络特点:
- 跨主机通讯
- 无需做端口映射
- 无需担心IP冲突
服务发现与k/v存储: etcd, consul
- config1.sh
!/bin/bash
[ -d /data ] || mkdir /data
consul agent -server --bootstrap -data-dir /data/consule -bind=0.0.0. > /var/log/consul.log 2>&1 & echo 'DOCKER_OPTS="--kv-store-consul:localhost:8500 --label-com.docker.network.driver.overlay.bind_interface=eth0 --default-network=overlay:multihost"' > /etc/default/docker
restart docker
``` consule members
ifconfig eth0
- config2.sh
!/bin/bash
[ -d /data ] || mkdir /data
consul agent --data-dir /data/consul -bind 0.0.0.0 > var/log/consul.log 2>&1 &
sleep 2
consul join $IP
cat <<-EOS > /etc/default/docker
DOCKER_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
- docker network ls
- docker service ls
docker service publish test-bridge.bridge
docker serice attach test1 test-bridge.bridge