使用桥接网络

在网络方面,桥接网络是链路层设备,它在网络段之间转发流量。

网桥可以是硬件设备或在主机内核中运行的软件设备。

Docker而言,桥接网络使用软件桥接器,该软件桥接器允许连接到同一桥接网络的容器进行通信,同时提供与未连接到该桥接网络的容器的隔离。

Docker桥驱动程序会自动在主机中安装规则,以便不同网桥上的容器无法直接相互通信。

桥接网络适用于在同一个 Docker守护程序主机上运行的容器。

启动Docker时,会自动创建默认桥接网络(也称为bridge),并且除非另行指定,否则新启动的容器将连接到该网络。

还可以创建用户定义的自定义网桥。用户定义的网桥优于默认bridge 网络。

用户定义的网桥与默认网桥之间的差异

  • 用户定义的桥接器可在容器化应用程序之间提供更好的隔离和互操作性。

    连接到同一个用户定义的网桥的容器会自动将所有端口相互暴露,而不会向外界显示任何端口。这使得容器化应用程序可以轻松地相互通信,而不会意外地打开对外界的访问。

    想象一下具有Web前端和数据库后端的应用程序。外部世界需要访问Web前端(可能在端口80上),但只有前端本身需要访问数据库主机和端口。使用用户定义的网桥,只需要打开Web端口,并且数据库应用程序不需要打开任何端口,因为Web前端可以通过用户定义的网桥访问它。

    如果在默认桥接网络上运行相同的应用程序堆栈,则需要打开Web端口和数据库端口,并使用 每个的标记-p--publish标记。这意味着Docker主机需要通过其他方式阻止对数据库端口的访问。

  • 用户定义的桥接器在容器之间提供自动DNS解析。

    默认网桥上的容器只能通过IP地址相互访问,除非您使用被认为是遗留的--link选项。在用户定义的桥接网络上,容器可以通过名称或别名相互解析。

    想象一下与前一点相同的应用程序,具有Web前端和数据库后端。如果你打电话给你的容器webdb,Web容器可以在连接到数据库容器db,无论应用程序堆栈运行在哪个Docker主机上.

    如果在默认桥接网络上运行相同的应用程序堆栈,则需要在容器之间手动创建链接(使用旧--link 标志)。这些链接需要在两个方向上创建,因此可以看到这对于需要通信的两个以上容器而言变得复杂。或者,可以操作/etc/hosts容器中的文件,但这会产生难以调试的问题。

  • 容器可以在运行中与用户定义的网络连接和分离。

    在容器的生命周期中,可以动态地将其与用户定义的网络连接或断开连接。要从默认桥接网络中删除容器,需要停止容器并使用不同的网络选项重新创建容器。

  • 每个用户定义的网络都会创建一个可配置的网桥。

    如果容器使用默认桥接网络,则可以对其进行配置,但所有容器都使用相同的设置,例如MTU和iptables规则。此外,配置默认桥接网络发生在Docker本身之外,并且需要重新启动Docker。

    使用创建和配置用户定义的网桥 docker network create。如果不同的应用程序组具有不同的网络要求,则可以在创建时单独配置每个用户定义的网桥。

  • 默认桥接网络上的链接容器共享环境变量。

    最初,在两个容器之间共享环境变量的唯一方法是使用--link标志链接它们。用户定义的网络无法实现这种类型的变量共享。但是,有更好的方法来共享环境变量。一些想法:

    • 多个容器可以使用Docker卷装入包含共享信息的文件或目录。

    • 可以一起启动多个容器docker-compose,并且compose文件可以定义共享变量。

    • 可以使用swarm服务而不是独立容器,并利用共享机密和 配置

连接到同一用户定义的网桥的容器有效地将所有端口相互暴露。对于可以访问不同网络上的容器或非Docker主机的端口,必须使用or 标志发布该端口。-p--publish

创建一个网络

用法

docker network create [OPTIONS] NETWORK

选项

名字,速记 默认 描述
--attachable   启用手动容器附件
--aux-address   网络驱动程序使用的辅助IPv4或IPv6地址
--config-from   复制配置的网络
--config-only   创建仅配置网络
--driver , -d bridge 用于管理网络的驱动程序
--gateway   主子网的IPv4或IPv6网关
--ingress   创建swarm路由网状网络
--internal   限制对网络的外部访问
--ip-range   从子范围分配容器ip
--ipam-driver   IP地址管理驱动程序
--ipam-opt   设置IPAM驱动程序特定选项
--ipv6   启用IPv6网络
--label   在网络上设置元数据
--opt , -o   设置驱动程序特定选项
--scope   控制网络的范围
--subnet   表示网络段的CIDR格式子网
命令 描述
docker network connect 将容器连接到网络
docker network create 创建一个网络
docker network disconnect 断开容器与网络的连接
docker network inspect 显示一个或多个网络的详细信息
docker network ls 列出网络
vdocker network prune 删除所有未使用的网络
docker network rm 删除一个或多个网络

