docker入门实战9 高级网络配置

本章介绍docker的一些关于网络的高级知识,包括网络的启动和配置参数、DNS的使用配置、容器访问和端口映射的相关实现。

20.1 网络启动与配置参数

1. 基本过程

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

同时docker随机分配一个本地未占用的私有网段中的一个地址给docker0接口。此后启动的容器内的网口也会自动分配一个同一网段的地址。包括IP和掩码。

当创建一个docker容器的时候,同时会创建了一对veth pair接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即eth0;另一端在本地并被挂载到docker0网桥,名称以veth开头。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。这样一来,docker就创建了在主机和所有容器之间一个虚拟共享网络。

2, 网络相关参数

下面是跟docker网络相关的命令参数,其中有些命令选项只有在docker服务启动的时候才能配置,而且不能马上生效:

1)-b BRIDGE or --bridge=BRIDGE:指定容器挂载的网桥。

2)--bip=CIDR:定制docker0的掩码。

3)-H SOCKET... or --host=SOCKET...:docker服务端接收命令的通道。

4)--icc=true|false:是否支持容器之间进行通信。

5)--ip-forward=true|false:启用net.ipv4.ip forward,即打开转发功能。

6)--iptables=true|false:禁止docker添加iptables规则。

7)--mtu=BYTES:容器网络中的MTU。

下面两个命令选项既可以在启动服务时指定,也可以docker容器启动(docker run)时候指定。在docker服务启动的时候指定则会成为默认值,后续执行docker run时可以覆盖设置的默认值:

1)--dns=IP_ADDRESS...:使用指定的DNS服务器。

2)--dns-search=DOMAIN...:指定DNS搜索域。

最后这些选项只能在docker run执行时使用,因为它们是针对容器的特性内容:

1)-h HOSTNAME or --hostname=HOSTNAME:配置容器主机名。

2)--link=CONTAINER_NAME:ALIAS:添加到另一个容器的连接。

3)--net=bridge | none | container:NAME_or_ID | host:配置容器的桥接模式。

4)-p SPEC or --publish=SPEC:映射容器端口到宿主主机。

5)-P or --publish-all=true|false:映射容器所有端口到宿主主机。

20.2 哦欸之容器DNS和主机名

docker支持自定义容器的主机名和DNS配置。

1. 相关配置文件

容器中主机名和DNS配置信息都是通过三个系统配置文件来维护的:

/etc/resolv.conf、/etc/hostname和/etc/hosts。

其中,/etc/resolv.conf文件在创建容器时候,默认会与宿主机/etc/resolv.conf文件内容保持一致。

/etc/hosts文件中默认只记录了容器自身的一些地址和名称。

/etc/hostname文件则记录了容器的主机名。

2. 容器内修改配置文件

docker 1.2.0开始支持在运行中的容器里直接编辑/etc/hosts, /etc/hostname和/etc/resolv.conf文件。但是是临时性的,只在运行的容器中保留,容器终止或重启后并不会被保存下来,也不会被docker commit提交。

3. 通过参数指定

如果用户想要自定义容器的配置,可以在创建或启动容器时利用下面的参数指定:

1)指定主机名 -h HOSTNAME or --hostname=HOSTNAME。设定容器的主机名,它会被写到容器内的/etc/hostname和/etc/hosts。但这个主机名只有容器内能看到,在容器外部看不到,既不会在docker ps中显示,也不会再其他容器的/etc/hosts看到。

2)记录其它容器主机名 --link=CONTAINER_NAME:ALIAS。选项会在创建容器的时候,添加一个所连接容器的主机名到容器内/etc/hosts文件值。这样,新创建容器可以直接使用主机名来与所连接容器通信。

3)指定DNS服务器--dns=IP_ADDRESS。添加DNS服务器到容器的/etc/resolv.conf中,容器会用指定的服务器来解析所有不在/etc/hosts中的主机名。

4)指定DNS搜索域--dns-search=DOMAIN。设定容器的搜索域,当设定搜索域为.example.com时,在搜索一个名为host的主机时,DNS不仅搜索host,还会搜索host.example.com。

20.3 容器访问控制

容器的访问控制,主要通过Linux上的iptables防火墙软件来进行管理和实现。iptables是Linux系统流行的防火墙软件,在大部分发行版中都自带。

