Docker网络

实验环境:

[root@server1 harbor]# docker-compose stop                     ## 把仓库停掉

一、Docker原生网络

docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。
docker安装后会自动创建3种网络:bridge、host、none
这里我们使用server2做实验。
可以使用以下命令查看:

[root@server2 ~]# docker network ls

在这里插入图片描述

1.桥接网络

[root@server2 ~]# yum install bridge-utils.x86_64 -y
[root@server2 ~]# brctl show
bridge name	bridge id		STP enabled	interfaces
docker0		8000.024231a9857f	no		

当我们启用一个镜像再次查看桥接口

[root@server2 ~]# docker run -d --name demo webserver
[root@server2 ~]# brctl show

在这里插入图片描述
docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。

[root@server2 ~]# ip addr

在这里插入图片描述
bridge模式下容器没有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后可以访问外网。
在这里插入图片描述
在这里插入图片描述

2.host网络模式

host网络模式需要在容器创建时指定 --network=host

[root@server2 ~]# docker ps  
[root@server2 ~]# docker rm -f                把刚才实验的回收掉
[root@server2 ~]# docker run -d --name demo --network=host webserver
[root@server2 ~]# ip addr

我们可以看到我们的桥接口上没有出现新的桥接口
在这里插入图片描述
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
在这里插入图片描述
我们直接访问宿主机ip,就可以直接到达nginx的默认页面
在这里插入图片描述

3.none模式

none模式是指禁用网络功能,只有lo接口,在容器创建时使用
–network=none指定。

[root@server2 ~]# docker rm -f demo              
[root@server2 ~]# docker run -it --rm --network=none busybox
/ # ip addr

没有网络功能
在这里插入图片描述

二、Docker自定义网络

自定义网络模式,docker提供了三种自定义网络驱动:

  • bridge
  • overlay
  • macvlan
    bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,
    overlay和macvlan是用于创建跨主机网络。

建议使用自定义的网络来控制哪些容器可以相互通信,还可以自动DNS解析容器名称到IP地址。

1.创建自定义网桥

[root@server2 ~]# docker network create mynet1

在这里插入图片描述
ip addr 查看,自动给我们创建了一个桥接口,且ip是从172.18.0.1开始的
在这里插入图片描述
测试:

[root@server2 ~]# docker run -d --name demo --network=mynet1 webserver
[root@server2 ~]# docker run -it --rm --network=mynet1 busybox
/ # ip addr
/ # ping demo

这时我们发现我们是可以ping 通demo,这说明这中模式是可以给我们提供解析的
在这里插入图片描述
实验方法是我们再开一个webserver,停掉所有的webserver,再次开启时,顺序反一下,查看ip变化

[root@server2 ~]# docker run -d --name demo2 --network=mynet1 webserver
[root@server2 ~]# docker stop demo
demo
[root@server2 ~]# docker stop demo2
demo2
[root@server2 ~]# docker start demo2
demo2
[root@server2 ~]# docker start demo
demo
[root@server2 ~]# docker inspect  demo2
[root@server2 ~]# docker inspect  demo
[root@server2 ~]# docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS              PORTS             NAMES
474967ccbcde   webserver   "nginx -g 'daemon of…"   4 minutes ago    Up About a minute   80/tcp, 443/tcp   demo2
8095eebc598a   busybox     "sh"                     10 minutes ago   Up 10 minutes                         pedantic_kirch
94fb1a96912a   webserver   "nginx -g 'daemon of…"   11 minutes ago   Up About a minute   80/tcp, 443/tcp   demo
[root@server2 ~]# docker attach 8095eebc598a            ##进入busybox查看
/ # ping demo2
PING demo2 (172.18.0.2):
/ # ping demo
PING demo (172.18.0.4): 

总结:系统会自动分配ip,按照启动顺序ip单调递增,但是ping名称的时候会自动解析地址

2.自己定义网段

在创建时指定参数:–subnet 、–gateway

[root@server2 ~]# docker network rm mynet1             ##将原来定义的网络删掉
docker network create --subnet 172.20.0.0/24 --gateway 172.20.0.1 mynet1

在这里插入图片描述

[root@server2 ~]# docker inspect mynet1 

在这里插入图片描述

3.手动指定ip

使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的。

[root@server2 ~]# docker rm demo
demo
[root@server2 ~]# docker rm demo2
demo2
[root@server2 ~]# docker run -it --rm --ip 172.20.0.10 --network mynet1 busybox
/ # ip addr

在这里插入图片描述

