• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
导航菜单
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx
您的位置:首页 > 服务器 >虚拟化 > 详解Docker使用Linux iptables 和 Interfaces管理容器网络

详解Docker使用Linux iptables 和 Interfaces管理容器网络

作者:好雨科技 字体:[增加 减小] 来源:互联网

本文主要包含docker,容器,iptables,Interfaces,iptables,使用,iptables,详解等服务器相关知识,好雨科技 希望可以进行参考

我使用docker至今已有一段时间了,与绝大部分的人一样,我被docker强大的功能和易用性深深的折服。简单方便是docker的核心之一,它强大的功能被抽象成了非常简单的命令。当我在使用和学习docker的时候,我很想知道docker在后台都做了一些什么事情,特别是在网络这一块(我最感兴趣的一块)

我找到了很多关于创建和操作容器网络的文档,但是关于docker如何使网络工作的却没有那么多。 Docker广泛使用linux iptables和网桥接口,这篇文章是我如何用于创建容器网络的总结,大部分信息来自github上的讨论,演示文稿,以及我自己的测试。文章结尾我会给出我认为非常有用的资料链接。

我写这篇文章使用的是docker 1.12.3,但这不是作为对docker网络的全面描述,也不作为docker网络的介绍。我只希望这篇文章能给大家开拓视野,也非常感谢所有对文章错误,缺失的反馈和批评。

Docker网络概览

Docker的网络建立在允许任何一方编写自己的网络驱动程序的容器网络模型(CNM)之上。这允许不同的网络类型可用于在docker引擎上运行的容器,并且容器可以同时连接到多个网络。除了各种第三方网络驱动程序可用,docker自带四个内置网络

驱动程序:

Bridge: 这是启动容器的默认网络。通过docker主机上的网桥接口实现连接。 使用相同网桥的容器有自己的子网,并且可以相互通信(默认情况下)。

Host:这个驱动程序允许容器访问docker主机自己的网络空间(容器将看到和使用与docker主机相同的接口)。

Macvlan:此驱动程序允许容器直接访问主机的接口或子接口(vlan)。 它还允许中继链接。

Overlay:此驱动程序允许在运行docker的多个主机(通常是docker群集群)上构建网络。 容器还具有自己的子网和网络地址,并且可以直接相互通信,即使它们在不同的物理主机上运行。

Bridge和Overlay可能是最常用的网络驱动程序,在本文和下一篇文章中我将主要关注这两个驱动程序。

Docker Bridge 网络

在docker主机上运行的容器的默认网络是。 Docker在首次安装时创建一个名为“bridge”的默认网络。 我们可以列出所有docker网络来查看此网络 docker network ls:

$ docker network ls
NETWORK ID     NAME        DRIVER       SCOPE
3e8110efa04a    bridge       bridge       local
bb3cd79b9236    docker_gwbridge   bridge       local
22849c4d1c3a    host        host        local
3kuba8yq3c27    ingress       overlay       swarm
ecbd1c6c193a    none        null        local

要检查其属性,运行docker network inspect bridge 

$ docker network inspect bridge
[
  {
    "Name": "bridge",
    "Id": "3e8110efa04a1eb0923d863af719abf5eac871dbac4ae74f133894b8df4b9f5f",
    "Scope": "local",
    "Driver": "bridge",
    "EnableIPv6": false,
    "IPAM": {
      "Driver": "default",
      "Options": null,
      "Config": [
        {
          "Subnet": "172.18.0.0/16",
          "Gateway": "172.18.0.1"
        }
      ]
    },
    "Internal": false,
    "Containers": {},
    "Options": {
      "com.docker.network.bridge.default_bridge": "true",
      "com.docker.network.bridge.enable_icc": "true",
      "com.docker.network.bridge.enable_ip_masquerade": "true",
      "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
      "com.docker.network.bridge.name": "docker0",
      "com.docker.network.driver.mtu": "1500"
    },
    "Labels": {}
  }
]

你还可以使用docker network create命令并指定选项--driver bridge创建自己的网络,例如

docker network create --driver bridge --subnet 192.168.100.0/24 --ip-range 192.168.100.0/ 24 my-bridge-network创建另一个网桥网络,名称为“my-bridge-network”,子网为192.168.100.0/24。

Linux 网桥接口

docker创建的每个网桥网络由docker主机上的网桥接口呈现。、 默认桥网络“bridge”通常具有与其相关联的接口docker0,并且使用docker network create命令创建的每个后续网桥网络将具有与其相关联的新接口。

$ ifconfig docker0
docker0  Link encap:Ethernet HWaddr 02:42:44:88:bd:75
     inet addr:172.18.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
     UP BROADCAST MULTICAST MTU:1500 Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

