Docker系统六:Docker网络管理
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容器网络之Linux Network Namespace
关于源地址和目地地址的转换关系:iptables中DNAT、SNAT和MASQUERADE的理解
Docker相关的网络详解:Docker网络详解
iptables命令详解:iptables命令详解
Docker系统六:Docker网络管理的更多相关文章
- Docker(十六)-Docker的daemon.json的作用
docker安装后默认没有daemon.json这个配置文件,需要进行手动创建.配置文件的默认路径:/etc/docker/daemon.json 一般情况,配置文件 daemon.json中配置的项 ...
- BI系统打包Docker镜像及容器化部署的具体实现
在过去的几年中,"云"作为明星热词站在了各种新潮技术之中,你可能使用过,但说不清它的原理:或者是没用过,但听过它的大名:也可能连它的名字都没听过,但你对这只蓝色鲸鱼一定十分眼熟.作 ...
- 【新技术】CentOS系统下docker的安装配置及使用详解
1 docker简介 Docker 提供了一个可以运行你的应用程序的封套(envelope),或者说容器.它原本是dotCloud 启动的一个业余项目,并在前些时候开源了.它吸引了大量的关注和讨 ...
- Docker(六):Docker 三剑客之 Docker Swarm
实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...
- centos7系统下 docker 环境搭建
运行环境: VMware Workstation Pro 在虚拟机中安装centos7系统, 选择最小安装, 网络连接方式选择的桥接(与宿主机在同一IP段)centos7一定要安装64位, docke ...
- Centos系统下Docker的安装
一.检查内核版本 安装Docker,需要linux内核大于3.10 使用uname -r 来检查 二. Centos系统下Docker的安装 1. 安装需要的软件包 yum install -y yu ...
- CentOS系统下docker的安装与卸载
Docker简介 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制, ...
- docker容器管理及网络管理
防火墙规则—— INPUT 主要用于主机防火墙,设置规则屏蔽处理进入本机的数据包示例:禁止10.180.100.141这个机器访问我本机的web服务iptables -t filter -A INPU ...
- 系统学习Docker 践行DevOps理念
Docker代表的容器技术是近两年的大热技术,和人工智能.区块链等热点不同,容器技术的门槛并不高,每一个开发.测试.运维人员都能在日常工作中掌握和使用,是当今IT从业人员的必备技能之一.本课程会带大家 ...
随机推荐
- Servlet--j2e中文乱码解决
我们在写项目的时候经常会传递一些中文参数,但是j2e默认使用ISO-8859-1来编码和解码,所以很容易出现中文乱码问题.这里我做一个统一的整理,其实这里的中文乱码问题和上一篇的路径问题都是j2e经常 ...
- 无法远程连接SQLSERVER2000的解决方法
有时候客户端和服务器不在同一个局域网里面,这时候很可能无法直接使用服务器名称来标识该服务器,这时候我们可以使用HOSTS文件来进行名字解析,具体的方法是: 1.使用记事本打开HOSTS文件(一般情况下 ...
- ansible-playbook相关
获取目标主机的信息 ansible all -m setup -a "filter=ansible_os_family" 不执行仅测试 ```sh 安装一个zabbix-agent ...
- ulua c#调用lua中模拟的类成员函数
项目使用ulua,我神烦这个东西.lua单纯在lua环境使用还好,一旦要跟外界交互,各种月经不调就来了.要记住贼多的细节,你才能稍微处理好.一个破栈,pop来push去,位置一会在-1,一会在-3,2 ...
- JAVA设计模式之---工厂模式
1.引言 工厂模式可以分为类: 1)简单工厂模式(Simple Factory) 2)工厂方法模式(Factory Method) 3)抽象工厂模式(Abstract Factory) 这种模式从上 ...
- 【机器学习实战 第九章】树回归 CART算法的原理与实现 - python3
本文来自<机器学习实战>(Peter Harrington)第九章"树回归"部分,代码使用python3.5,并在jupyter notebook环境中测试通过,推荐c ...
- 高通HAL层之Sensor HAL
高通的HAL层其实分为两种,一种是直接从kernel这边报数据上来的,由sensor HAL层来监听,另一种是走ADSP的模式,HAL层是通过qmi的形式进行监听的: 走ADSP架构的可以看下面的博客 ...
- Jmeter_打印当前时间戳&打印偏移时间戳
Jmeter中提供了一种函数,可以打印时间戳,如下图 年: yyyy 月:MM 日:dd 时: HH 分: mm 秒:ss 关于时间戳的格式,可以自由组合定义,这里我写成这样 yyyy-MM-dd H ...
- .NET Core版本七牛云SDK使用
一.问题背景 公司目前正在将一部分的业务从.NET平台准备迁移到.NET Core上去,同时也准备启用docker进行.NET Core的部署,在项目迁移过程中,不可避免的碰到有些SDK只有在.NET ...
- UEditor工具栏上自定义按钮、图标、事件和右击菜单添加自定义按钮
首先我要说是,举例说的这个版本是1.2以上的,因为一些配置代码转移到了zh-cn.js里,其他没有变化.开门见山直接写:(我自定义的是在线美图功能) 第一步:找到ueditor.config.js文件 ...