Docker Network
单机:
- Bridge Network:桥接docker(默认docker0)
- Host Network:和宿主机共享网络
- None Network:不配置网络
多机:
- Overlay Network
Linux网络命名空间
查看本机的network namespace
ip netns list
删除本机指定的network namespace
ip netns delete [要删除的namespace名字]
添加network namespace:test1
ip netns add test1
查看指定namespace下的ip相关信息
ip netns exec test1 ip a
让状态为DOWN的启动起来
ip netns exec test1 ip link set dev lo up
如何让两个network namespace连接:通过Veth pair技术来实现,将两个端口分别加入到两个Namespace中去,如图所示:
实现: 创建两个network Namespace并将两个Namespace连接起来
1.本机添加一个新的link:ip link add veth-test1 type veth peer name veth-test2
2.创建两个network namespace:ip netns add test1\ip netns add test2
3.将两个network namespace启动:ip netns exec test1 ip link set dev lo up\ip netns exec test2 ip link set dev lo up
4.将veth-test1添加到test1中:ip link set veth-test1 netns test1
5.将veth-test2添加到test2中:ip netns exec test2 ip link
6.为两个端口配ip地址:ip netns exec test1 ip addr add 192.168.1.1/24 dev veth-test1 \
ip netns exec test2 ip addr add 192.168.1.2/24 dev veth-test2
7.分别将两个evth-test1/2启动起来:ip netns exec test1 ip link set dev veth-test1 up \ ip netns exec test1 ip link set dev veth-test2 up
8.然后用查看test1和test2 network namespace ip地址(注意可能无法查看到ip地址):ip netns exec test1 ip a \ ip netns exec test2 ip a
9.最后在测试ping:ip netns exec test1 ping 192.168.1.2 \ ip netns exec test2 ping 192.168.1.1
Docker bridge0详解
**问题:**由上诉的两个network Namespace连接在一起后,可以互相ping通,那么docker是怎样来运作的呢?
实际上就是当我们每运行一个容器的时候,docker0就会分配一对veth-pair,一个端口连接到容器,一个端口连接到docker0
**问题:**容器内是如何访问外网呢?
实际上通过一个NAT技术就可以实现
容器网络
bridge:
安装brctl命令:yum install -t bridge-tools
查看本地的bridge:brctl show
问题1: 当我们编写一个微服务时,database url=ip:3306:,项目不重启,数据库ip换掉了,我们希望可以处理这个问题通过名字访问容器? 因为每当重启一个容器后,它的地址就将发生改变。这就就使得源代码中连接数据库时的ip地址也要跟着换,为了 实现高可用,可以考虑使用名字来连接数据库,即名字不变,ip地址任意变化都能连接成功
问题2: 由于默认的docker0,容器之间只能ping通ip,不能通过容器名来ping通
解决方案一: --link (不推荐使用)
#测试tomcat10 ping tomcat11
[root@localhost /]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a49e22addde5 feba8d001e3f "catalina.sh run" 3 minutes ago Up 3 minutes 0.0.0.0:49154->8080/tcp tomcat10
cd05e17744a9 tomcat "catalina.sh run" 41 minutes ago Up 41 minutes 0.0.0.0:49153->8080/tcp tomcat11
#发现无法ping通
[root@localhost /]# docker exec -it tomcat10 ping tomcat11
ping: tomcat11: Name or service not known
#如何解决?
[root@localhost /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest feba8d001e3f 13 days ago 649MB
#通过--link就可以就可以解决网络连通问题,但这里只允许单方向ping通即tomcat11可以平通tomcat10
[root@localhost /]# docker run -d -P --name tomcat11 --link tomcat10 feba8d001e3f
2b0a05aa2b987f6be0e128aa28b4d95524d5d84f3d69c874250fad146a6d10e4
[root@localhost /]# docker exec -it tomcat11 ping tomcat10
PING tomcat10 (172.17.0.3) 56(84) bytes of data.
64 bytes from tomcat10 (172.17.0.3): icmp_seq=1 ttl=64 time=0.113 ms
64 bytes from tomcat10 (172.17.0.3): icmp_seq=2 ttl=64 time=0.069 ms
64 bytes from tomcat10 (172.17.0.3): icmp_seq=3 ttl=64 time=0.081 ms
方案一原理:
其实我们在做–link tomcat10的时候相当于就是在tomcat11的host文件中添加了tomcat10的ip映射
#进入tomcat11容器查看hosts配置,在这里原理发现!
[root@localhost /]# docker exec -it 2b0a05aa2b98 /bin/bash
root@2b0a05aa2b98:/# cat /etc/hosts
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.3 tomcat10 a49e22addde5
172.17.0.4 2b0a05aa2b98
解决方案二: 创建一个网络,并将容器连接到新建的网络
创建网络:docker network create -driver(-d) bridge mynet
运行两个容器:docker run -d --name tomcat1 --network mynet tomcat \ docker -d --name tomcat2 --network mynet tomcat
测试两个容器是否可以通过容器名来ping通:docker exec -it tomcat1 ping tomcat2 \docker exec -it tomcat2 ping tomcat1
发现是可以ping通的
查看看我们自己创建的网络的元数据:docker inspect mynet
发现上面有连接到mynet上的容器
**问题3:**我们如何修改正在运行的容器的网络呢?
通过命令:docker network connect [OPTIONS] NETWORK CONTAINER
网络连通
问题:
假设要让tomcat-01 ping tomcat-net-01因为不能使两个网卡直接连通,但可以使容器拥有多个ip地址,故可以使容器和网卡相连
通过命令:docker network connect [OPTIONS] NETWORK CONTAINER
使tomcat-01连接到mynet网卡即可啦
多机器通信
Docker Overlay网络和etcd实现多容器通信