Docker网络

I. Docer的通信方式

默认情况下,Docker使用网桥(brige)+ NAT的通信模型.

Docker启动时会自动创建网桥Docker0,并配置ip 172.17.0.1/16

ifconfig docker0
docker0 Link encap:Ethernet HWaddr 02:42:e0:31:ac:10
inet addr:172.17.0.1 Bcast:0.0.0.0 Mask:255.255.0.0
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:1846 errors:0 dropped:0 overruns:0 frame:0
TX packets:5562 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:168242 (168.2 KB) TX bytes:23550976 (23.5 MB)

Docker容器内容及容器与宿主机通信方式(Brige方式)

当Docker启动容器时,会创建一对veth虚拟网络设备:

  • 一个附加到网桥上;
  • 一个加入容器的网张命名空间并被改名为eth0

Docker容器与外部网张通信(NAT方式)

1)容器访问外网

Docker通过创建如下MASQUERADE规则进行外部网络访问:

iptables -t nat -A POSTROUTING -s 172.17.0.0/16 !-o docker0 -j MASQUERADE

规则说明:奖所有从容器(172.17.0.0/16)发往外网的包的源地址都改为Host(宿主机)的IP。

2)外网访问容器

当容器提供的服务需要暴露给外部网络里,Docker启动容器里,会创建SNAT规则。eg,启动一个apache容器:

docker run -d -p 80:80 apache

在上述命令背后其实会创建如下SNAT规则:

iptables -t nat -A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
iptables -t nat -A DOCKER !-i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80

II. Docker的网络配置

Docker中很多网络相关的参数主是有:

  • Docker进程本身的,影响所有docker容器;
  • Docker容器相关的,只影响当前容器;

1. 网络配置参数

1)Docker进程的网络配置

相关参数如下:

-b, --bridge="" ;//指定Docker使用的网络设备。默认下,Docker会创建docker0网桥设备,通过该参数可以指定Docker使用已存在的网桥设备
--bip="" ;//指定网桥设备的docker0的IP和掩码,使用标准的CIDR形式,如192.168.1.5/24
--dns=[] ;//强制docker使用指定的DNS servers
--dns-search=[] ;//强制docker使用指定的DNS search domains
--icc=true ;//打开inter-container沟通
--ip="0.0.0.0" ;//绑定容器端口时的默认IP
--ip-forward=true ;//打开 net.ipv4.ip_forward
--iptables=true; //打开docker的iptables rules增加
--mtu=0; //设置容器的网络MTU,如果没有设置任何值则默认route MTU ,当默认路由不存在时,使用1500

Note:

--dns/--dns-search: 配置容器的DNS,改参数可以在启动Docker进程时指定(成为所有容器的默认值),也可以在启动容器(docker run)时指定(覆盖默认值)。
2)容器的网络配置

下面是docker run时的一些网络配置参数:

--net="bridge" //用于指定容器使用的网络通信方式;

它有如下四个值:

  • bridge : Docker容器的默认通信方式;
  • none : 容器没有网络栈,此时容器无法与外界通信;
  • container:<name|id> : 使用其他容器(name或id)的网络栈。实际上,Docker会将该容器加到指定的容器network namespace, 这是一种非常有用的方式。
  • host : 表示容器使用Host的网络,没有自己独立的网络栈。实际上,在这种情况下,Docker不会给容器创建单独的网络名字空间(newwork namespace).由于容器可以完全访问Host的网络,所以此方式也是不安全的。

2. 配置DNS

一般来说每个容器的hostname和DNS配置信息是不同的,我们不可能为每个容器都构建一个镜像,并在镜像中指定这些信息。实际上,Docker在启动容器时,会使用bind mount动态挂载/etc/hostname,/etc/hosts,/etc/resolv.conf几个文件,覆盖镜像中原来的文件。通过如下命令我们可以在容器内看到这个信息:

docker exec -it {容器} /bin/bash
mount /dev/vda1 on /etc/resolv.conf type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/vda1 on /etc/hostname type ext4 (rw,relatime,errors=remount-ro,data=ordered)
/dev/vda1 on /etc/hosts type ext4 (rw,relatime,errors=remount-ro,data=ordered)

所以,我们可以通过命令行参数在启动Doker时指定DNS