1. 容器访问外部网络

容器默认指定了网关为docker0网桥上的docker0内部接口。docker0内部接口同时也是宿主机的一个本地接口。因此,容器默认情况下是可以访问到宿主机本地的。

更进一步地,容器要想通过宿主机访问到外部网络,需要宿主机进行转发。

在启动docker服务的时候设定--ip-forward=true,docker服务会自动打开宿主机系统的转发服务。

2. 容器之间访问

容器之间相互访问需要以下两方面的支持。

1)网络拓朴是否已经连通。默认情况下,所有容器都会连接到docker0网桥上,这意味着默认情况下拓扑是互通的。

2)本地系统的防火墙软件iptables是否允许访问通过。这取决于防火墙的默认规则是允许还是禁止。

访问所有端口:

当启动docker服务时,默认会添加一条“允许”转发策略到iptables的FORWARD链上。通过配置--icc=true|false(默认值为true)参数可以控制默认的策略。

为了安全考虑,可以在/etc/default/docker文件中配置DOCKER_OPTS=--icc=false来默认禁止容器之间的相互访问。

同时,如果启动docker服务时手动指定--iptables=false参数则不会修改宿主机系统上的iptables规则。

访问指定端口:

在通过-icc=false禁止容器间相互访问后,仍可以通过--link=CONTAINER_NAME:ALIAS选项来允许访问指定容器的开放端口。

20.4 映射容器端口到宿主主机的实现

默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器。

1. 容器访问外部实现

假设容器内部的网络地址为172.17.0.2,本地网络地址为10.0.2.2。容器要能访问外部网络,源地址不能为172.17.0.2,需要进行源地址映射(SourceNAT, SNAT),修改为本地系统的IP地址10.0.2.2,映射是通过iptables的源地址伪装操作实现的。

2. 外部访问容器实现

容器允许外部访问,可以在docker run时通过-p或-P参数来启用。

不管用哪种方法,都是在本地的iptables的nat表中添加相应的规则,将访问外部IP地址的网包进行目标地址DNAT,将目标地址修改为容器的IP地址。

1)IP映射0.0.0.0,意味着将接受主机来自所有网络接口上的流量。用户可以通过-p IP:host_port:container_port或-p IP::port来指定绑定的外部网络接口,以制定更严格的访问规则。

2)如果希望映射永久绑定到某个固定的IP地址,可以在docker配置文件/etc/default/docker中指定DOCKER_OPTS="--ip=IP_ADDRESS",之后重启docker服务即可生效。

20.5 配置docker0网桥

docker服务默认创建一个名称为docker0的Linux网桥(其上有一个docker0内部接口),它在内核层连通了其它的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。

docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信,它还给出了MTU(接口允许接收的最大传输单元),通常是1500 Bytes,或宿主主机网络路由上支持的默认值。这些值都可以在服务启动的时候进行配置。

1)--bip=CIDR:IP地址加掩码格式,例如 192.168.1.5/24

2)--mtu=BYTES:覆盖默认的docker run配置。

也可以在配置文件中配置DOCKER_OPTS,然后重启服务。由于目前docker网桥是Linux网桥,用户可以使用brctl show来查看网桥和端口连接信息。

每次创建一个新容器的时候,docker从可用的地址段中选择一个空闲的IP地址分配给容器的eth0端口,并且使用本地主机上docker0接口的IP作为容器的默认网关。

目前,docker不支持在启动容器时候指定IP地址。

20.6 自定义网桥

除了默认的docker0网桥,用户也可以指定网桥来连接各个容器。

在启动docker服务时,使用-b BRIDGE或--bridge=BRIDGE来指定使用的网桥。

20.7 创建一个点到点连接

默认情况下,docker会将所有容器连接到由docker0提供的虚拟子网中。

用户有时候需要两个容器之间可以直连通信,而不用通过主机网桥进行桥接。

解决办法是:创建一对peer接口,分别放到两个容器中,配置成点到点链路类型即可。

原文地址:https://www.cnblogs.com/cjj-ggboy/p/12639877.html

时间: 2025-01-12 08:18:03

docker入门实战9 高级网络配置的相关文章

Docker 学习笔记【3】 Docker 仓库、数据卷、数据卷容器,网络基础实操。高级网络配置学习

