【问题标题】:network_mode: service:<serviceName> not working correctlynetwork_mode: service:<serviceName> 工作不正常
【发布时间】:2022-08-04 04:12:28
【问题描述】:

我正在尝试配置一个 docker-compose 堆栈,其中包含一个连接到 VPN 的容器,以及另一个公开 HTTP 服务的容器,该服务只能通过该 VPN 连接访问。 我在网上搜索,发现 docker-compose.yml 中的 network_mode: service:&lt;serviceName&gt; 设置应该可以解决问题,但它在我的环境中不起作用。

如果我使用docker run--network=container:&lt;containerName&gt; 设置分别启动两个容器,一切正常,我可以使用curl localhost:8080 正确连接到远程HTTP 服务

这是具有两个单独命令的工作配置:

docker run --rm --name vpn --privileged --hostname vpn --publish 127.0.0.1:8080:80 --device /dev/net/tun --cap-add NET_ADMIN registry.internal.com/vpnclient

docker run --rm --name proxy --network=container:vpn registry.internal.com/proxy

这是 docker-compose.yml 不起作用:

version: \'3\'

services:
  vpn:
    container_name: vpn
    image:  registry.internal.com/vpnclient
    privileged: true
    ports:
      - 8080:80
    devices:
      - /dev/net/tun
    cap_add:
      - NET_ADMIN
    sysctls:
      - net.ipv6.conf.all.disable_ipv6=1
    restart: unless-stopped


  proxy:
    container_name: proxy
    image: registry.internal.com/proxy
    depends_on:
      - vpn
    network_mode: service:vpn
    restart: unless-stopped

标签: docker docker-compose


【解决方案1】:

docker run 版本中,您使用--hostname vpn,而docker compose 版本中缺少此功能。

docker-compose.ymlcontainer_name: vpn 下方添加hostname: vpn 应该可以解决问题。

解释:

因为不设置此参数会修改/etc/hosts 文件和hostname 命令的响应,所以如果“代理”容器中似乎需要此“主机名”,它的缺失可能会导致问题,这似乎是这种情况。

container_name: vpn 参数只固定容器名称,应该只对码头工人命令。它匹配docker run 命令的--name vpn 选项。

此处涉及的最后一个 vpn 名称来自 docker-compose.yml 文件的 services: 部分。这将允许容器通过 docker 提供的网络功能使用其服务名称加入。

(更新:我应该补充一点,我并不是说让容器中运行的内容依赖于这个“主机名”是一种很好的做法。其实我什至有感觉在某些环境中可能会出现问题,但是我也可能是错的.)

【讨论】:

  • 添加 hostname:vpn 修复它。这个答案仍然有点令人费解,应该更清楚,因为它确实回答了这个问题。
猜你喜欢
  • 2018-01-13
  • 2017-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-23
  • 2021-11-28
  • 2023-04-10
  • 2015-01-16
相关资源
最近更新 更多