要找到与你创建的docker网络关联的linux接口,可以使用ifconfig列出所有接口,然后找到你指定了子网的接口,例如,我们想查看我们之前创建的网桥接口my-bridge-network 我们可以这样:

$ ifconfig | grep 192.168.100. -B 1
br-e6bc7d6b75f3 Link encap:Ethernet HWaddr 02:42:bc:f1:91:09
     inet addr:192.168.100.1 Bcast:0.0.0.0 Mask:255.255.255.0

linux桥接接口与交换机的功能类似,因为它们将不同的接口连接到同一子网,并根据MAC地址转发流量。 我们将在下面看到,连接到网桥网络的每个容器将在docker主机上创建自己的虚拟接口,并且docker引擎将同一网络中的所有容器连接到同一个网桥接口,这将允许它们与彼此进行通信。 您可以使用brctl获取有关网桥状态的更多详细信息。

$ brctl show docker0
bridge name   bridge id        STP enabled   interfaces
docker0     8000.02424488bd75    no

一旦我们有容器运行并连接到这个网络,我们将看到interfaces列下面列出的每个容器的接口。 并且在桥接器接口上运行流量捕获将允许我们看到同一子网上的容器之间的相互通信。

Linux 虚拟网络接口(veth)

容器网络模型(CNM)允许每个容器具有其自己的网络空间。 从容器内部运行ifconfig将显示容器内部的网络接口:

$ docker run -ti ubuntu:14.04 /bin/bash
root@6622112b507c:/#
root@6622112b507c:/# ifconfig
eth0   Link encap:Ethernet HWaddr 02:42:ac:12:00:02
     inet addr:172.18.0.2 Bcast:0.0.0.0 Mask:255.255.0.0
     inet6 addr: fe80::42:acff:fe12:2/64 Scope:Link
     UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
     RX packets:9 errors:0 dropped:0 overruns:0 frame:0
     TX packets:6 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:766 (766.0 B) TX bytes:508 (508.0 B)
lo    Link encap:Local Loopback
     inet addr:127.0.0.1 Mask:255.0.0.0
     inet6 addr: ::1/128 Scope:Host
     UP LOOPBACK RUNNING MTU:65536 Metric:1
     RX packets:0 errors:0 dropped:0 overruns:0 frame:0
     TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
     collisions:0 txqueuelen:0
     RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

然而,上面看到的eth0只能从那个容器中可用,而在Docker主机的外部,docker会创建一个与其对应的双虚拟接口,并作为到容器外的链接。 这些虚拟接口连接到上面讨论的桥接器接口,以便于在同一子网上的不同容器之间的连接。

我们可以通过启动连接到默认网桥的两个容器来查看此过程,然后查看docker主机上的接口配置。

在运行启动任何容器之前,docker0 桥接接口没有连接的接口:

然后我从ubuntu:14.04 镜像启动2个容器




 
分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • Docker实践8:Compose,docker实践compose
  • Docker buildx构建多平台镜像并推送到私有仓库的方法
  • Docker三个基本概念镜像(Image)容器(Container)仓库(Repository)
  • 什么是Docker?为什么要使用Docker
  • docker 开源的应用容器引擎
  • 如何给docker设置http代理
  • docker官方mysql镜像自定义配置详解
  • 详解Docker数据管理(数据卷&数据卷容器)
  • 如何利用Docker容器实现代理转发与数据备份详解
  • 详解Docker Swarm 在持续集成测试中的应用

相关文章

  • 详解ASP.NET Core 网站在Docker中运行
  • 详解Docker私有仓库最简便的搭建方法
  • vmware克隆Centos6.4虚拟机网卡无法启动问题的解决方法
  • 详解OpenStack之服务端口号
  • openstack pike单机一键安装shell的方法
  • VMWare Workation双网卡配置IP地址的图文教程
  • vmware 实现linux目录映射window本地目录图文详解
  • docker run起来之后执行多条命令
  • VMWare中的Host-only、NAT、Bridge的比较,vmwarehost-only
  • 将博客迁移至docker纪实

文章分类

  • windows
  • 服务器硬件
  • 服务器运维
  • 云计算
  • 虚拟化
  • IIS教程
  • Linux
  • Apache
  • Ftp
  • DNS
  • Nginx

最近更新的内容

    • 基于Docker安装与部署Zabbix
    • Windows使用docker打开新窗口error解决办法
    • centos7搭建docker私人仓库的方法(kubernetes)
    • docker images,info,-d等命令报错的解决方法
    • Docker如何多步构建生成dubbo-admin镜像详解
    • docker image删不掉的解决办法
    • 详解Docker挂载本地目录及实现文件共享的方法
    • Docker Machine远程部署Docker的方法
    • 详解Docker目录挂载的方法总结
    • 详解consul的安装和配置

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有