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网络驱动:
- bridge
- overlay 跨主机
- 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通信
- 容器处于同一网络 –network
- 加入到指定网络 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
使用场景:
- 通过loopback高效通信
- 希望监控其他容器的网络监控程序
容器和外部连接
容器访问外部网络
- 容器发送请求
- 网桥收到数据包后,发现是发送到外网的,交给NAT处理
- NAT 将源地址换成默认网关的IP
- 数据包网关从发送出去,到达外网。
外部网络访问容器
端口映射。xxxx:yyyy
- docker-proxy 监听 host 的xxxx端口。
- 当数据到达xxxx端口是时,docker-proxy转发给容器:yyyy
- 容器响应请求并返回结果。