How to use the host network, and any other user-defined network together in Docker-Compose?

Simon Schürg picture Simon Schürg · Nov 15, 2017 · Viewed 15.1k times · Source

I want to connect two Docker containers, defined in a Docker-Compose file to each other (app and db). And one of them (app) should also be connected to the host network.

The containers should be connected to a common user-defined network (appnet or default) to use the embedded DNS capabilities from docker networking.

app needs also to be directly connected to the host network to receive ethernet broadcasts (network layer 2) in the physical network of the docker host.

If I use both directives network_mode: host and networks in compose together, I get the following error.

ERROR: 'network_mode' and 'networks' cannot be combined

So I have to do this with networks only!?

version: "3.3"

services:

  app:
    build: .
    image: app
    container_name: app
    environment:
      - MONGODB_HOST=db
    depends_on:
      - db
    networks:
      - appnet
      - hostnet

  db:
    image: mongo:latest
    container_name: db
    networks:
      - appnet

networks:
  appnet:
  hostnet:
    external:
      name: host

The foregoing compose file produces a error. ERROR: for app network-scoped alias is supported only for containers in user defined networks

If I use the network name host in the service without defining it in networks (because it already exists), it says. ERROR: Service "app" uses an undefined network "host"

How to use the host network, and any other user-defined network (or the default) together in Docker-Compose?

I'm using Docker version 17.11.0-ce-rc3, build 5b4af4f and docker-compose version 1.17.1, build 6d101fb

Answer

BMitch picture BMitch · Nov 28, 2018

TL;DR you can't. The host networking turns off the docker network namespace for that container. You can't have it both on and off at the same time.

Instead, connect to your database with a published port, or a unix socket that you can share as a volume. E.g. here's how to publish the port:

version: "3.3"

services:

  app:
    build: .
    image: app
    container_name: app
    environment:
      - MONGODB_HOST=127.0.0.1

  db:
    image: mongo:latest
    container_name: db
    ports:
      - 127.0.0.1:27017:27017