Docker 容器网络模式
Docker 容器支持多种网络模式(network modes),每种适用于不同的使用场景。下面是主要的几种 Docker 网络模式及其说明:
bridge: 默认网络驱动程序。如果您未指定驱动程序,则此类型即为您创建的网络。桥接网络通常用于应用程序在需要与同一主机上的其他容器通信的容器中运行的情况。请参阅 桥接网络驱动程序。host: 移除容器与 Docker 主机之间的网络隔离,并直接使用主机的网络。请参阅 主机网络驱动程序。container:<name|id>: 多个容器共享同一个容器的网络命名空间。none: 将容器与主机及其他容器完全隔离。none不适用于 Swarm 服务。请参阅 None 网络驱动程序。
bridge
默认网络bridge
启动 Docker 时,会自动创建一个 默认桥接网络(也称为bridge),除非另有指定,否则新启动的容器都会连接到该网络。您也可以创建用户定义的桥接网络。用户定义的桥接网络的优先级高于默认bridge 网络。
# 启动容器,默认连接bridge
docker run -d --name myapp nginx
# 指定连接bridge
docker run -d --name myapp --network bridge nginx用户自定义网络
您可以创建自定义网络,并将多个容器连接到同一网络。连接到用户定义网络后,容器可以使用容器 IP 地址或容器名称相互通信。
以下示例使用网络驱动程序bridge创建网络并在创建的网络中运行容器:
$ docker network create -d bridge my-net
$ docker run --network=my-net -itd --name=container3 busyboxhost
如果您对容器使用host网络模式,则该容器的网络堆栈不会与 Docker 主机隔离(容器共享主机的网络命名空间),并且容器不会分配自己的 IP 地址。例如,如果您运行一个绑定到端口 80 的容器并使用host 网络,则该容器的应用程序可以在主机 IP 地址的端口 80 上使用。
[!NOTE]
由于容器在使用
host模式网络时没有自己的 IP 地址 ,因此端口映射不会生效,并且-p、--publish、-P和--publish-all选项将被忽略,并产生警告:WARNING: Published ports are discarded when using host network mode
Example
以下命令在容器中启动 netcat 并监听端口8000:
$ docker run --rm -it --net=host nicolaka/netshoot nc -lkv 0.0.0.0 8000然后端口8000将在主机上可用,您可以从另一个终端使用以下命令连接到该端口:
$ nc localhost 8000您在此处输入的内容将会出现在容器正在运行的终端上。
要从容器访问主机上运行的服务,可以使用以下命令启动启用了主机网络的容器:
$ docker run --rm -it --net=host nicolaka/netshoot如果您想要从容器访问主机上的服务(在本例中是在端口上运行的 Web 服务器80),您可以这样做:
$ nc localhost 80container:<name|id>
除了用户定义的网络之外,您还可以使用--network container:<name|id>标志格式将一个容器直接附加到另一个容器的网络堆栈。
使用container: 网络模式的容器不支持以下标志:
--add-host--hostname--dns--dns-search--dns-option--mac-address--publish--publish-all--expose
下面的示例运行一个Redis容器,将Redis绑定到 localhost,然后运行redis-cli命令并通过localhost接口连接到Redis服务器。
$ docker run -d --name redis example/redis --bind 127.0.0.1
$ docker run --rm -it --network container:redis example/redis-cli -h 127.0.0.1none
如果要完全隔离容器的网络堆栈,可以--network none在启动容器时使用该标志。在容器内部,只会创建回环设备。
以下示例显示了使用none网络驱动程序的alpine容器中ip link show的输出。
$ docker run --rm --network none alpine:latest ip link show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00没有为使用该none驱动程序的容器配置 IPv6 环回地址。
$ docker run --rm --network none --name no-net-alpine alpine:latest ip addr show
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever参考: