1、Docker网络模式简介
查看网络模式:
docker network ls
默认的三种网络模式:
- bridge:桥接模式
- host:主机模式
- none:无网络模式
2、bridge模式
桥接模式是Docker的默认网络设置,Docker安装时会在主机上创建一个名为docker0的虚拟网桥,并选择一个和宿主机不同的IP地址和子网分配给docker0网桥。如果不指定--network
,创建的容器默认都会挂到docker0上
桥接拓扑图:
1)、容器网卡与docker0网卡
docker0网卡:
启动容器后容器网卡桥接在docker0上
查看桥接情况
yum install -y bridge-utils
brctl show
docker network inspect bridge
bridge网络配置的subnet是172.17.0.0/16,网关是172.17.0.1(docker0)
容器创建时,docker会自动从172.17.0.0/16中分配一个IP,这里16位的掩码保证有足够多的IP可以供容器使用
2)、docker0网卡与宿主机网卡
查看宿主机上的iptables规则
iptables -t nat -S
在NAT表中,有这么一条规则:
-A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE
其含义是:如果网桥docker0收到来自172.17.0.0/16网段的外出包,把它交给MASQUERADE处理。而MASQUERADE的处理方式是将包的源地址替换成host的地址发送出去,即做了一次网络地址转换(NAT)
3、host模式
host模式下容器是不会拥有自己的ip地址,而是使用宿主机的ip地址和端口,此时容器的网络配置与host完全一样
使用host模式最大的好处就是性能,如果容器对网络传输有较高要求,则可以选择host网络
4、none模式
none模式:关闭模式,无法连外网
5、基于link实现单向通信
启动mysql数据库容器
docker run --name mydb -e MYSQL_ROOT_PASSWORD=123456 -d registry.cn-hangzhou.aliyuncs.com/hhzz/mysql
启动tomcat容器
docker run --name tomcat -p 8080:8080 -d tomcat
查看容器网络信息
docker inspect 容器名
mysql容器IP地址为172.17.0.2
tomcat容器IP地址为172.17.0.3
如果在tomcat应用中配置mysql的ip地址为172.17.0.2,是可以访问数据库的,但是如果mysql容器重新启动,容器的IP地址会更换
启动tomcat容器并link到mysql数据库(mydb这个容器一定要存在)
docker run -itd --name tomcat --link mydb tomcat
进入tomcat容器ping mydb
[root@aliyun ~]# docker exec -it tomcat /bin/bash
root@04c27369381c:/usr/local/tomcat# ping mydb
PING mydb (172.17.0.2) 56(84) bytes of data.
64 bytes from mydb (172.17.0.2): icmp_seq=1 ttl=64 time=0.059 ms
64 bytes from mydb (172.17.0.2): icmp_seq=2 ttl=64 time=0.094 ms
64 bytes from mydb (172.17.0.2): icmp_seq=3 ttl=64 time=0.072 ms
此时tomcat应用中配置mysql的地址为mydb即可
6、利用bridge网桥实现双向通信
创建一个新的网桥:
docker network create -d bridge my_bridge
启动两个容器:
把第一个容器加入网桥:
docker network connect my_bridge tomcat
把第二个容器加入网桥:
docker network connect my_bridge mydb
查看桥接情况:
进入tomcat容器中ping mydb
[root@aliyun ~]# docker exec -it tomcat /bin/bash
root@d5038429dd8f:/usr/local/tomcat# ping mydb
PING mydb (172.18.0.3) 56(84) bytes of data.
64 bytes from mydb.my_bridge (172.18.0.3): icmp_seq=1 ttl=64 time=0.074 ms
64 bytes from mydb.my_bridge (172.18.0.3): icmp_seq=2 ttl=64 time=0.071 ms
64 bytes from mydb.my_bridge (172.18.0.3): icmp_seq=3 ttl=64 time=0.079 ms
进入mydb容器ping tomcat
[root@aliyun ~]# docker exec -it mydb /bin/bash
root@89ff0d2403c3:/# ping tomcat
PING tomcat (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: icmp_seq=0 ttl=64 time=0.080 ms
64 bytes from 172.18.0.2: icmp_seq=1 ttl=64 time=0.110 ms
64 bytes from 172.18.0.2: icmp_seq=2 ttl=64 time=0.096 ms