Подключите приложение к базе данных, когда они находятся в отдельных контейнерах докеров - PullRequest
0 голосов
/ 01 октября 2019

Ну, настройка проста, должно быть два контейнера: один для базы данных mysql, а другой для веб-приложения.

Что я делаю для запуска контейнеров, первый для базы данных и второй для приложения:

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -p 3306:3306 -d mysql

docker run -p 8081:8081 myrepo/myapp

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

Одним из найденных решений было добавить одну и ту же сеть для контейнеров, используя --net и команды docker происходят следующим образом:

docker network create my-network

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -p 3306:3306 -d --net my-network mysql

docker run --net my-network -p 8081:8081 myrepo/myapp

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

Ответы [ 2 ]

0 голосов
/ 01 октября 2019

Что ж, после дополнительных исследований мне удалось подключиться к базе данных.

Я использовал следующий подход: На своем хосте я получил IP-адрес самого докерано не конкретный контейнер: sudo ip addr show | grep docker0

IP-адрес docker0, который я добавил к URL-адресу подключения к базе данных внутри моего приложения, и, таким образом, приложению удалось подключиться к базе данных (примечание: с этимflow Я не добавляю ключевое слово --net при запуске контейнера)

Что действительно странно, так это то, что даже добавление общей сети, такой как --net=my-nework, для обоих контейнеров не работает. Более того, я попытался использовать --net=host, чтобы разделить сеть хоста с сетью контейнера, но это было неудачно. Если есть кто-нибудь, кто может объяснить, почему это не сработало, пожалуйста, поделитесь своими знаниями.

0 голосов
/ 01 октября 2019

Вы можете использовать имя контейнера (то есть mysql-container) для подключения к mysql. Пример:

Запустите контейнер mysql:

docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=root -e MYSQL_DATABASE=db -p 3306:3306 -d --net my-network mysql

Подключитесь из другого контейнера с помощью клиента mysql:

docker run --net my-network -it mysql mysql -u root -p db -h mysql-container

В вашем приложении вы должны заменить вURL базы данных, независимо от того, какой у вас IP с mysql-container.

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