Search code examples
dockerdocker-composedocker-network

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


I'm fairly new to docker and docker compose, so forgive me if this is a stupid question...

I have a compose file with 2 containers. A homeassistant container with port 8123 exposed and a database with 5432. The homeassistant can access the database using the url postgresql://user:password@db:5432/homeassistant_db. I think that this is because docker has created a db binding on the host and that's why I can connect to db.

However I need to bind the homeassistant to the host, which I can do with network_mode: "host" which you can see commented out in my config. When I do this I can indeed bind to the host and homeassistant can do it's discovery of network devices etc...

Unfortunately this breaks the connection with the database so that I can't use the postgresql://user:password@db:5432/homeassistant_db url any longer.

How do I attach homeassistant to the host AND keep the database connection working? I guess I could change the database host from db to the pi's url or network name (eg. postgresql://user:password@192.168.0.100:5432/homeassistant_db or postgresql://user:password@homeassistant.local:5432/homeassistant_db) but this doesn't feel as clean or as robust as it could be.

I don't really understand the network bindings so I wan to try and learn so I can fix this myself going forward.

compose file below:

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"

Solution

  • You can add both the containers in the same network as shown below. Then you could use the way you want to. Just add below code to your compose file. Then it will create a network and add both these containers there. This will also give you a security layer, so that no other containers can talk to your db container.

    Second, remove container_name. You are confusing yourself. Services get their host names equal to service names by default.

    networks:
      default:
        external:
          name: "tools"