美文网首页
Docker笔记3-网络入门-桥接网络

Docker笔记3-网络入门-桥接网络

作者: 8813d76fee36 | 来源:发表于2018-02-26 09:07 被阅读111次

概述

  • birdge(桥接网络)
    默认网络驱动。如果你不具体指定一个网络驱动,当前创建的网络就是桥接网络。
    当应用程序运行在需要通信的独立容器中时,通常会使用桥接网络。

使用桥接网络

在网络方面,桥接网络是一种链路层设备,它将网络段之间的流量转发。桥接网络可以是硬件设备也可以是运行在宿主机内核中的软件。

在Docker方面,桥接网络使用软件桥接,它允许处在同一个桥接网络中的container通讯,以此与没有连接到该桥接网络的其他container隔离。Docker桥接驱动自动在宿主机上安装规则,所以在不同桥接网络中的container不能直接互通。

桥接网络适用于运行在同一个Docker daemon主机的container。如果想要实现运行在不同Docker daemon上的container通信,需要维护系统级别的路由,或者可以使用覆盖网络(Overlay Network)。

当Docker启动时,一个默认的桥接网络(名称为bridge)被自动创建,并且新建的container会连接到该网络上,直到明确指定其他网络。


默认的桥接网络

你可以自定义桥接网络。桥接网络优于默认的桥接网络

若使用桥接网络,推荐使用自定义桥接网络

自定义桥接网络与默认桥接网络的区别

自定义桥接网络在容器化应用之间提供更好的隔离性和交互性。

连接到同一个自定义桥接网络的container会互相暴露所有的接口,但不会向外界暴露任何接口。这就使容器化的应用通讯起来更加方便,同时也不必担心不小心向外界暴露了端口。

设想一个应用包含前端web程序和后端数据库程序。外界需要访问前端系统(可能通过80端口访问),前端系统再根据IP和端口访问数据库,而数据的IP和端口不需要对外界公开,只需要暴露给前端系统即可。

使用自定义桥接网络,只需要前端系统开放端口,而数据库系统不需要开放任何端口,因为前端系统可以通过桥接网络访问到数据库。

如果同样的一套系统使用默认桥接网络,则需要使用-p--publish标签来开放前端系统和数据库系统的端口。这意味着Docker主机需要通过其他方式来锁定外界对数据库系统端口的访问。

自定义桥接网络在container之间提供DNS自动解析

使用默认桥接网络的容器只能通过IP地址来互相访问,除非使用--link,但它已经过时了。
在自定义桥接网络中,容器可以通过名称或别名互通。

容器可以即时地从自定义桥接网络连接或断开

在容器的生命周期中,你可以即时地连接或断开自定义桥接网络。如果要断开默认的桥接网络,你需要停止容器,然后指定一个网络重新创建它。

每个自定义桥接网络都是可配置的

如果使用默认桥接网络,虽然它是可以更改配置的,但所有容器都使用相同一份配置,类似于MTU和iptables规则。除此之外,配置默认桥接网络是在Docker外完成的,配置后需要重启Docker。

自定义桥接网络使用docker network create完成创建和配置。

连接在默认桥接网络的容器共享环境变量

原始情况下,两个容器之间共享环境变量的唯一方式是使用--link标签。
在自定义桥接网络下,这种变量共享的方式不可用。然而我们可以使用一些更好的方式:

  • 多个容器可以使用Docker volume挂载一个承载共享变量的文件或目录。
  • 多个容器可以使用docker-compose启动,该文件可以定义需要共享的变量。
  • 可以使用swarm service来代替单独的容器,并且这在共享secrets和configs也有优势。

总结

连接到同一个自定义网络下的容器互相暴露所有端口。如果某个端口需要被其他网络上的容器或非Docker主机访问,那该端口必须使用-p-publish发布。

管理用户自定义桥接网络

创建自定义桥接网络

使用docker network create -d bridge my-net创建一个自定义桥接网络。
可以指定子网、IP地址范围、网关等其他选项。

$ docker network -d "bridge" my-net

  • docker network create说明
docker network create

移除自定义桥接网络

使用docker network rm my-net移除自定义网络。在删除之前,需要断开与其相连的容器。

$ docker network rm my-net

创建一个容器,使其连接到自定义桥接网络

  • 创建新容器时连接到自定义网络
    当创建一个容器时,可以使用一个或多个--netwrok标签指定该容器使用的网络。
    下面的例子创建了一个Nginx容器,让它连接到刚才自定义的桥接网络my-net。同时,该容器还将80端口映射到了Docker主机的8080端口,这样其他客户端可以用过该端口访问它。其他连接到my-net的容器可以访问该Nginx容器的所有端口。

docker container create --name my-nginx \
--network my-net \
--publish(-p) 8080:80 \
nginx:latest

  • 已有容器连接到自定义网络
    对于正在运行的容器连接到自定义网络来说,使用docker network connect命令。
    下面的命令使一个正在运行的my-nginx容器连接到自定义的my-net网络。

$ docker network connect my-net my-nginx

使容器断开自定义网络

使一个正在运行的容器断开自定义桥接网络,使用docker network disconnect命令。
下面的命令使my-nginx容器从my-net网络断开。

$ docker network disconnect my-net my-nginx

使用IPv6

在容器或swarm服务内使用IPv6之前,需要开启Docker daemon的IPv6支持选项。

注意:IPv6网络仅能够在运行在Linux主机上的Docker daemon开启。
1、 编辑/etc/docker/daemon.json,将键为ipv6的值设置为true

{
  "ipv6": true
}

2、重新加载Docker配置文件

$ systemctl reload docker
3、创建网络时使用--ipv6标签,并使用--ip6标签为容器分配IP6地址。

Demo见文档Networking with standalone containers

参考文档
Use bridge networks
Enable IPv6 support
Networking with standalone containers

相关文章

网友评论

      本文标题:Docker笔记3-网络入门-桥接网络

      本文链接:https://www.haomeiwen.com/subject/eboqxftx.html