笔记:Docker 从入门到实践-3

Docker 网络配置

因特网域名分配组织IANA组织(Internet Assigned Numbers Authority)保留了以下三个IP地址块用于私有网络。
  10.0.0.0 - 10.255.255.255 (10/8比特前缀)
  172.16.0.0 - 172.31.255.255 (172.16/12比特前缀)
  192.168.0.0 - 192.168.255.255 (192.168/16比特前缀)
  我们把第一块称为“24-比特块”,第二块称为“20-比特块”,第三块称为“16-比特块”注意(在前面的CIDR 记号中),第一块地址就是一个A类网络号,第二块地址是16个连续的B类网络号集合,第三块地址是256个连续的C类网络号集合。

Docker 中的网络接口默认都是虚拟的接口。虚拟接口的优势之一是转发效率较高。 Linux 通过在内核中进行数据复制来实现虚拟接口之间的数据转发, 发送接口的发送缓存中的数据包被直接复制到接收接口的接收缓存中。 对于本地系统和容器内系统看来就像是一个正常的以太网卡,只是它不需要真正同外部网络设备通信,速度要快很多。Docker 容器网络就利用了这项技术。它在本地主机和容器内分别创建一个虚拟接口,并让它们彼此连通(这样的一对接口叫做 veth pair )。
 

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥, 实际上是 Linux 的一个解为一个软件交换机。它会在挂载到它的网口之间进行转发。同时, Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址口。比如典型的 172.17.42.1 ,掩码为 255.255.0.0 。此后启动的容器内的网口也会自动分配网段( 172.17.0.0/16 )的地址。

Docker 创建一个容器的时候,会执行如下操作:
创建一对虚拟接口,分别放到本地主机和新容器中;
本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9;
容器一端放到新容器中,并修改名字作为 eth0, 这个接口只在容器的名字空间可见;
从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth65f9。

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

当安装docker后宿主机OS中会创建一个虚拟的网桥docker0 和一个同名虚拟网络接口docker0网络接口,该接口桥接在网桥docker0上负责和在该宿主机上的容器进行通信。该接口的IP地址则是宿主机未使用的私有网段,172.17.0.1 - 172.17.255.255. 每次创建一个容器,宿主机OS张都会创建一个虚拟网络接口,名称形如:veth***@if* 该接口桥接在虚拟网络接口docker0上,所创建的容器也会被分配一个虚拟网络接口eth0,其地址和docker0接口同在一个私有网段。宿主机OS 的veth***接口和容器内的eth0接口形成一个veth pair。当数据包从容器发到网络接口eth0时,宿主机OS的网络接口veth*** 也会收到数据包。网络接口veth*** 和docker0同过网桥docker0链接,因此宿主机便可以通过docke0和其上的容器进行通信了。

 Docker 网络相关的命令列表。


有些命令选项只有在 Docker 服务启动的时候才能配置,而且不能马上生效。
-b BRIDGE or --bridge=BRIDGE --指定容器挂载的网桥
--bip=CIDR --定制 docker0 的掩码
-H SOCKET... or --host=SOCKET... --Docker 服务端接收命令的通道
--icc=true|false --是否支持容器之间进行通信
--ip-forward=true|false --请看下文容器之间的通信
--iptables=true|false --禁止 Docker 添加 iptables 规则
--mtu=BYTES --容器网络中的 MTU
下面2个命令选项既可以在启动服务时指定,也可以 Docker 容器启动( docker run ) 时候指定。在
Docker 服务启动的时候指定则会成为默认值,后面执行 docker run 时可以覆盖设置的默认值。
--dns=IP_ADDRESS... --使用指定的DNS服务器
--dns-search=DOMAIN... --指定DNS搜索域
最后这些选项只有在 docker run 执行时使用,因为它是针对容器的特性内容。
-h HOSTNAME or --hostname=HOSTNAME --配置容器主机名
--link=CONTAINER_NAME:ALIAS --添加到另一个容器的连接
--net=bridge|none|container:NAME_or_ID|host --配置容器的桥接模式
-p SPEC or --publish=SPEC --映射容器端口到宿主主机
-P or --publish-all=true|false --映射容器所有端口到宿主主机
 

设置DNS

Docker 容器的 dns 配置通过 /etc/resolv.conf文件 进行配置。如下所示:
nameserver 172.27.16.28
nameserver 172.27.16.18
nameserver 172.27.40.12
在启动docker run 命令中使用-dns可以指定所使用的DNS

 

容器访问控制

源地址都会被NAT成本地系统的IP地址。 这是使用 iptables 的源地址伪装操作实现的。
容器访问外网需要宿主OS的转发, 因此需要打开宿主机系统的转发功能。相关linux命令如下:

sysctl net.ipv4.ip_forward #查看转发是否打开 0关闭,1打开
sysctl -w net.ipv4.ip_forward=1 #启动转发功能
启动docker服务时如果设定了参数 --ip_forward=true/false,则docker 会自动设定系统参数ip_forward=0/1.

启动docker 服务时参数--icc=true/false用于设定是否允许容器之间互访。默认是true,也可以在docker的配置文件/etc/default/docker中 设置参数DOCKER_OPTS=--icc=false 来禁止。

启动docker服务时参数--iptables=true/false用于设定docker是否可以在iptable中添加规则。

容器访问外网

外网访问容器时通过宿主机OS和容器的端口映射实现。

可以在 docker run 的时候通过 --net 参数来指定容器的网络配置,有4个可选值:
--net=bridge 这个是默认值, 连接到默认的网桥。
--net=host 告诉 Docker 不要将容器网络放到隔离的名字空间中,即不要容器化容器内的网络。此时
容器使用本地主机的网络,它拥有完全的本地主机接口访问权限。容器进程可以跟主机其它 root 进程
一样可以打开低范围的端口,可以访问本地网络服务比如 D-bus, 还可以让容器做一些影响整个主机
系统的事情,比如重启主机。因此使用这个选项的时候要非常小心。如果进一步的使用 --
privileged=true ,容器会被允许直接配置主机的网络堆栈。
--net=container:NAME_or_ID 让 Docker 将新建容器的进程放到一个已存在容器的网络栈中,新容
器进程有自己的文件系统、 进程列表和资源限制,但会和已存在的容器共享 IP 地址和端口等网络资
源, 两者进程可以直接通过 lo 环回接口通信。
--net=none 让 Docker 将新容器放到隔离的网络栈中,但是不进行网络配置。之后,用户可以自己进
行配置。
 

kubernetes 的pod中容器共享IP和端口,即在创建启动pod的容器时使用了参数 --net=contianer:NAME_or_ID.

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值