相关命令

指定高级选项

创建网络时,默认情况下,Engine会为网络创建不重叠的子网。

此子网不是现有网络的细分。它纯粹用于ip寻址目的。

可以覆盖此默认值并使用该--subnet选项直接指定子网值。

在 bridge网络上,只能创建一个子网:

$ docker network create --driver=bridge --subnet=192.168.0.0/16 br0

此外,还可以指定--gateway --ip-range--aux-address 选项。

$ docker network create \
--driver=bridge \
--subnet=172.28.0.0/16 \
--ip-range=172.28.5.0/24 \
--gateway=172.28.5.254 \
br0

如果省略该--gateway标志,则引擎会从首选池中为您选择一个标记。对于overlay网络和支持它的网络驱动程序插件,可以创建多个子网。此示例使用两个/25 子网掩码来遵守单个覆盖网络中不超过256个IP的当前指导。每个子网有126个可用地址。

$ docker network create -d overlay \
--subnet=192.168.1.0/25 \
--subnet=192.170.2.0/25 \
--gateway=192.168.1.100 \
--gateway=192.170.2.100 \
--aux-address="my-router=192.168.1.5" --aux-address="my-switch=192.168.1.6" \
--aux-address="my-printer=192.170.1.5" --aux-address="my-nas=192.170.1.6" \
my-multihost-network

确保子网不重叠。如果他们这样做,网络创建失败,引擎返回错误。

桥驱动器选项

创建自定义网络时,默认网络驱动程序(即bridge)具有可以传递的其他选项。以下是用于docker0网桥的那些选项和等效的docker守护程序标志:

选项 当量 描述
com.docker.network.bridge.name - 创建Linux网桥时要使用的网桥名称
com.docker.network.bridge.enable_ip_masquerade --ip-masq 启用IP伪装
com.docker.network.bridge.enable_icc --icc 启用或禁用Inter Container连接
com.docker.network.bridge.host_binding_ipv4 --ip 绑定容器端口时的默认IP
com.docker.network.driver.mtu --mtu 设置容器网络MTU

以下参数可以传递给docker network create任何网络驱动程序,再次使用它们的近似等价物docker daemon

选项
当量 描述
--gateway - 主子网的IPv4或IPv6网关
--ip-range --fixed-cidr 分配范围内的IP
--internal - 限制对网络的外部访问
--ipv6 --ipv6 启用IPv6网络
--subnet --bip 网络子网

例如,让我们使用-o--opt选项在发布端口时指定IP地址绑定:

$ docker network create \
-o "com.docker.network.bridge.host_binding_ipv4"="172.19.0.1" \
simple-network

默认情况下,来自连接到默认网桥的容器的流量 不会转发到外部世界。要启用转发。

  1. 配置Linux内核以允许IP转发。

    $ sysctl net.ipv4.conf.all.forwarding=1
  2. 将策略的iptables FORWARD策略更改DROP为 ACCEPT

    $ sudo iptables -P FORWARD ACCEPT
    
    

将容器连接到用户定义的桥

创建新容器时,可以指定一个或多个--network标志。此示例将Nginx容器连接到my-net网络。它还将容器中的端口80发布到Docker主机上的端口8080,因此外部客户端可以访问该端口。连接到my-net 网络的任何其他容器都可以访问my-nginx容器上的所有端口,反之亦然。

$ docker create --name my-nginx \
--network my-net \
--publish 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

将容器连接到默认桥接网络

如果未使用该--network标志指定网络,并且指定了网络驱动程序,则默认情况下容器将连接到默认bridge网络。连接到默认bridge网络的容器只能通过IP地址进行通信,除非它们使用--link标志进行链接 。

配置默认网桥

要配置默认bridge网络,请在中指定选项daemon.json。这是一个daemon.json指定了几个选项。仅指定需要自定义的设置。

{
"bip": "192.168.1.5/24",
"fixed-cidr": "192.168.1.5/25",
"fixed-cidr-v6": "2001:db8::/64",
"mtu": 1500,
"default-gateway": "10.20.1.1",
"default-gateway-v6": "2001:db8:abcd::89",
"dns": ["10.20.1.2","10.20.1.3"]
}
 

