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:10inet addr:172.17.0.1  Bcast:0.0.0.0  Mask:255.255.0.0UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1RX packets:1846 errors:0 dropped:0 overruns:0 frame:0TX packets:5562 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:0RX 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容器网络之Linux Network Namespace

  • 关于源地址和目地地址的转换关系:iptables中DNAT、SNAT和MASQUERADE的理解

  • Docker相关的网络详解:Docker网络详解

  • iptables命令详解:iptables命令详解

转载于:https://www.cnblogs.com/Terry-Wu/p/7461453.html

Docker系统六:Docker网络管理相关推荐

  1. Docker系列(二十四)——Docker实例六Docker安装Redis实例

    < Docker实例三Docker安装Redis实例 > 前言 在前面一篇文章种,完成了 < Docker安装MongoDB实例 >,本篇将继续镜像安装教程,并完成Docker ...

  2. Docker专题(六)-Docker镜像详解

    1.Docker镜像(images)概念 镜像是一种轻量级.可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码.运行时.库.环境变量和配置文件 ...

  3. Docker学习(六)-----Docker数据卷

    十.Docker数据卷 问题:通过镜像创建一个容器,容器一旦被销毁,则容器内的数据将一并被删除,但有些情况下,通过服务器上传的图片出会丢失.容器中的数据不是持久化状态的. 那有没有一种独立于容器,提供 ...

  4. Docker系列 六. Docker 安装 Redis

    Docker 安装 Redis Redis 是一个开源的使用 ANSI C 语言编写.支持网络.可基于内存亦可持久化的日志型.Key-Value 的 NoSQL 数据库,并提供多种语言的 API . ...

  5. 如何进入docker系统

    如何进入docker系统: docker exec -it {docker镜像id} bash 进入之后就是一个操作系统:

  6. Docker学习六:综合实践

    前言 本次学习来自于datawhale组队学习: 教程地址为: https://github.com/datawhalechina/team-learning-program/tree/master/ ...

  7. 腾讯云轻量应用服务器CentOS系统使用docker安装tomcat,MySQL 并发布SSM maven项目

    腾讯云轻量应用服务器CentOS系统使用docker安装tomcat,MySQL 并发布SSM maven项目(记录) 一.服务器修改密码(此时已安装CentOS系统) 二.防火墙添加规则 三.连接X ...

  8. Docker入门六部曲——Swarm

    原文链接:http://www.dubby.cn/detail.html?id=8738 准备工作 安装Docker(版本最低1.13). 安装好Docker Compose,上一篇文章介绍过的. 安 ...

  9. Docker入门六部曲——Stack

    原文链接:http://www.dubby.cn/detail.html?id=8739 准备知识 安装Docker(版本最低1.13). 阅读完Docker入门六部曲--Swarm,并且完成其中介绍 ...

最新文章

  1. 利用OpenCV的级联分类器类CascadeClassifier和Haar特征实现人脸区域的检测
  2. python手机端秒杀_python实现淘宝秒杀脚本
  3. NLP产品级系统设计模式
  4. MVC传递Model
  5. c语言合法自定义标识符_计算机二级C语言干货来了
  6. Python学习 Day 2-数据类型和变量
  7. 请用旧版的 Scala-2.11 搭配 Spark-2.4.8 / hadoop-2.7
  8. c#控制IE浏览器自动点击等事件WebBrowser,mshtml.IHTMLDocument2 .
  9. 《数据库系统概论》第五版 +学习笔记总目录
  10. 网络安全-技术与实践 书本习题练习
  11. [转载]世界各个地区WIFI 2.4G及5G信道划分表(附无线通信频率分配表)
  12. 爬虫 and 数据分析 | 一万条b站评论看工作细胞
  13. CS5801HDMI转eDP/DP转换芯片资料|CS5801规格书
  14. ubuntu20.04修改用户名【保留文件】
  15. 重上吹麻滩——段芝堂创始人翟立冬游记
  16. 如何关闭win10防火墙_Win技巧 | 如何关闭防火墙
  17. 使用模拟器玩地下城与勇士M电脑版试玩分享
  18. c语言程序设计之基础题
  19. EasyNVR完美搭配腾讯云CDN/阿里云CDN进行RTMP、HLS直播加速的使用说明
  20. 菲律宾的光伏市场只有一个字概况:穷

热门文章

  1. ai/ml_您本周应阅读的有趣的AI / ML文章(8月15日)
  2. Markdown 图标 快捷键
  3. 嘉年华回顾丨阿里云吕漫漪带你一览POLARDB整体架构设计...
  4. Chapter 7:Statistical-Model-Based Methods
  5. 乱查征信,贷款不想要了吗?
  6. 你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)
  7. _VARIANT_T 到 CSTRING 转换
  8. vue axios 发送get请求传递参数给后端失败_Java之Vue插件之Axios
  9. php中tables,php显示TABLE数据
  10. GameObject数组逐渐消失