使用network_mode:“主机”公开由docker组成的容器,并使容器与容器联网

时间:2019-03-07 08:44:05

标签: docker docker-compose docker-networking

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

我有一个包含2个容器的撰写文件。具有端口8123的本地助手容器和具有5432的数据库。本地助手可以使用URL postgresql://user:password@db:5432/homeassistant_db访问数据库。我认为这是因为docker在主机上创建了db绑定,这就是为什么我可以连接到db的原因。

但是我需要将homeassistant绑定到主机,我可以使用network_mode: "host"来完成,您可以在配置中看到注释。当我这样做时,我确实可以绑定到主机,而homeassantant可以做到这一点,即发现网络设备等...

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

如何将homeassant附加到主机并保持数据库连接正常工作?我想我可以将数据库主机从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"

1 个答案:

答案 0 :(得分:1)

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

第二,删除container_name。你在混乱自己。服务的默认主机名等于服务名。

networks:
  default:
    external:
      name: "tools"