docker容器的网络访问

网络访问模式

容器的子网络基于驱动,是可插拔的(pluggable)。默认情况下,存在以下几种驱动程序,它们提供核心的联网功能:

  • Bridge:网桥(bridge)是默认的网络驱动。当应用程序在单机模式(standalone)的容器中运行且需要通信时,通常会使用网桥驱动。
  • Host:对于单机模式的容器,容器与docker主机之间没有网络隔离,容器可以直接使用主机的网络。
  • Overlay:overlay网络驱动将多个docker守护进程(daemon)连接在一起,使得swarm服务之间能够互相通信。也适用于swarm服务和单机容器、或者两个不同的单机容器之间的通信。
  • Macvlan:macvlan网络驱动允许用户给每个容器分配一个MAC地址,使得这些容器在网络中可以被看作物理设备。
  • None:禁用容器内所有网络。通常与自定义网络驱动一起使用。
  • 第三方网络插件(third-party network plugins):从Docker Hub下载的第三方网络驱动程序。

Bridge networks

当用户启动docker后,会自动创建一个默认的bridge网桥(名字也是bridge)。除非特别注明使用其他网络,所有新运行的容器都会连接到此bridge网络。用户也可以自定义一个bridge网络,且用户自定义的bridge优于docker自动创建的默认bridge网络。默认创建的bridge网络不建议用于生产环境。

用户自定义bridge网络与容器默认bridge网络的主要区别包括:

  • 用户自定义bridge网络可以提供容器之间的DNS自动解析(automatic DNS resolution)。默认bridge网络仅允许容器之间通过IP地址访问彼此;
  • 用户自定义bridge网络隔离性更好。所有未使用--network关键字的容器都会被自动加入默认的bridge网络,因此存在一定的风险;
  • 容器在运行中(on the fly)可以随机加入或退出用户自定义网络。但如果要从默认bridge网络中移除容器,需要先停止运行该容器;
  • 用户自定义网络支持更加灵活的配置。对于默认bridge网络,其中的所有容器都只能使用完全相同的网络配置(比如MTU和iptables配置),并且修改配置后需要重启Docker本身。用户自定义网络可以通过使用docker network create命令,为不同的应用分组分别进行网络配置。
  • 默认bridge网络中的容器可以通过使--link标志(flag)共享环境变量。用户自定义网络不支--link标志,但是可以使用volumes、docker-compose、swarm服务等更高级的方式共享变量和数据。

连接到同一个用户自定义网络的容器彼此之间暴露所有端口。使用-p--publish标志发布容器端口使其可以被不同网络中的容器和非docker主机访问。

管理用户自定义网桥

$ docker network create my-net  # 创建自定义bridge
$ docker network rm my-net  # 移除网络
# 运行容器并连接到自定义网络,将容器的80端口发布到docker主机的
# 99端口(外部客户端可以通过主机IP:99访问容器的80端口)
$ docker create --name my-nginx --network my-net --publish 99:80 nginx
$ docker ps -l  # 查看容器端口映射
# 将正在运行的容器连接到已经存在的用户自定义网络
$ docker network connect my-net my-nginx
$ docker network disconnect my-net my-nginx  # 断开连接

Host networking

主机模式下,容器共享主机的网络命名空间(networking namespace)。容器自己不会被分配IP地址,且容器端口映射(port mapping)不会生效,因此-p--publish-P--publish-all选项会被忽略。Host网络模式仅在Linux操作系统中支持。

# 运行容器并连接到host网络,-rm表示如果容器退出或停止就移除容器
$ docker run --rm -d --network host --name my_nginx nginx 

打开http://主机IP:80/访问Nginx。需要docker主机的80端口可用(参见 https://hub.docker.com/_/nginx/)。

检查网络接口:ip addr show
查看80端口绑定的进程:sudo netstat -tulpn | grep :80
停止容器:docker container stop my_nginx

Overlay networks

Overlay网络驱动在不同的docker守护进程主机之间创建了一个分布式的网络,特别适用于不同docker主机上的容器进行通信、或者多个使用swarm服务的应用之间进行通信。

具体使用方法参见 https://docs.docker.com/network/overlay/。

Macvlan networks

有些应用程序,比如监控网络流量的程序,希望直接连到物理网络。在这种情况下,可以使用macvlan网络驱动给容器的虚拟网络接口(virtual network interface)分配一个物理地址(MAC address)。

具体使用方法参见 https://docs.docker.com/network/macvlan/。

None: Disable networking

在运行容器时使用--network none标志可以禁用容器内部网络。此时,在容器内部仅创建了回环接口(loopback device)。

网络测试

使用busybox镜像测试以上网络模式。

$ docker pull busybox  # 拉取镜像
# 测试一:默认bridge网络
$ docker run -it --name bs01 busybox
/ # ifconfig  # 会输出eth0和lo两块网络设备
/ # exit
# 测试二:host网络
$ docker run -it --name bs02 --network host busybox
/ # ifconfig  # 与在docker主机中的输出一致,包括docker0、ens33和lo
/ # exit
# 测试三:禁用容器网络
$ docker run -it --name bs03 --network none busybox
/ # ifconfig  # 仅输出lo回环设备
/ # exit
# 测试四:自定义bridge网络
$ docker network create test-net
$ docker run -it --name bs04 --network test-net busybox
$ docker run -it --name bs05 --network test-net busybox
$ docker run -it --name bs05 --net container:bs04 busybox  # 与前一句命令效果相同,表示使bs05加入bs04的网络
/ # ping bs04  # 自定义网络支持DNS自动解析
/ # ping $HOSTNAME_of_bs04  # DNS自动解析
/ # ip addr  # 会输出eth0和lo两块网络设备
/ # exit
$ docker rm -f $(docker ps -a | awk '{print $1}')  # 移除所有容器