[root@server2 ~]# docker run -d --name demo webserver
[root@server2 ~]# docker run -d --name demo2 --network mynet1 webserver

在这里插入图片描述
在这里插入图片描述

4.构建双网卡机来实现不同网段间通信

桥接到不同网桥上的容器,彼此是不通信的。
docker在设计上就是要隔离不同network的。
那么如何使两个不同网桥的容器通信呢:
使用 docker network connect命令为demo添加一块mynet1 的网卡。

[root@server2 ~]# docker network connect mynet1 demo
[root@server2 ~]# docker inspect  demo

在这里插入图片描述

三、Docker容器通信

容器之间除了使用ip通信外,还可以使用容器名称通信。
docker 1.10开始,内嵌了一个DNS server。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
Joined容器一种较为特别的网络模式。
在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)

[root@server2 ~]# docker run  -it --rm --network container:demo busybox
/ # ip addr

和刚才的ip一样
在这里插入图片描述
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

–link 可以用来链接2个容器。
–link的格式:
–link :alias
name和id是源容器的name和id,alias是源容器在link下的别名。

[root@server2 ~]# docker pull nginx:latest
[root@server2 ~]# docker run -d --name demo nginx
[root@server2 ~]# docker run -it --rm --link demo:nginx busybox
/ # env

在这里插入图片描述

/ # ping demo
/ # ping nginx

在这里插入图片描述
在这里插入图片描述

这里需要重新连接一个server2进行测试

[root@server2 ~]# docker stop demo 
[root@server2 ~]# docker run -d --name demo2 nginx
[root@server2 ~]# docker start demo

我们再一次ping,发现ip变了,但是仍然可以ping名字,
在这里插入图片描述
这时我们查看/etc/hosts,发现他已经给我们自动修改了解析

在这里插入图片描述
容器如何访问外网是通过iptables的SNAT实现的

外网如何访问容器:
端口映射
-p 选项指定映射端口

[root@server2 ~]# docker rm -f demo
demo
[root@server2 ~]# docker rm -f demo2
demo2
[root@server2 ~]# docker run -d --name demo -p 80:80 nginx
[root@server2 ~]# docker run -d --name demo2 -p 8080:80 nginx
[root@server2 ~]# iptables -t nat -nL

在这里插入图片描述
在这里插入图片描述
外网访问容器用到了docker-proxy和iptables DNAT
宿主机访问本机容器使用的是iptables DNAT
外部主机访问容器或容器之间的访问是docker-proxy实现
在这里插入图片描述
测试:

[root@server1 ~]# curl 172.25.1.2 -I
[root@server2 ~]# curl localhost

正常情况下。
在这里插入图片描述
在这里插入图片描述
现在尝试将iptables里面的策略时删除,再次测试
将docker-proxy进程杀掉,再次访问查看效果,我们发现只要其中一项存在,即可访问。
在这里插入图片描述
在这里插入图片描述
在两台docker主机上各创建macvlan网络

[root@server1 ~]# ip link set up eth1
[root@server1 ~]#ip link set eth1 promisc on
[root@server1 ~]#docker network  create -d macvlan --subnet 172.21.0.0/24 --gateway=172.21.0.1 -o parent=eth1 mac_net1
[root@server1 ~]# ocker run -it --rm --network mac_net1 --ip 172.21.0.11 busybox
[root@server1 ~]# ip link set up eth1
[root@server1 ~]#ip link set eth1 promisc on
[root@server2 ~]# docker network  create -d macvlan --subnet 172.21.0.0/24 --gateway=172.21.0.1 -o parent=eth1 mac_net1
[root@server2 ~]# docker run -it --rm --network mac_net1 --ip 172.21.0.12 busybox 
/ # ping 172.21.0.11

在这里插入图片描述

[root@server1 ~]#  docker network  create -d macvlan --subnet 172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1.1 mac_net2
[root@server1 ~]# docker run -it --rm --network mac_net2 --ip 172.22.0.21 busybox 
/ # ip addr
[root@server2 ~]# docker network  create -d macvlan --subnet 172.22.0.0/24 --gateway=172.22.0.1 -o parent=eth1.1 mac_net2
[root@server2 ~]# docker run -it --rm --network mac_net2 --ip 172.22.0.22 busybox 
/ # ip addr
/ # ping 172.22.0.21

在这里插入图片描述
macvlan网络间的隔离和连通
macvlan网络在二层上是隔离的,所以不同macvlan网络的容器是不能通信的。
可以在三层上通过网关将macvlan网络连通起来。
docker本身不做任何限制,像传统vlan网络那样管理即可。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值