Network driver 六种网络
Docker网络子系统支持以下网络驱动:
- bridge:默认网络驱动,用于单宿主机的docker容器和主机通信;
- overlay:叠加网络,用于连接多个宿主机Docker进程管理的容器和swarm services;
- macvlan:将容器的虚拟网卡直接连接在主机所在的物理网络上;
- host:Docker 17.06+ 创建swarm services时支持,容器直接使用docker主机的网卡和网络;
- none:禁用容器的网络,不连接任何网络,swarm services不支持该类型;
- Network plugins:安装第三方网络插件,实现自定义的网络类型
docker network命令
docker network提供容器网络的管理命令和选项。
// 查看
docker network ls // 查看网络列表
docker network ls -f driver=bridge // 查看bridge网络列表
docker network ls -q // 仅查看网络ID列表
// 创建
docker create mynet // 创建默认的网络mynet,类型为bridge
docker create -d bridge mynet // 指定网络类型
docker create --ipv6 mynet // 开启ipv6网络
// 检查网络完整配置
docker inspect mynet // 查看mynet网络所有参数配置
// 将容器连接到网络
docker network connect mynet mycontainer // 将容器连接到mynet网络
docker network connect --ip 172.30.100.104 mynet mycontainer // 指定ipv4地址
docker network connect --ip6 2001:db8::33 mynet mycontainer // 指定ipv6地址
// 断开容器网络
docker network disconnect mynet mycontainer // 将容器的mynet网络断开
// 删除未使用网络
docker network prune
// 删除指定网络
docker network rm mynet
bridge
适用单台宿主机上的多个容器之间网络通信。
- 自定义的bridge网络和默认的bridate网络行为不一样,具体见文档。
- 建议使用自定义的bridge网络,默认的有诸多限制;
- 连接在自定义的bridge网络上的不同容器之间所有端口互相暴露,可以访问;
- 连接在自定义的bridge网络上的不同容器自动DNS解析,可以通过容器名称代替IP地址访问;
- 默认网络会自动启用ipv6无法禁止,用户自定义网络通过–ipv6启用;
// 创建,docker会在宿主机上创建一个桥接设备
# docker network create my-net
# ip a // 查看新建的设备
// 创建容器,连接到网络
# docker create --name my-nginx \
--network my-net \
--publish 8080:80 \
nginx:latest
// 启动容器
# docker start my-nginx
# docker exec -it my-nginx /bin/bash
// 断开和连接
# docker network connect my-net my-nginx
# docker network disconnect my-net my-nginx
# docker network rm my-net
Host
宿主机和容器共享网络栈(网卡和地址相同),容器直接使用宿主机的网络设备和网络,宿主机和容器网络不隔离;
// 启动容器my_nginx,连接到host网络,--rm选项表明如果已存在容器,自动删除重建
# docker run --rm -d --network host --name my_nginx nginx
# curl localhost:80 // 可以在宿主机访问nginx首页
# netstat -tulpn | grep :80 // 发现宿主机出现nginx进程在监听80端口,容器的nginx进程仿佛运行在宿主机上
// 进入容器观察网络
# docker exec -it my_ngnix /bin/bash
// 安装ifconfig命令
# apt-get update
# apt-get install net-tools
# ifconfig -a // 可以看出网卡的mac地址和IP地址完全宿主机一样
# exit
# docker container stop my_ngnix
Overlay
用于不同主机的多个容器或多个swarm services之间通信。
# docker swarm init // 初始化swarm集群,master节点
# docker swarm join-token worker // 查看worker节点的token
# docker network ls // 默认创建ingress overlay网络和docker_gwbridge网络
// 创建overlay网络
# docker network create -d overlay my-overlay
// --attachable,支持手工连接单独的容器,否则只能swarm连接使用
# docker network create -d overlay --attachable my-overlay
// 创建支持应用数据加密的网络
# docker network create --opt encrypted --driver overlay --attachable my-attachable-multi-host-network
// ingress网络在docker中同时只能有一个
# docker network rm ingress
// 创建自己的ingress网络
# docker network create \
--driver overlay \
--ingress \
--subnet=10.11.0.0/16 \
--gateway=10.11.0.2 \
--opt com.docker.network.driver.mtu=1200 \
my-ingress
// 创建桥接网络
# ip link set docker_gwbridge down
# ip link del dev docker_gwbridge
# docker network create \
--subnet 10.11.0.0/16 \
--opt com.docker.network.bridge.name=docker_gwbridge \
--opt com.docker.network.bridge.enable_icc=false \
--opt com.docker.network.bridge.enable_ip_masquerade=true \
docker_gwbridge
macvlan
分配独立的mac地址给容器内每一个虚拟网络设备,该虚拟网络类似直接接到和宿主机一样的物理网络,相当于宿主机有了多个网络设备。
要点:
- 需要指定一个宿主机的物理设备给macvlan使用;
- 容易消耗大量的物理和IP地址、造成网络广播;
- 宿主机的物理设备需要工作在混淆模式下,因为一块物理设备会被指定多个MAC地址;
- macvaln可以工作在桥接模式或者 802.1q trunk桥接模式
// 桥接模式,直接使用物理设备收发
# docker network create -d macvlan \
--subnet=172.16.86.0/24 \
--gateway=172.16.86.1 \
-o parent=eth0 pub_net
// trunk
# docker network create -d macvlan \
--subnet=192.168.50.0/24 \
--gateway=192.168.50.1 \
-o parent=eth0.50 macvlan50
none
禁用容器的网络栈,容器内仅创建loopback设备。
// 创建none网络的容器no-net-alpine
# docker run --rm -dit --network none --name no-net-alpine alpine ash
// 查看容器的网络设备,发现只有lo设备
# docker exec no-net-alpine ip link show
// 路由表为空
# docker exec no-net-alpine ip route
# docker container rm no-net-alpine
Third-party network plugins
// 安装插件
# docker plugin install ...
# docker network create --driver=....