Docker(四)

Posted by Run-dream Blog on November 26, 2018

none 网络

除了lo(127.0.0.1)以外没有任何网卡,通过 –network=none来指定。 适用于安全性要求很高并且不需要联网的应用

host网络

网络配置和docker host的完全相同,通过 –network=host来指定。 优点在于性能,但需要考虑端口冲突问题。

bridge网络

Docker安装时会创建一个命名为docker0的linux bridge。如果不指定–network,容器默认都会挂到docker0上。 容器和网桥bridge之间通过虚拟网络设备veth来连接. 容器创建时,docker会从docker0生成的子网中分配一个IP,16位的子网掩码保证有足够多的IP可用。

user-defined网络

docker提供了三种user-defined网络驱动:

  1. bridge
  2. overlay 跨主机
  3. macvlan 跨主机 通过 –network= 指定

    bridge

# 创建
docker network create --driver bridge --subnet xx.xx.xx.0/24 --gateway xx。xx.xx.1 my_net 
# 查看详细信息
docket network inspect my_net
# 容器启动时指定network,ip由docker自动分配
docker run -it --network=my_net busybox
# 指定静态IP,要求network使用--subnet
docker run -it --network=my_net --ip xx.xx.xx.x busybox

同一网络中的容器,网关之间都是可以通信的。 不同网桥之间的网络不可通信。

# 为容器添加网卡实现跨网络通信
docker network connect my_net docker_id

容器间通信

IP通信

  1. 容器处于同一网络 –network
  2. 加入到指定网络 docker network connect

Docker DNS Server

只能在user-defined网络中使用,为每个容器指定名字即可。

docker run -it --network=my_net --name=bbox1 busybox
docker run -it --network=my_net --name=bbox2 busybox

joined 容器

joined 容器可以使多个容器共享一个网络栈,共享网卡和配置信息。 joined 容器之间可以通过127.0.0.1直接通信。

docker run -d -it --name=web1 httpd
docket run -it --network=container:web1 busybox

使用场景:

  1. 通过loopback高效通信
  2. 希望监控其他容器的网络监控程序

容器和外部连接

容器访问外部网络

  1. 容器发送请求
  2. 网桥收到数据包后,发现是发送到外网的,交给NAT处理
  3. NAT 将源地址换成默认网关的IP
  4. 数据包网关从发送出去,到达外网。

外部网络访问容器

端口映射。xxxx:yyyy

  1. docker-proxy 监听 host 的xxxx端口。
  2. 当数据到达xxxx端口是时,docker-proxy转发给容器:yyyy
  3. 容器响应请求并返回结果。