3. Docker网络相关的一些参考

Docker系统六:Docker网络管理的更多相关文章

  1. Docker(十六)-Docker的daemon.json的作用

    docker安装后默认没有daemon.json这个配置文件,需要进行手动创建.配置文件的默认路径:/etc/docker/daemon.json 一般情况,配置文件 daemon.json中配置的项 ...

  2. BI系统打包Docker镜像及容器化部署的具体实现

    在过去的几年中,"云"作为明星热词站在了各种新潮技术之中,你可能使用过,但说不清它的原理:或者是没用过,但听过它的大名:也可能连它的名字都没听过,但你对这只蓝色鲸鱼一定十分眼熟.作 ...

  3. 【新技术】CentOS系统下docker的安装配置及使用详解

    1 docker简介    Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器.它原本是dotCloud 启动的一个业余项目,并在前些时候开源了.它吸引了大量的关注和讨 ...

  4. Docker(六):Docker 三剑客之 Docker Swarm

    实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...

  5. centos7系统下 docker 环境搭建

    运行环境: VMware Workstation Pro 在虚拟机中安装centos7系统, 选择最小安装, 网络连接方式选择的桥接(与宿主机在同一IP段)centos7一定要安装64位, docke ...

  6. Centos系统下Docker的安装

    一.检查内核版本 安装Docker,需要linux内核大于3.10 使用uname -r 来检查 二. Centos系统下Docker的安装 1. 安装需要的软件包 yum install -y yu ...

  7. CentOS系统下docker的安装与卸载

    Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...

  8. docker容器管理及网络管理

    防火墙规则—— INPUT 主要用于主机防火墙,设置规则屏蔽处理进入本机的数据包示例:禁止10.180.100.141这个机器访问我本机的web服务iptables -t filter -A INPU ...

  9. 系统学习Docker 践行DevOps理念

    Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...

随机推荐

  1. php与HTML交互问题

    1.将表单中的action属性值设为PHP路径,则网页会跳转到这个网址 <html> <body> <form action="welcome.php" ...

  2. .NET框架(转)

    三年前写的<.NET之美>的第六章,现在书名改为了<.NET专题解析>. 本书是一本讲解.NET技术的书籍,目标读者群也是在.NET框架(.NET Framework)下进行开 ...

  3. records.config文件参数解释

    # Process Records Config File # # <RECORD-TYPE> <NAME> <TYPE> <VALUE (till end ...

  4. Java中的最值

    Double.MAX_VALUE     等于 (2-2^(-52)) * 2^1023 约等于2^1024Double.MIN_VALUE      最小正非零值 2^(-1074)Long.MAX ...

  5. display:inline-block下,元素不能在同一水平线及元素间无margin间距的问题解决方法

    在前端页面编辑中,常常用于块元素横排列时,我们会用到浮动或者dispaly:inline-block: 浮动虽然好用,效果明显,但是会存在潜在BUG,(暂且不论):那么display:inline-b ...

  6. Spring学习之二

    1.初始化和销毁Bean 当实例化一个Bean时,可能需要执行一些初始化操作来确保该Bean处于可用状态.同样地,当不需要Bean时,将其从容器中移除时,我们可能还需要按顺序的执行一些清除工作. 为定 ...

  7. wpf datagrid row height 行高自动计算使每行行高自适应文本

    wpf 的datagrid的行高 要么是Auto,要么是定值:但会带来麻烦就是每行行高都一样. 当需要按内容(主要是wrap 换行的textbox或textblock)来动态调整行高的时候,需要用到d ...

  8. Go笔记-变量

    声明变量的一般形式:     var indentifier type 实例:     var a int     var b bool     var str string     var (    ...

  9. Android Studio 3.1 Beta 1发布,如何及时下载更新

    每次收到Android Studio更新提示,总是延迟一段时间才能下载的到或者更新成功.架梯子也不行.而且更新检测也是时断时续.Android Studio 3.0.1使用一段时间,多开几个工程.经常 ...

  10. zalenium 应用

    zalenium是一个Selenium Grid扩展,用Docker容器动态扩展你的本地网格.它使用docker-selenium在本地运行Firefox和Chrome中的测试,如果需要不同的浏览器, ...