Docker网络模型(二)容器网络

容器网络

一个容器并没有它连接的网络类型的信息。不管它用的是  bridge 还是 overlay, 又或者是  macvlan network。容器能看到的,是一张配置好 IP 地址、网关、路由表、DNS 服务跟其他网络信息的网卡。因此,除非容器用的是 none 模式网络驱动,否则本页都是从容器角度来描述网络的。

公开端口

默认情况下,你用 docker create 或者 docker run 指令启动一个容器时,容器并不会对外暴露任何端口。要想让一个端口能在 Docker 之外被使用,就需要使用 --publish 或者 -p 标志。使用之后,容器中会创建一条防火墙规则,将容器的端口跟 Docker 宿主机中的端口映射起来。下面是一些例子:

指令标志 描述
-p 8080:80 将容器中的 80 TCP 端口映射到宿主机的 8080 端口。
-p 192.168.1.100:8080:80 将连接到容器 IP 192.168.1.100 中的 80 TCP 端口映射到宿主机的 8080 端口。
-p 8080:80/udp 将容器中的 80 UDP 端口映射到宿主机的 8080 端口。
-p 8080:80/tcp -p 8080:80/udp 将容器中的 80 TCP 端口映射到宿主机的 8080 端口,同时将容器中的 80 UDP 端口映射到宿主机的 8080 端口。

IP 地址和主机名

默认情况下,容器能从每一个它挂载的 Docker 网络里获取到 IP。这些 IP 是从外部的 IP 池里获得的。Docker daemon 为每一个容器充当一个 DHCP 服务器。每一个网络同时也会有一个默认的子网掩码和网关地址。

当一个容器启动的时候,它只能使用 --network 标志连接到一个网络上。你可以使用 docker network connect 命令把一个运行中的容器连接到多个不同的网络。当你用 --network 标志启动一个容器的时候,可以同时使用  --ip 或者 --ip6 标志来指定好 IP 地址。

当你用 docker network connect将一个已经存在的容器连接到一个不同的网络的时候,类似的也可以在指令里用 --ip 或者 --ip6 标志来指定加入的网络的 IP 地址。

同样的,容器的主机名默认是容器在 Docker 里的ID号。你也可以用  --hostname来覆盖掉此默认名。当你用 docker network connect将一个已经存在的容器连接到一个不同的网络的时候,可以使用 --alias 标志,给这个容器在对应的网络中起一个额外的网络别名。

DNS 服务

默认情况下,容器继承了宿主机在 /etc/resolv.conf 配置文件里定义好的DNS设定。连接到默认的 bridge 网络(一般是 docker0 网桥)的容器,会收到一份此文件的拷贝。连接到 自定义bridge网络 的容器,会使用 Docker 内置的 DNS 服务器。Docker 内置的 DNS 服务器会转发 DNS lookup 请求给宿主机配置好的 DNS 服务器进行解析。

在宿主机的 /etc/hosts 中自定义好的 hosts 则不会被容器继承。要想传递这些额外的 hosts 信息,参考 docker run 相关文档中的 add entries to container hosts file 部分。你可以在每个容器的基础上覆盖掉这些设定。

指令标志 描述
--dns 指定 DNS 服务器的 IP 地址。要想指定多个 DNS 服务器,可以多次使用 --dns 标志。 如果容器不能访问这些制定好的 DNS 服务器,容器会自动去谷歌的 8.8.8.8 公共 DNS 服务器请求。这使得容器能解析互联网上的域名。
--dns-search DNS 搜索域,可以片断主机名(比如制定了搜索域为 .exp.com,搜索 host 的时候,不止搜索 host,还会搜 host.exp.com)。如果想指定多个搜索域,可以多次使用 --dns-search 标志。
--dns-opt 用来配置 DNS 选项的键值对。参考操作系统里有关于 resolv.conf 配置文件选项的文档。
--hostname 容器自己的主机名。不指定的话,默认是容器的ID。

代理服务器

如果你的容器需要代理,参考 使用代理服务器

猜你喜欢

转载自blog.csdn.net/weixin_42445065/article/details/130808088