Альтернатива Docker для --network host в macOS и Windows

У меня есть два докер-контейнера:

  • база данных
  • приложение, которое потребляет базу данных

Я запускаю свой контейнер базы данных следующим образом:

docker run --name my-db -p 127.0.0.1:3306:3306 my-db-image

И мой контейнер приложения вроде этого:

docker run --name my-app --network host -it my-app-image

Это отлично работает в Linux. Я могу получить доступ к БД как из хост-системы, так и из контейнера приложения. Идеально.

Однако --network host не работает на Mac и Windows:

Сетевой драйвер хоста работает только на хостах Linux и не поддерживается в Docker для Mac, Docker для Windows или Docker EE для Windows Server.

(источник: https://docs.docker.com/network/host/)

Я все еще могу получить доступ к базе данных через 127.0.0.1:3306 с основного хоста, но не могу получить к ней доступ из контейнера приложения.

Как я могу решить эту проблему? Как я могу позволить контейнеру приложения подключиться к базе данных (и продолжить доступ к базе данных с основного хоста с помощью 127.0.0.1:3306)?

Я пробовал использовать host.docker.internal и gateway.docker.internal, но это не работает.

Я также пытался запустить оба контейнера с помощью --network my-network после создания my-network с docker network create my-network, но это не сработало.

Не могу понять, как решить эту проблему.


person Francesco Borzi    schedule 13.01.2019    source источник
comment
В Windows я думал, что вашим контейнерам докеров будут назначены IP-адреса (например, 192.168.99.100?), Которые вы затем будете использовать для подключения с хоста к контейнеру или, я думаю, между контейнерами ...   -  person moilejter    schedule 13.01.2019
comment
Ваш параметр docker network create my-network должен работать, пока вы обращаетесь к контейнеру db по имени из контейнера приложения (my-db:3306).   -  person Paul    schedule 13.01.2019
comment
не работает, скорее всего моему приложению нужен реальный адрес для работы   -  person Francesco Borzi    schedule 13.01.2019
comment
По какой причине вы не используете docker-compose? Особенно, если эти сервисы всегда будут работать вместе. Это позволяет в одном файле запускать обе службы и создавать сеть, соединяющую их.   -  person Brian Wagner    schedule 13.01.2019
comment
@BrianWagner без особой причины. Я впервые работаю с докером, может быть, вы можете предложить файл docker compse, который соответствует моим потребностям?   -  person Francesco Borzi    schedule 13.01.2019
comment
Вы можете найти это ответ, который я написал вчера, чтобы иметь несколько полезных указателей, особенно если вы используете сеть хоста только для того, чтобы контейнер приложения мог взаимодействовать с контейнером базы данных.   -  person David Maze    schedule 13.01.2019
comment
Франческо, не могли бы вы предоставить дополнительную информацию о том, как приложение обращается к БД? (Я не знаком с параметром --network host в Linux; и, думаю, я бы избегал его, если он настолько ограничен ОС.) Возможно, вам придется вручную открыть порты. Или вам может потребоваться изменить адрес, который приложение использует для вызова my-network, а не 127.0.0.1 или localhost.   -  person Brian Wagner    schedule 13.01.2019
comment
@BrianWagner На самом деле я решил свою исходную проблему, используя пользовательские сети, изначально они не работали, потому что порты были другими, чем те, которые я использовал, когда имел --network host. Так что я приму твой ответ, так как это правильное решение в общем случае.   -  person Francesco Borzi    schedule 13.01.2019
comment
Франческо, я рад редактировать ответ ниже, в частности файл создания, если он обеспечивает большую ясность. Сообщите мне, если нужно что-то изменить или добавить.   -  person Brian Wagner    schedule 13.01.2019


Ответы (1)


Для нескольких служб часто бывает проще создать файл docker-compose.yml, который будет запускать все службы и любые сети, необходимые для их подключения.

version: '3'
services:
  my-db:
    image: my-db-image
    ports:
      - "3306:3306"
    networks:
      - mynetwork

  my-app:
    image: my-app-image
    ports:
      - "8000:80"
    networks:
      - mynetwork

networks:
  mynetwork:

Из папки проекта вы запускаете docker-compose up или docker-compose up -d, чтобы службы работали в фоновом режиме.

В этом сценарии магия Docker подготавливает сеть с именем хоста mynetwork. Он должен предоставлять порты по умолчанию другим службам в этой сети. Если вы хотите переназначить порты, используйте шаблон target: source.

Я не знаю, нужна ли вам здесь конфигурация портов. Но я пытаюсь сопоставить вашу конфигурацию с файлом набора. Также я предполагаю, что вам нужно открыть приложение на каком-то порту; используя 8000, поскольку это довольно обычная установка.

Какие здесь параметры? Справочник по созданию Docker

person Brian Wagner    schedule 13.01.2019
comment
спасибо, это действительно выглядит хорошей альтернативой, чем запускать контейнеры один за другим. Однако с точки зрения сети, разве это не эквивалентно использованию --network mynetwork? Или он как-то делает что-то большее? Потому что сначала мне нужно решить проблему с подключением. - person Francesco Borzi; 13.01.2019