Docker学习笔记--网络

10 篇文章 0 订阅
9 篇文章 0 订阅

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实现多容器通信

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值