【问题标题】:Expose a docker composed container with network_mode: "host" and keep container to container networking使用 network_mode: "host" 公开一个 docker compose 容器并将容器保持到容器网络
【发布时间】:2019-03-07 08:44:04
【问题描述】:

我对 docker 和 docker compose 还很陌生,所以如果这是一个愚蠢的问题,请原谅我......

我有一个包含 2 个容器的 compose 文件。一个暴露了 8123 端口的 homeassistant 容器和一个 5432 的数据库。 homeassistant 可以使用 url postgresql://user:password@db:5432/homeassistant_db 访问数据库。我认为这是因为 docker 在主机上创建了db 绑定,这就是我可以连接到db 的原因。

但是我需要将 homeassistant 绑定到主机,我可以使用 network_mode: "host" 来完成,你可以在我的配置中看到注释掉了。当我这样做时,我确实可以绑定到主机并且 homeassistant 可以发现网络设备等......

不幸的是,这中断了与数据库的连接,因此我无法再使用postgresql://user:password@db:5432/homeassistant_db url。

如何将 homeassistant 连接到主机并保持数据库连接正常工作?我想我可以将数据库主机从db 更改为pi 的url 或网络名称(例如postgresql://user:password@192.168.0.100:5432/homeassistant_dbpostgresql://user:password@homeassistant.local:5432/homeassistant_db),但这并不像它可能的那样干净或健壮。

我不太了解网络绑定,所以我想尝试学习,以便以后自己解决这个问题。

在下面编写文件:

version: '3'

services:

  db:
    restart: always
    container_name: "homeassistant_db_container"
    # image: postgres:latest
    image: tobi312/rpi-postgresql
    ports:
      - "5432:5432"
    volumes:
      - ./data/postgres/data:/var/lib/postgresql/data/pgdata
    env_file:
      - ./envs/database.env

  home_assistant:
    container_name: "homeassistant_container"
    restart: always
    image: homeassistant/raspberrypi3-homeassistant
    ports:
      - "8123:8123"
    # network_mode: "host"
    env_file:
      - ./envs/homeassistant.env
    volumes:
      - ./configs/homeassistant:/config
    depends_on:
      - db


volumes:
  data:
    driver_opts:
      type: none
      o: bind
      device: "${PWD}/data/postgres"

【问题讨论】:

    标签: docker docker-compose docker-networking


    【解决方案1】:

    您可以将两个容器添加到同一个网络中,如下所示。然后你可以使用你想要的方式。只需将以下代码添加到您的撰写文件中。然后它将创建一个网络并在其中添加这两个容器。这也将为您提供一个安全层,因此没有其他容器可以与您的数据库容器通信。

    其次,删除 container_name。你自己搞糊涂了。默认情况下,服务的主机名与服务名相同。

    networks:
      default:
        external:
          name: "tools"
    

    【讨论】:

    • 感谢您的帮助。这看起来像是我需要的答案。我会尝试添加网络配置。你能解释一下add both these containers there 部分吗?我不确定我在哪里添加它们或正确的语法。我知道以与添加卷相同的方式添加网络,但是我是否使用 tools 将网络 key 添加到每个容器配置中?
    • 没有。无需在单个容器中提及网络的密钥。只需在最后添加网络配置即可。还“在此处添加这两个容器”意味着它将在网络中添加这两个容器。如果您单击“已接受答案”,这也会有很大帮助
    猜你喜欢
    • 2016-11-27
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多