使用 network_mode: "host" 公开一个 docker 组合容器,并保持容器到容器网络

Expose a docker composed container with network_mode: "host" and keep container to container networking

我对 docker 和 docker 撰写相当陌生,如果这是一个愚蠢的问题,请原谅我...

我有一个包含 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"

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

其次,移除container_name。你在混淆自己。默认情况下,服务的主机名等于服务名。

networks:
  default:
    external:
      name: "tools"