网络访问原理

在docker主机上有容器在运行时,在主机中执行ifconfigip addr命令的输出一般会包括以下内容:

  • 回环设备lo
  • 主机网卡ens33
  • docker0网桥:连接到bridge网络的容器的网关。
  • veth 开头的网络设备:其数量等于连接到bridge网络的容器数目,且与每个容器内的eth0网卡一一配对。
  • br- 开头的网桥:代表用户自定义的bridge网络。

当bridge网络中的容器将数据发送到外网时,数据包先通过容器内eth0和主机上veth网卡组成的接口转发到主机上的docker0网桥,然后通过源地址转换(Source Network Address Translation, SNAT)转发到主机的物理网卡eth0,最终发送到外网。容器接收外网传回的数据包时,使用的则是目的地址转换(Destination Network Address Translation, DNAT)。

在这里插入图片描述

在这里插入图片描述

Sources:
[1] https://docs.docker.com/network/
[2] https://docs.docker.com/engine/reference/commandline/network/

### 回答1: 要实现 Docker 容器相互访问,可以通过以下几种方式: 1. 使用 Docker 网络:在 Docker 中,每个容器都有自己的 IP 地址,并且可以在同一个网络中相互通信。可以创建一个自定义的 Docker 网络,将需要相互通信的容器加入到同一个网络中,然后它们就可以使用容器名称或者 IP 地址来相互访问了。 2. 使用容器名称访问:在 Docker 中,每个容器都有一个唯一的名称,可以使用容器名称来访问其他容器。当一个容器需要访问另一个容器时,可以使用该容器的名称作为主机名进行访问。 3. 使用容器的 IP 地址访问:每个容器都有自己的 IP 地址,可以通过容器的 IP 地址来进行访问。可以通过 Docker 命令 `docker inspect` 来查看容器的 IP 地址,然后使用该 IP 地址进行访问。 4. 使用容器的端口映射:如果需要让外部的容器能够访问到某个容器内部的服务,可以通过容器的端口映射来实现。可以在运行容器时通过 `-p` 参数来指定端口映射规则,然后可以使用外部主机的 IP 地址和映射的端口来访问容器内部的服务。 5. 使用 Docker DNS 服务:当容器在同一个网络中时,Docker 会自动提供 DNS 服务,使得在容器中可以使用容器名称进行域名解析。可以通过容器名称加上服务的域名后缀来进行访问。 以上是实现 Docker 容器相互访问的几种常见方式,可以根据具体的需求和场景选择适合的方法来实现容器之间的通信和访问。 ### 回答2: 在Docker中,容器之间可以通过网络互相访问。要让容器相互访问,有以下几个步骤。 首先,我们需要创建一个网络。可以使用以下命令来创建一个网络: ``` docker network create mynetwork ``` 该命令将创建一个名为mynetwork的网络。 接下来,我们可以将容器连接到这个网络中。在创建容器时,可以使用`--network`选项将容器连接到我们创建的网络。例如,我们创建两个容器container1和container2,并将它们连接到mynetwork: ``` docker run --name container1 --network mynetwork image1 docker run --name container2 --network mynetwork image2 ``` 通过`--network`选项,我们可以将容器连接到指定的网络。 此时,container1和container2就可以相互访问了。它们可以使用容器名称来进行访问,因为Docker会自动为每个容器分配一个DNS记录,以容器名称作为主机名。例如,如果container1需要访问container2中的某个服务,可以使用容器名称作为主机名: ``` curl http://container2:port ``` 这样就可以从container1中访问container2。 另外,我们还可以通过网络别名来进行访问。在连接容器网络时,可以使用`--network-alias`选项为容器指定一个别名。例如,我们可以将container2的别名设置为service2: ``` docker run --name container2 --network mynetwork --network-alias service2 image2 ``` 现在,container1可以使用service2作为主机名来访问container2中的服务: ``` curl http://service2:port ``` 这样就可以从container1中访问container2。 通过以上步骤,我们可以实现Docker容器之间的相互访问。 ### 回答3: Docker容器之间的相互访问可以通过容器间的网络进行实现。Docker提供了三种网络模式,包括默认的桥接网络、主机网络容器网络,可以根据具体需求选择不同的网络模式来实现容器间的通信。 在默认的桥接网络模式下,Docker会为每个容器分配一个IP地址,并创建一个名为docker0的虚拟网桥。在该网络下,容器之间可以通过容器的IP地址进行相互访问。可以使用容器的名称或者IP地址作为主机名进行访问,例如可以使用ping命令来测试容器之间的连通性:ping <容器名称或IP地址>。 在主机网络模式下,容器和宿主机共享同一个网络命名空间,容器直接使用宿主机的IP地址和端口进行通信。在该网络模式下,不需要进行端口映射,容器之间可以直接使用localhost或者本地IP地址进行访问容器网络模式允许用户自定义网络,可以创建多个容器并将它们连接到同一个自定义网络中。在自定义网络中,容器之间可以使用容器名称或者服务名称进行通信。可以使用docker network create命令创建自定义网络,使用docker network connect命令将容器连接到自定义网络中。 综上所述,Docker容器之间的相互访问可以通过容器的IP地址、容器名称、服务名称等方式来实现。可以根据实际需要选择不同的网络模式,灵活地实现容器间的通信。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

GottdesKrieges

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值