Docker 学习笔记[4] 高级网络配置实操,实战案例实验 =========================================================================== Docker 学习笔记[2] Docker 仓库实操,创建私有仓库,实操数据卷.数据卷容器,记录开始 =========================================================================== 被格式化的脚本内容: #开头代表

Docker Network Configuration 高级网络配置

Network Configuration TL;DR When Docker starts, it creates a virtual interface named docker0 on the host machine. It randomly chooses an address and subnet from the private range defined by RFC 1918 that are not in use on the host machine, and assign

linux 笔记 3-2.高级网络配置

**********2.高级网络配置***********目标:配置网络桥接配置 bond 网络接口配置 team 网络接口 ##1.配置网络桥接##网络桥接用网络桥实现共享上网主机和客户机除了利用软件外,还可以用系统自带的网络桥建立连接用双网卡的机器做主机 真机配置 vim /etc/sysconfig/network-scripts/ifcfg-westos   vim /etc/sysconfig/network-scripts/ifcfg-br0   先关掉NetworkManager服

使Docker提供对外服务的网络配置(桥接与端口)

前沿: docker 启动容器后,如何对外服务?   希望大家看了这篇文章后有些帮助. docker的有关网络问题没怎么搞清楚,请教了下邓磊同学,感谢 ! Docker生成的容器,一般会给你生成一个ip地址,这个ip地址是和docker0的地址是一个ip段的. 通过ip a命令 ,咱们可以看到docker0的ip和子网的范围 . 大家会发现除了docker0 还有一个vethc 数字的网卡,这个也算是虚拟网卡绑在桥接上的. 我们创建一个容器,并且暴露22端口. 这个22端口的意思是对外暴露了22

docker入门实战1

一. docker入门 个人主机时代比CPU主频高低和内存大小,云计算时代虚拟化技术基石. 虚拟化可以通过硬件模拟实现,也可以通过操作系统实现. 充分利用操作系统本身的机制和特性,实现轻量级的虚拟化,docker是佼佼者. 1.1 什么是docker https://github.com/docker/docker "Build,Ship,and Run Any App,Anywhere" 通过对应用组件的封装(Packaging).分发(Distribution).部署(Deploy

Docker NAT iptables实现 及网络配置

Docker NAT iptables实现 默认情况下,容器可以主动访问到外部网络的连接,但是外部网络无法访问到容器 容器访问外部实现 容器所有到外部网络的连接,源地址都会被 NAT 成本地系统的 IP 地址(即docker0地址).这是使用 iptables 的源地址伪装操作实现的 查看主机的 NAT 规则 [[email protected] sshd_dockerfile]# iptables -t nat -vnL Chain POSTROUTING (policy ACCEPT 0 p

docker 入门实战

1.Docker 优势: .更高效利用系统资源:由于容器不需要进行硬件虚拟以及运行完整操作系统等额外开销,Docker 对系统资源的利用率更高.无论是应用执行速度.内存损耗或者文件存储速度,都要比传统虚拟机技术更高效.因此,相比虚拟机技术,一个相同配置的主机,往往可以运行更多数量的应用. .更快速的启动时间:传统的虚拟机技术启动应用服务往往需要数分钟,而Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级.甚至毫秒级的启动时间.大大的节约了开发.测试.部署的时

高级网络配置

一.team链路聚合 1.team也是链路聚合的一种方式 最多支持8块网卡 支持模式: 广播 轮巡 主备 负载均衡 2.配置 ##配置team网卡 ##将eth0 eth1 网卡添加到team网卡中 1.测试: watch -n 1 teamdctl team0  stat   ##监控team链路聚合网卡命令 ifconfig  eth0  down ifconfig  eth0  up 二.网桥 1.删除掉以前的网络配置 vim /etc/sysconfig/network-service/

docker之高级网络配置

网络基础:     docker0:        docker 启动时,会在宿主机(HOST)上创建一个docker0的虚拟网桥(交换机).本质上docker0是个birdge,主要提供container和宿主机之间的数据转发. docker0的ip地址是docker在启动是分配的本地私有网段,常见的172.17.0.0/16.同时container中也会分配同网段的一个ip地址. veth pair:        当创建一个container时,同时也会创建一对veth端口.当向其中一个端