Как использовать хост-сеть и любую другую определенную пользователем сеть в Docker-Compose?

Я хочу подключить два контейнера Docker, определенные в файле Docker-Compose друг к другу (app и db). И один из них (app) также должен быть подключен к сети host.

Контейнеры должны быть подключены к общей пользовательской сети (appnet или default), чтобы использовать возможности встроенного DNS из сетей докеров.

app также необходимо напрямую подключить к сети хоста для приема широковещательных передач Ethernet (сетевого уровня 2) в физической сети хоста докера.

Если я использую обе директивы network_mode: host и networks в компоновке вместе, я получаю следующую ошибку.

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

Поэтому я должен делать это только с помощью networks!?

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

Вышеупомянутый файл компиляции создает ошибку. ERROR: for app network-scoped alias is supported only for containers in user defined networks

Если я использую сетевое имя host в сервисе, не определяя его в сетях (поскольку оно уже существует), оно говорит. ERROR: Service "app" uses an undefined network "host"

Как использовать сеть host и любую другую пользовательскую сеть (или по умолчанию) вместе в Docker-Compose?

Я использую Docker version 17.11.0-ce-rc3, build 5b4af4f и docker-compose version 1.17.1, build 6d101fb

Ответ 1

TL; DR ты не можешь. Сеть хоста отключает пространство имен сети докера для этого контейнера. Вы не можете включать и выключать его одновременно.

Вместо этого подключитесь к своей базе данных с помощью опубликованного порта или сокета Unix, который вы можете использовать в качестве тома. Например. здесь, как опубликовать порт:

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

Ответ 2

Чтобы использовать хост-сеть, вам не нужно ее определять. Просто используйте ключевое слово "ports", чтобы определить, какой порт (порты) от сервиса вы хотите предоставить в сети хоста.