Simon Schürg
Simon Schürg

Reputation: 2263

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

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?

Upvotes: 61

Views: 52586

Answers (3)

BMitch
BMitch

Reputation: 263696

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
    environment:
      - MONGODB_HOST=db

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

Upvotes: 19

yerlilbilgin
yerlilbilgin

Reputation: 3409

Since Docker 18.03+ one can use host.docker.internal to access your host from within your containers. No need to add host network or mix it with the user defined networks.

Source: Docker Tip #65: Get Your Docker Host's IP Address from in a Container

Upvotes: 2

Miq
Miq

Reputation: 4279

To use host network, you don't need to define it. Just use "ports" keyword to define, which port(s) from service you want to expose in host network.

Upvotes: 0

Related Questions