bridge
docker
默认网络,每个 container
通过 docker0
进行通信,docker0(虚拟交换机)
是指装 docker
的时候默认创建的,所以默认创建的容器会绑到 docker0
。
每当开启一个容器时,会生成一个对应的
veth*
的网络接口,用来连接 container
和 docker0
。
演示:
ip addr
docker run -d <image-id>
docker container ls
ip addr
docker container kill <contanier-id>
ip addr
ip 是 linux 一个命令,显示路由,网络设备,网络接口和隧道。
ip addr 显示分配给所有网络接口的地址。
overlay
overlay network
一个分布式的网络,可以实现跨主机容器间的通信。
创建该网络有些必要条件:
- 必须集群才能创建
overlay network
- 开放需要的端口
TCP port 2377 for cluster management communications
TCP and UDP port 7946 for communication among nodes
UDP port 4789 for overlay network traffic
尽管 docker
官网首推配合 swarm
和 overlay
一起使用,swarm
又不是最 NB
的解决方案,关于 overlay
官方文档上的 demo 全是基于 swarm
的(差评),所以宁愿用借助第三方存储配合 overlay
一起使用。
docker swarm 默认 ingress。docker swarm 初始化或加入一个集群时, 创建
docker_gwbridge
, 连接不同主机间容器的桥梁。
Consul 集群搭建
资源准备
- 两台云主机
- 两个外网 IP
host1 -> 139.198.6.23
host2 -> 139.198.6.56
consul server -> host1
consul client -> host2
host1
consul agent -server \
-bootstrap-expect 1 \
-node=host1 \
-bind=0.0.0.0 \
-advertise=139.198.6.23 \
-data-dir workspace/data/consul/ \
-client=0.0.0.0 -ui
consul members wan
host2
sudo consul agent -bind=0.0.0.0 \
-advertise=139.198.6.56 \
-data-dir workspace/data/consul/ \
-node=host2 \
-client=0.0.0.0 -ui
sudo consul join 139.198.6.23
consul members wan
如果 127.0.0.1
绑定 IP 是访问不到的,需要改成 0.0.0.0
Docker 配置参数
ExecStart=/usr/bin/dockerd \
-H tcp://127.0.0.1:2375 \
-H unix:///var/run/docker.sock \
--cluster-store consul://139.198.6.23:8500 \
--cluster-advertise 139.198.6.23:2375
http://blog.51cto.com/littledevil/1922922
host
由于容器和宿主机共享同一个网络命名空间,换言之,容器的IP地址即为宿主机的IP地址。所以容器可以和宿主机一样,使用宿主机的任意网卡,实现和外界的通信。
采用host模式的容器,可以直接使用宿主机的IP地址与外界进行通信,若宿主机具有公有IP,那么容器也拥有这个公有IP。同时容器内服务的端口也可以使用宿主机的端口,无需额外进行NAT转换,而且由于容器通信时,不再需要通过linuxbridge等方式转发或者数据包的拆封,性能上有很大优势。当然,这种模式有优势,也就有劣势,主要包括以下几个方面:
最明显的就是容器不再拥有隔离、独立的网络栈。容器会与宿主机竞争网络栈的使用,并且容器的崩溃就可能导致宿主机崩溃,在生产环境中,这种问题可能是不被允许的。
容器内部将不再拥有所有的端口资源,因为一些端口已经被宿主机服务、bridge模式的容器端口绑定等其他服务占用掉了。
- 共享一个命名空间
- 直连物理网桥
- 端口
none
在这种模式下,容器有独立的网络栈,但不包含任何网络配置,只具有lo这个loopback网卡用于进程通信。也就是说,none模式为容器做了最少的网络设置,但是俗话说得好“少即是多”,在没有网络配置的情况下,通过第三方工具或者手工的方式,开发这任意定制容器的网络,提供了最高的灵活性。