一、Docker网络基本命令
docker network ls
查看网络
docker network inspect 网络
查看网络内部信息
docker network create 网络
新建网络
docker network connect 网络 容器````将容器加入到该网络中 docker network disconnect 网络 容器
断开网络
docker network rm 网络
移除网络(需要断开连接到该网络的所有容器)
docker network prune 网络
移除未使用的网络
二、原生网络
docker安装后会自动创建3种网络:bridge、host、none
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
01_bridge模式(默认)
- bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。 容器通过宿主机的NAT规则后可以访问外网。
docker run -d --name nginx 172.25.2.1:5000/webserver
宿主机可以直接访问
外部主机不可访问
容器IP地址会变化 但是容器之间不能通过域名解析- IP递增且自动替补
02_host模式
- host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
–network=host
-
docker run -d --name nginx --network=host webserver
宿主机可以访问
外部主机可以访问
03_ none模式
–network=none
- none模式是指禁用网络功能,只有lo接口,在容器创建时使用
三、自定义网络
- 自定义网络模式,docker提供了三种自定义网络驱动:
bridge
overlay
macvlan - bridge驱动类似默认的bridge网络模式,但增加了一些新的功能, overlay和macvlan是用于创建跨主机网络
01_自定义网桥
- 创建网络
docker network create mynet1
- 创建容器并指定网络类型为自定义mynet1:同一网络中直接ping容器名称即可
ip addr
其容器的网关172.18.0.1
- IP递增且自动替补
02_自定义网段、网关
- 创建网络:指定网段、网关
docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 net1
–subnet:网段
–gateway:网关 - 创建容器:指定IP、网络类型
docker run -it --name demo1 --ip 172.20.0.10 --network net1 busybox
docker run -it --name demo2 --ip 172.20.0.20 --network net1 busybox
–ip:指定容器ip
–network:指定网络
03_不同网桥之间通信
docker network connect 网络 容器
- 创建容器
docker run -it --name demo3 busybox
- 连接网络
docker network connect net1 demo3
四、容器通信
01_Joined容器与link 链接
Joined容器
- 容器创建时使用
--network=container:容器名
指定 - 共一个享网络栈,可以高效快速通信
- 创建容器web_demo(webserver包含nginx服务)
docker run -d --name web_demo webserver
- joined容器到busybox上(busybox包含shell及基本命令的小版本环境)
docker run -it --network container:web_demo busybox
link 链接容器
--link name:alias
name:可以是源容器的名称或id
alias:源容器在link下的别名
-
创建容器
docker run -d --name demo nginx
-
link容器
docker run -it --link demo:nginx busybox
当释放掉demo,开启一个demo1占用172.17.0.2后
再开demo(IP为172.17.0.4),发现解析随之变化
02_容器访问外网
SNAT(地址转发:MASQUERADE)
03_外网访问容器
- 使用docker-proxy进程通信
- DNAT地址转发
- 存在其中一个就可访问,双冗余机制
docker run -d --name demo1 -p 80:80 nginx
内部访问:
外部访问
测试
iptables -t nat -D DOCKER 3
删除后发现依然可以访问(docker-proxy进程存在的前提下)
内部访问正常
- kill掉docker-proxy进程
kill 进程id,发现依然可以访问 (在地址转发正常的前提下)
kill 17040
内部访问正常
外部访问正常
- 关闭地址转发和docker-proxy
iptables -t nat -D DOCKER 3
内部访问拒绝
外部访问拒绝
04_跨主机通信
添加物理网卡
两台主机:server1,server2
- 两台主机各添加一块网卡
- 开启新添加的网卡(所有主机)
ip link set up eth1
- 开启混杂模式(所有主机)
ip link set eth1 promisc on
- 创建 macvlan 类型网络(所有主机)
docker network create -d macvlan --subnet 172.21.0.0/24 --gateway 172.21.0.1 -o parent=eth1 mac_net1
- server1:创建容器
docker run -it --rm --network mac_net1 --ip 172.21.0.11 busybox
- server2:创建容器
上述操作的缺点是容器会独占网卡
添加子接口 - 创建子接口:
父接口.1
,父接口.2
等等(所有主机)
docker network create -d macvlan --subnet 172.22.0.0/24 --gateway 172.22.0.1 -o parent=eth1.1 mac_net2
- server1:创建容器
docker run -it --rm --network mac_net2 --ip 172.22.0.21 busybox
- server2:创建容器
docker run -it --rm --network mac_net2 --ip 172.22.0.22 busybox
实现跨主机通信