博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
docker网络篇
阅读量:3962 次
发布时间:2019-05-24

本文共 5374 字,大约阅读时间需要 17 分钟。

docker网络篇

docker原生网络

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

docker的镜像是令人称道的地方,但网络功能还是相对薄弱的部分。
docker安装后会自动创建3种网络:bridge、host、none.
docker network ls

bridge

安装查看网络配置的包yum install bridge-utils.x86_64 -y

docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。
默认执行
bridge模式下容器有一个公有ip,只有宿主机可以直接访问,外部主机是不可见的。
容器通过宿主机的NAT规则后可以访问外网。

host

容器不会虚拟出自己的网卡,配置自己的ip。而是使用宿主机的ip。

host网络模式需要在容器创建时指定- -network=host
host模式可以让容器共享宿主机网络栈,这样的好处是外部主机与容器直接通信,但是容器的网络缺少隔离性。
容器里面配置的nginx服务可以直接访问宿主机就可以看到。

none

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

自定义网络

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

  • bridge
  • overlay 适合it
  • macvlan 适合ct网络专家(只需搞清底层的路由交换)

bridge驱动类似默认的bridge网络模式,但增加了一些新的功能,

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

创建自定义网桥[root@server2 ~]# docker network create mynet1ip 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 demodemo[root@server2 ~]# docker stop demo2demo2[root@server2 ~]# docker start demo2demo2[root@server2 ~]# docker start demodemo[root@server2 ~]# docker inspect  demo2[root@server2 ~]# docker inspect  demo[root@server2 ~]# docker psCONTAINER ID   IMAGE       COMMAND                  CREATED          STATUS              PORTS             NAMES474967ccbcde   webserver   "nginx -g 'daemon of…"   4 minutes ago    Up About a minute   80/tcp, 443/tcp   demo28095eebc598a   busybox     "sh"                     10 minutes ago   Up 10 minutes                         pedantic_kirch94fb1a96912a   webserver   "nginx -g 'daemon of…"   11 minutes ago   Up About a minute   80/tcp, 443/tcp   demo[root@server2 ~]# docker attach 8095eebc598a   ##进入busybox查看/ # ping demo2PING demo2 (172.18.0.2):/ # ping demoPING demo (172.18.0.4):

定义自己的网段[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

使用–ip参数可以指定容器ip地址,但必须是在自定义网桥上,默认的bridge模式不支持,同一网桥上的容器是可以互通的。[root@server2 ~]# docker rm demodemo[root@server2 ~]# docker rm demo2demo2[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

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

docker容器通信

joined容器

容器之间除了使用ip通信外,还可以使用容器名称通信。

docker 1.10开始,内嵌了一个DNS server。
dns解析功能必须在自定义网络中使用。
启动容器时使用 --name 参数指定容器名称。
Joined容器一种较为特别的网络模式。
在容器创建时使用–network=container:vm1指定。(vm1指定的是运行的容器名)
处于这个模式下的 Docker 容器会共享一个网络栈,这样两个容器之间可以使用localhost高效快速通信。

- -link

–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

在这里插入图片描述

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

外网如何访问容器

容器如何访问外网是通过iptables的SNAT实现的

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

  • 外网访问容器用到了docker-proxy和iptables DNAT
  • 宿主机访问本机容器使用的是iptables DNAT
  • 外部主机访问容器或容器之间的访问是docker-proxy实现

localhost 0.0.0.0 是必须有docker-proxy 才能访问。ip仍能访问

ipv6无iptables ,所idocker-proxy很好起通信作用
即使删除了表中的规则,也可以通过docker-proxy 进行通信
同样,没有docker-proxy 会完全依赖nat也可以进行通信
localhost 0.0.0.0 是必须有docker-proxy 才能访问。ip仍能访问

[root@server1 ~]# curl localhost:8080 -Icurl: (7) Failed connect to localhost:8080; Connection refused

跨主机容器网络

跨主机网络解决方案

docker原生的overlay和macvlan
第三方的flannel、weave、calico
众多网络方案是如何与docker集成在一起的
libnetwork docker容器网络库
CNM (Container Network Model)这个模型对容器网络进行了抽象

  • CNM分三类组件
    Sandbox:容器网络栈,包含容器接口、dns、路由表。(namespace)
    Endpoint:作用是将sandbox接入network (veth pair)
    Network:包含一组endpoint,同一network的endpoint可以通信。

Linux kernel提供的一种网卡虚拟化技术。

无需Linux bridge,直接使用物理接口,性能极好。

在两台docker主机上各添加一块网卡,打开网卡混杂模式:[root@server1 harbor]# ip link set eth1 promisc on[root@server1 harbor]# ip addr show eth1[root@server2 docker]# ip link set eth1 promisc on[root@server1 harbor]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway=172.21.0.1 -o parent=eth1 mac_net1[root@server2 docker]# docker network create -d macvlan --subnet 172.21.0.0/24 --gateway=172.21.0.1 -o parent=eth1 mac_net1[root@server1 harbor]# docker run -it --rm --network mac_net1 --ip 172.21.0.11 busybox[root@server2 docker]# docker run -it --rm --network mac_net1 --ip 172.21.0.12 busybox

macvlan网络
没有新建linux bridge
容器的接口直接与主机网卡连接,无需NAT或端口映射
macvlan会独占主机网卡,但可以使用vlan子接口实现多macvlan网络
vlan可以将物理二层网络划分为4094个逻辑网络,彼此隔离,
vlan id取值为1~4094

[root@server1 docker]# 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]# 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]# docker inspect mac_net2

[root@server1 harbor]# docker run -it --rm --network mac_net2 --ip 172.22.0.21 busybox/ # ping 172.22.0.22[root@server2 docker]# docker run -it --rm --network mac_net2 --ip 172.22.0.22 busybox

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

转载地址:http://gnhzi.baihongyu.com/

你可能感兴趣的文章
队列(数据结构)
查看>>
Mule ESB-Content-Based Routing Tutorial(1)
查看>>
Mule ESB-Content-Based Routing Tutorial(2)
查看>>
Mule ESB-Content-Based Routing Tutorial(3)
查看>>
年末项目经验总结
查看>>
做事情要放下面子,拿起责任
查看>>
敏捷开发实践(1)-故事工作量估算导致的问题
查看>>
记一次解决jenkins持续构建,自动部署的问题
查看>>
敏捷开发实践(2)-要不要文档?
查看>>
《java系统性能调优》--2.缓存
查看>>
JAVA注解引发的思考
查看>>
写博意味着什么
查看>>
比较Cint() , int() , fix() ,round()的区别
查看>>
举例说明常用字符串处理函数
查看>>
软件生存期模型
查看>>
制定计划(问题的定义,可行性研究)
查看>>
需求分析
查看>>
软件设计
查看>>
程序编码
查看>>
软件测试
查看>>