docker-网桥的更多相关文章

  1. [svc]linux下网桥-docker网桥

    网桥和交换机 2口交换机=网桥 交换机: 工作在数据链路层,根据源mac学习(控制层),目的mac转发(数据层). linux的网卡 vmware workstation中的桥接 参考: http:/ ...

  2. Docker技术入门与实战 第二版-学习笔记-8-网络功能network-3-容器访问控制和自定义网桥

    1)容器访问控制 容器的访问控制,主要通过 Linux 上的 iptables防火墙来进行管理和实现. iptables是 Linux 上默认的防火墙软件,在大部分发行版中都自带. 容器访问外部网络 ...

  3. [Linux网络、命名空间、veth设备对、docker的host模式、container模式、none模式、brideg模式、网桥的增删查,容器与网桥的连接断开]

    [Linux网络.命名空间.veth设备对.docker的host模式.container模式.none模式.brideg模式.网桥的增删查,容器与网桥的连接断开] 网络名称空间 为了支持网络协议栈的 ...

  4. 使用Docker搭建Java Web运行环境

    这周末体验了一下挺火的Docker技术,记录学习笔记. >Docker是干什么的 Docker 是一个基于Linux容器(LXC-linux container)的高级容器引擎,基于go语言开发 ...

  5. Docker 学习笔记(CentOS 7.1)

    基本概念 Docker 包括三个基本概念 镜像(Image) 容器(Container) 仓库(Repository)理解了这三个概念,就理解了 Docker 的整个生命周期. Docker 镜像 D ...

  6. Docker搭建Java Web运行环境

    1. 前提条件 安装了Docker的64位Linux 操作系统 Linux操作系统镜像 Linux版本的JDK压缩包 Linux版本的Tomcat压缩包 2. 启动容器 容器是在镜像的基础上来运行的, ...

  7. Docker网络详解

         当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机.它会在挂载到它的网口之间进行转发.      ...

  8. 构建Docker+Jenkins持续集成环境

    docker和Jenkins不是什么新东西了,两者结合也不是什么稀奇的事情,也已经有很多Jenkins和docker相结合的文章,此文仅为自己的一点心得实践,如有不对的地方,欢迎大家纠正. 先贴上大致 ...

  9. Docker Architecture、Docker Usage

    目录 . 引言 - 为什么要有Docker技术 . Docker简介 . Docker安装.部署.使用 . Docker安全 . Docker底层实现 . Docker网络配置 . Dockerfil ...

  10. Docker 底层实现

    基本架构 Docker 采用了 C/S架构,包括客户端和服务端. Docker daemon 作为服务端接受来自客户的请求,并处理这些请求(创建.运行.分发容器). 客户端和服务端既可以运行在一个机器 ...

随机推荐

  1. 20190528-JavaScriptの打怪升级旅行 { 语句 [ 赋值 ,数据 ] }

    写在前面的乱七八糟:今天考了试,emmm很基础的题,还是Mrs房的面试题让人绝望啊┓( ´∀` )┏,补了很多知识,很综合的题,坑也很多,总的来说,查漏补缺,其实是啥都缺~ 今天打的小BOSS主要是数 ...

  2. 洛谷P2590 [ZJOI2008]树的统计 题解 树链剖分+线段树

    题目链接:https://www.luogu.org/problem/P2590 树链剖分模板题. 剖分过程要用到如下7个值: fa[u]:u的父节点编号: dep[u]:u的深度: size[u]: ...

  3. 【t093】外星密码

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 有了防护伞,并不能完全避免2012的灾难.地球防卫小队决定去求助外星种族的帮助.经过很长时间的努力,小 ...

  4. visualStudio 无法登陆

    如果遇到 visualStudio 无法登陆,可以看下我的方法,可能有用 尝试关闭代理 打开设置.网络.代理,关了它,试试 如果遇到下面的问题: 我们无法刷新此账户的凭据 No home tenant ...

  5. linux scull 代码read 方法

    read 的返回值由调用的应用程序解释: 如果这个值等于传递给 read 系统调用的 count 参数, 请求的字节数已经被传送. 这是最好的情况. 如果是正数, 但是小于 count, 只有部分数据 ...

  6. Character.digit()的意义

    最近在阅读Integet.parseInt()源码时,遇到了Character.digit()这个方法,以前没有遇到过,更没使用过,这里查了资料就记录一下. 官方说法是: java.lang.Char ...

  7. CCPC 2018 吉林 C "JUSTICE" (数学)

    传送门 参考资料: [1]:https://blog.csdn.net/mmk27_word/article/details/89789770 题目描述 Put simply, the Justice ...

  8. ioctl 命令的实现

    ioctl 的 scull 实现只传递设备的配置参数, 并且象下面这样容易: switch(cmd) { case SCULL_IOCRESET: scull_quantum = SCULL_QUAN ...

  9. linux 禁止单个中断

    有时(但是很少!)一个驱动需要禁止一个特定中断线的中断递交. 内核提供了 3 个函数为 此目的, 所有都声明在 <asm/irq.h>. 这些函数是内核 API 的一部分, 因此我们描述它 ...

  10. html2canvas生成图片报错处理办法

    详见大佬博客链接: link.(https://www.jianshu.com/p/22bd5b98e38a) 需要注意的是要生成的网页中带的网络图片地址(如放在阿里云服务器图库的图片)经常有跨域报错 ...