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

24,274

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
Share:
24,274
Simon Schürg
Author by

Simon Schürg

Computer science student at Karlsruhe Institute of Technology (KIT) Germany.

Updated on July 09, 2022

Comments

  • Simon Schürg
    Simon Schürg almost 2 years

    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.

    Using both directives network_mode: host and networks in compose together, results in the following error:

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

    Specifying the network name host in the service without defining it in networks (because it already exists), results in:

    ERROR: Service "app" uses an undefined network "host"

    Next try: define both networks explicitly and do not use the network_mode: host attribute at service level.

    version: '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: null
      hostnet:
        external:
          name: host
    

    The foregoing compose file produces an error:

    ERROR: for app network-scoped alias is supported only for containers in user defined networks

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

  • Simon Schürg
    Simon Schürg about 6 years
    app needs OSI layer 2 access to the host network. I am not asking for UDP/TCP port bindings.
  • Miq
    Miq about 6 years
    Sorry, my bad. I did reproduce it on latest docker for windows - same issue. very similar issue is on moby github - github.com/moby/moby/issues/32957 - seems that this is a part of a bigger problem
  • Simon Schürg
    Simon Schürg about 6 years
    Yes, I think the only way to use a multi container app with docker compose and host-networking is, to use host-network for all containers in the compose file. At least with the current version of Docker Compose of January 2018.
  • Chris Cook
    Chris Cook over 4 years
    Only on Windows and macOS, on Linux this is currently depending on github.com/docker/for-linux/issues/264
  • Kingdon
    Kingdon about 4 years
    This is a fantastic answer, and majorly overlooked. Published port gives the best of both worlds, with observability on localhost as well as private networking where the container services can resolve each other by container name. Unfortunate reality is that you can't route packets into Docker for Mac from the host OS, but you can use published port to connect the containers to each other and the host OS.
  • tymik
    tymik over 3 years
    this answer helped me in a way that I removed the bridge network from container that had to use it, used ports directive for this container with internal networks related to other containers and also used expose for those other containers - it works like a charm
  • Thomas
    Thomas over 2 years
    This is now implemented for Linux as well.
  • Martin
    Martin about 2 years
    This answer saved me. I'm using Docker Swarm so used this answer to do something similar. The container I put on the host network, I also added extra_hosts: 0.0.0.0:portNumber:PortNumber