Docker小记-网络

Docker的网络

  • Docker使用操作系统的底层特性构建了一个特殊的、可定制的虚拟网络拓扑结构。这个虚拟网络只在安装有Docker的机器上有效,并并且它由主机上的容器和主机所连接的网络之间的路由构成。
  • 本地虚拟网络用来提供容器的隔离,Docker使用内核命名空间来创建私有的虚拟接口,但是命名空间本身并不提供网络的隔离。网络暴露或者隔离是通过主机的防火墙规则

四种网络容器原型

Closed容器

  • docker run 命令后添加–net none 作为参数来创建一个Closed 容器
  • Closed容器中的进程只能够访问本地回环接口
  • 如果对网络隔离程度要求非常高,或者程序不需要网络访问权限时,Closed 容器是最好的选择

Bridged容器

  • Bridged容器才是Docker的默认选项,这种原型可定制性最高,并且被认为是最佳实践
  • Bridged容器拥有两个接口,一个是私有的本地回环接口,另外一个私有接口通过网桥连接到主机的其他容器

Joined容器

  • Joined容器。这些容器共享一个网络栈,在这种情况下,容器之间没有任何的隔离
  • 它们各自维持有不同的文件系统、不同的内存等,但是它们共享了同一个网络组件
  • 这种类型的原型通过将某一个容器接口的访问权提供给另外一个新的容器来构建,在这种情况下,接口就类似于共享的数据卷
  • –net选项中容器的值决定了新容器要和哪一个容器进行连接(以下两个命令将会创建两个共享相同网络接口的容器。因为第一个命令创建了一个Closed容器,因此第二个容器只共享那个本地回环接口)
  • 使用场景
    • 当你想要不同容器上的程序通过本地回环接口进行通信时
    • 当想要监控另外一个容器中某个程序的网络流量时
    • 当一个容器中的程序将要改变Joined网络栈,而另外一个程序将要使用那个被改变的网络栈时

Open容器

  • 创建:docker run --net host
  • Open容器没有网络容器,并且对主机网络有完全的访问权,包括对重要主机服务的访问权。
  • Open容器没有提供任何隔离,当你没有其他选择时它才应该被考虑

自定义命名解析

  • docker run命令有一个–hostname选项,你可以使用这个选项来设置一个新容器的主机名。这个选项会在该容器中的DNS覆盖系统中添加一条记录。这条记录会将提供的主机名映射成该容器的桥接IP地址。
  • -add-host=[]选项能自定义从主机名到IP地址的映射关系,可以设置多个
    • 可以使用这个功能将特定的主机名映射到一个已知的IP地址上,比如说127.0.0.1,以此来有效地阻止特定的主机名。
    • 能为单独的容器提供特定的主机名映射,可能是最细粒度的自定义了。
docker run --rm \
--add-host test:10.10.10.255 \ 
alpine:latest \
nslookup test // 解析到10.10.10.255
  • -dns=[]选项可以被使用多次来设置多个DNS服务器,自定义DNS配置的选项能够用来指定一个或者多个DNS服务器。
docker run --rm \
--dns 8.8.8.8 \  //设置主DNS服务器
alpine:lastest \
nslookup docker.com // 解析docker.com的ip地址
  • DNS相关的选项——–dns-search=[],允许你指定一个DNS查找域,这个查找域就像host名的一个默认后缀。当该选项被设置,在查询时,任何不包括已知顶级域名(比如.com或者.net)的主机名会自动加上该后缀名
docker run --rm \
--dns-search docker.com \ // 设置查找域
busybox:latest \
nslookup registry.hub // registry.hub.docker.com解析
  • 所有的自定义转换关系都保存在容器中的/etc/hosts 文件中。如果你想要看看有哪些覆盖内容,你所要做的就是查找这个文件
  • 只有创建容器时,这些选项才会生效。如果一个容器正在运行,你改变了默认值,那么这个容器会保留旧的值。

开放对容器的访问

  • docker run命令提供了一个-p --publish=[]选项,它能够在主机网络栈上的端口和容器端口之间创建映射关系。
docker run -p 3333:3333
  • docker port命令来查看端口是如何被映射的。port子命令接受一个容器名字或者ID作为参数,并且会输出一个列表,每一行对应一个端口映射
  • –expose选项,它能设置容器想要开发的端口。这个选项能够被设置多次,一个端口设置一次:
    • 以上命令中的–expose 选项会将端口添加到-P 选项的端口列表中。
  • 禁止跨容器通信: docker -d -icc=false
    • 当跨容器通信被禁止了,除非被显式允许的流量,否则任何从容器到容器的网络流量都会被主机上的防火墙阻止。
    • 当跨容器通信(ICC)被允许时,–expose选项为容器端口到主机端口的映射提供了捷径。
    • 当跨容容器通信(ICC)被禁止时,–expose选项成了定义防火墙规则和在网络上显式声明容器接口的一个工具

链接

docker run -d --name mydb \
alpine:latest 

docker run -it --rm \
--link mydb:database \
dockerDemo/ch5
  • 创建链接时,目标容器必须正在运行。原因非常简单,只有容器正在运行,它们才能维持其IP地址
  • 如果某个依赖由于某些原因停止了,则这条链接也会被破坏。(一旦容器被停止或者重启了,那么它将失去IP地址租约并且任何链接到该容器的容器保留的都是过期的链接信息了)
  • 链接通过检测目的容器的网络信息(IP地址和开放端口),然后将这些信息注入新容器中。
  • 如果跨容器通信被禁止了,Docker会添加特定的防火墙规则来允许被链接的容器间的通信。
  • 链接的本质就是静态的、具有方向性和无传递性的依赖
  • 创建一条链接会在新容器中添加链接信息,一方面存储在环境变量中,另一方面通过在DNS覆盖系统中添加主机名的映射来将链接信息注入新容器中
  • 有多个环境变量由于链接的创建而创建,所有跟某一具体链接相关的变量都会使用该链接别名作为前缀
  • 对于每个被链接的容器开放的端口,都会有四个单独的环境变量,并且环境变量的名字包含了对应的开放端口。模式如下:
    • PORT_
    • PORT__PROTO
    • PORT__ADDR
    • PORT__PORT
  • 如果能够接受主机上动态或者短暂的端口,那么你可以使用-P --publish-all 选项。这个选项会告诉Docker daemon去创建端口映射关系,将容器的端口都暴露出去。(能够用来通信的端口就是那些已经被目标容器公开的端口)

修改网桥接口的配置

  • –bip选项(bip是bridge IP的缩写,表示网桥IP),可以设置Docker创建的网桥接口的 IP 地址,也可以使用无类域内路由(CIDR)地址来设置子网的大小。
    • 假设想要将你的网桥IP地址设置为192.168.0.128,并且只想分配这个子网最后的128个地址。需要将–bip选项的值设置为192.168.0.128/25。
  • 自定义该网络中的容器的IP地址的范围
docker -d -fixed-cidr “192.168.0.192/26”
  • 更改Docker网桥的最大传输单元(MTU)(根据协议,以太网接口拥有1500字节的最大数据包大小,这是默认的配置)
docker -d -mtu 1200
  • 可以使用自定义的网桥接口来替代docker0,使用的选项是-b或–bridge

相关链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值