您现在的位置是:首页 >技术教程 >Docker网络模型(二)容器网络网站首页技术教程
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。 |
代理服务器
如果你的容器需要代理,参考 使用代理服务器。