Перенос образа Docker с сохранением IP-адреса из Windows в Linux - PullRequest
0 голосов
/ 09 ноября 2019

Я очень новичок в Docker (фактически я использую его только один день), поэтому, возможно, я неправильно понимаю некоторую базовую концепцию, но сам не смог найти решение.

Вотпроблема. У меня есть серверное приложение ASP.NET Core на компьютере с Windows. Он использует MongoDB в качестве хранилища данных. Все отлично работаетЯ решил упаковать все это в контейнеры Docker и поместить его на сервер Linux (Ubuntu Server 18.04). Я упаковал mongo в контейнер, поэтому теперь его значение PUBLISHED IP: PORT равно 192.168.99.100:32772. Я жестко запрограммировал этот адрес на своем сервере ASP.NET и также упаковал его в контейнер (IP 192.168.99.100:5000). Теперь, если я запускаю свой сервер и контейнеры mongo вместе на моей машине с Windows, они работают просто отлично. Сервер подключается к контейнеру с базой данных и может делать все, что ему нужно.

Но когда я передаю оба контейнера в Ubuntu и запускаю их, сервер не может подключиться к базе данных, поскольку этот IP-адрес там недоступен. Я несколько часов гуглял, чтобы найти решение, и все же я борюсь с ним. Как правильно использовать IP-адреса? Можно ли установить IP-адрес, который будет одинаковым для контейнера, независимо от среды?

1 Ответ

1 голос
/ 09 ноября 2019

Я рекомендую использовать docker-compose для целей, которые вы описали выше.

С помощью docker-compose вы можете обращаться к базе данных через имя службы вместо IP (который потенциально недоступен в другой системе). Здесь две ссылки, чтобы начать


Обновленный ответ (10.11. 2019)

Вот конкретный пример для вашего приложения asp.net:

docker-compose.yaml

version: "3"
services:
  frontend:
    image: fqdn/aspnet:tag
    ports:
    - 8080:80
    links:
    - database
  database:
    image: mongo
    environment:
      MONGO_INITDB_DATABASE: "mydatabase"
      MONGO_INITDB_ROOT_USERNAME: "root"
      MONGO_INITDB_ROOT_PASSWORD: "example"
    volumes:
    - myMongoVolume:/data/db

volumes:
  myMongoVolume: {}

ИзКонтейнер внешнего интерфейса, вы можете получить доступ к контейнеру mongo через имя службы «база данных» (вместо IP). Из-за определения ссылки в веб-службе, веб-служба запускается после связанной службы (базы данных).

Благодаря определению тома база данных mongo будет храниться в томе, который сохраняется независимо от жизненного цикла контейнера.

Кроме того, я предполагаю, что вы хотите обратиться к приложению asp.net через IP-адрес хоста. Я не знаю порт, который вы предоставляете в своем приложении, поэтому я предполагаю порт 80 по умолчанию. Через раздел портов в веб-интерфейсе мы определяем, что порт 80 контейнера отображается как порт 8080 на IP-адресе хоста. Например, вы можете открыть свой браузер и ввести свой IP-адрес хоста и порт 8080, например, 127.0.0.1:8080 для localhost и обратиться к своему приложению.

С установленным docker-compose вы можете запустить свое приложение, которое состоит из вашего интерфейса и службы базы данных, с помощью

docker-compose up

Доступные опции команды для docker-compose можно найти здесь

Инструкции по установке для docker-compose


Обновленный ответ (10.11.2019, v2)

Из раздела комментариев

Имейте в виду, что вам нужно подключиться через имя_службы (например, база данных)и правильный порт. Для MongoDB этот порт - 27017. Это будет связано с базой данных: 27017 в вашей конфигурации внешнего интерфейса

Q: в этом случае монго также будет доступно извне?

A: Нет, поскольку служба не содержит определения портов, сама база данных не будет доступна напрямую. С точки зрения безопасности это предпочтительнее.

В: вы могли бы объяснить это

volumes:
  myMongoVolume: {}     

A: в определении сервиса для вашегослужба базы данных, мы указали том для хранения самой базы данных, чтобы сделать данные независимыми от жизненного цикла контейнера. Однако, просто определив том в разделе службы, он не будет создан. Посредством определения в разделе громкости мы создаем том myMongoVolume с настройками по умолчанию (указывается через {}). Если вы хотите настроить свой том, вы можете сделать это в разделе томов вашего docker-compose.yaml. Дополнительную информацию о томах можно найти здесь

, например, если вы хотите использовать определенный драйвер хранилища для своего тома или использовать внешнее хранилище.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...