Доступ к Docker-контейнеру из другого другого контейнера
Я создал два док-контейнера на основе двух разных изображений. один из БД и другой для веб-сервера. оба контейнера работают на моем Mac OSX.
я могу получить доступ к контейнеру БД с хост-машины и таким же образом могу получить доступ к веб-серверу с хост-машины.
Тем не менее, как я могу получить доступ к соединению БД с веб-сервера?
как я начал БД контейнер
docker run --name oracle-db -p 1521:1521 -p 5501:5500 oracle/database:12.1.0.2-ee
Я начал WLS контейнер как
docker run --name oracle-wls -p 7001:7001 wls-image:latest
Я могу получить доступ к БД на хосте, подключившись к
sqlplus scott/welcome1@//localhost:1521/ORCLCDB
Я могу получить доступ к WLS на хосте как
http://localhost:7001/console
8 ответов
Самый простой способ - использовать --link, однако новые версии docker отходят от этого, и на самом деле этот переключатель скоро будет удален.
Ссылка ниже предлагает хороший способ соединения двух контейнеров. Вы можете пропустить часть прикрепления, так как это просто полезно при добавлении элементов к изображениям.
https://deis.com/blog/2016/connecting-docker-containers-1/
Интересующая вас часть - это связь между двумя контейнерами. Самый простой способ - обратиться к контейнеру БД по имени из контейнера веб-сервера.
Пример:
Вы назвали контейнер db DB1 и контейнер веб-сервера WEB0. Оба контейнера должны находиться в мостовой сети, что означает, что веб-контейнер должен иметь возможность подключаться к контейнеру БД, ссылаясь на его имя.
Так что если у вас есть файл веб-конфигурации для вашего приложения, то для хоста БД вы будете использовать имя DB1.
Если вы используете более старую версию Docker, вам следует использовать --link.
Пример:
Шаг 1: docker run --name db1 oracle/database:12.1.0.2-ee
затем при запуске веб-приложения. использовать:
Шаг 2: docker run --name web0 --link db1 webapp/webapp:3.0
и веб-приложение будет связано с БД. Однако, как я уже сказал, ключ --link скоро будет удален.
Вместо этого я бы использовал docker compose, который создаст для вас сеть. Тем не мение; вам нужно будет загрузить docker compose для вашей системы. https://docs.docker.com/compose/install/
и пример настройки выглядит так:
имя файла base.yml
version: "2"
services:
webserver:
image: "moodlehq/moodle-php-apache:7.1
depends_on:
- db
volumes:
- "/var/www/html:/var/www/html"
- "/home/some_user/web/apache2_faildumps.conf:/etc/apache2/conf-enabled/apache2_faildumps.conf"
environment:
MOODLE_DOCKER_DBTYPE: pgsql
MOODLE_DOCKER_DBNAME: moodle
MOODLE_DOCKER_DBUSER: moodle
MOODLE_DOCKER_DBPASS: "m@0dl3ing"
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
db:
image: postgres:9
environment:
POSTGRES_USER: moodle
POSTGRES_PASSWORD: "m@0dl3ing"
POSTGRES_DB: moodle
HTTP_PROXY: "${HTTP_PROXY}"
HTTPS_PROXY: "${HTTPS_PROXY}"
NO_PROXY: "${NO_PROXY}"
это будет называть сеть общим именем, я не могу вспомнить, как это имя, если вы не используете ключ --name.
IE docker-compose --name setup1 up base.yml
ПРИМЕЧАНИЕ: если вы используете ключ --name, он вам понадобится при вызове docker compose, поэтому docker-compose --name setup1 down
это значит, что вы можете иметь более одного экземпляра веб-сервера и базы данных, и в этом случае docker compose знает, с каким экземпляром вы хотите запускать команды; а также, чтобы вы могли иметь более одного работающего одновременно. Отлично подходит для CI/CD, если вы выполняете тестирование параллельно на одном сервере.
Docker compose также имеет те же команды, что и docker, поэтому docker-compose --name setup1 exec webserver do_some_command
Самое приятное то, что если вы хотите изменить db или что-то подобное для модульного теста, вы можете включить в команду up дополнительный файл.yml, и он будет перезаписывать любые элементы с похожими именами, я думаю, что это замена ключа => значения,
пример:
db.yml
version: "2"
services:
webserver:
environment:
MOODLE_DOCKER_DBTYPE: oci
MOODLE_DOCKER_DBNAME: XE
db:
image: moodlehq/moodle-db-oracle
Тогда позвони docker-compose --name setup1 up base.yml db.yml
Это перезапишет БД. с другой настройкой. Когда необходимо подключиться к этим службам из каждого контейнера, вы используете имя, установленное в разделе service, в данном случае webserver и db.
Я думаю, что это может быть более полезной настройкой в вашем случае. поскольку вы можете установить все необходимые переменные в файлах yml и просто запустить команду docker compose, когда они вам понадобятся. Так что начните еще и забудьте об этом.
ПРИМЕЧАНИЕ: я не использовал --port
команда, так как раскрытие портов не требуется для связи контейнер-> контейнер. Это необходимо, только если вы хотите, чтобы хост подключался к контейнеру или приложению извне хоста. Если вы выставите порт, то порт будет открыт для всех соединений, которые разрешает хост. Таким образом, доступ к сети через порт 80 аналогичен запуску веб-сервера на физическом хосте и разрешает внешние подключения, если хост позволяет это. Кроме того, если по какой-либо причине вы хотите запустить более одного веб-приложения одновременно, то доступ к порту 80 не позволит вам запускать дополнительные веб-приложения, если вы попытаетесь также использовать этот порт. Таким образом, для CI / CD лучше вообще не открывать порты, и, если использовать docker для компоновки с ключом --name, все контейнеры будут находиться в собственной сети, поэтому они не будут конфликтовать. Таким образом, у вас будет контейнер с контейнерами.
Это просто. Если у вас два или более запущенных контейнера, выполните следующие действия:
docker network create myNetwork
docker network connect myNetwork web1
docker network connect myNetwork web2
Теперь вы подключаетесь из контейнера web1 к контейнеру web2 или наоборот.
Используйте внутренние сетевые IP-адреса, которые вы можете найти, запустив:
docker network inspect myNetwork
Обратите внимание, что контейнерам, подключенным через сетевой мост, доступны только внутренние IP-адреса и порты.
Так, например, предположим, что контейнер web1 был запущен с: docker run -p 80:8888 web1
(это означает, что его сервер работает на внутреннем порту 8888) и проверяет myNetwork
показывает, что IP-адрес web1 - 172.0.0.2, вы можете подключиться с web2 к web1, используя curl 172.0.0.2:8888
).
Вам нужно будет получить доступ к БД через ip хост-машины или, если вы хотите получить к нему доступ через localhost:1521, то запустите веб-сервер, как -
docker run --net=host --name oracle-wls wls-image:latest
С помощью docker-compose
, по умолчанию службы открываются друг другу по имени. Документы.
Вы также можете указать псевдоним, например:
version: '2.1'
services:
mongo:
image: mongo:3.2.11
redis:
image: redis:3.2.10
api:
image: some-image
depends_on:
- mongo
- solr
links:
- "mongo:mongo.openconceptlab.org"
- "solr:solr.openconceptlab.org"
- "some-service:some-alias"
А затем получите доступ к службе, используя указанный псевдоним в качестве имени хоста, например mongo.openconceptlab.org
за mongo
в этом случае.
Среда: Windows 10, Docker Desktop версии 4.5.1.
Используйте имя хоста для доступа к службам, работающим на вашем хост-компьютере, из контейнера.
См.: https://docs.docker.com/desktop/windows/networking/#use-cases-and-workarounds .
Я запускаю PostgreSQL в одном контейнере и свое приложение в отдельном контейнере. Я настраиваю подключение к базе данных приложения для использования
host.docker.internal
как имя хоста, и это просто работает.
Рассмотрим пример. Здесь мы создаем два контейнера : сервер PostgreSQL и pgadmin (для доступа к таким серверам, как PHPMyAdmin, SQL studio, workbench).
Открытый порт
- PostgreSql --->5436
- Пгадмин --->5050
После добавления сервера в имя хоста pgadmin как localhost будет отображаться ошибка подключения. Поскольку контейнер pgadmin контейнера Docker получает локальный хост в качестве своей системы, вместо этого нам нужен IP-адрес PostgreSQL для решения проблемы.
docker network create con
docker network connect con app1
docker network connect con app2
Эта команда получает IP-адрес подключенного контейнера и другие сведения.
docker network inspect con
Теперь вы можете увидеть IP-адрес, показанный в проверке сети. Выберите IP-адрес контейнера Postgres. Вы можете получить доступ к другим открытым портам через этот IP-адрес. Здесь открыт только postgre 5432. Теперь установите имя хоста в качестве IP-адреса контейнера, и он будет работать.
Вы можете использовать сеть докеров по умолчанию. Если вы не хотите подключаться к сети докеров, вы можете сделать это:
Скопируйте IP-адрес в подсети Docker в разделе Ресурсы> Сеть в настройках Docker на Mac:снимок экрана настроек Docker
Как видно из ссылки на скриншоте, IP-адрес
192.168.65.0
Вам просто нужно заменить «localhost» в файле конфигурации контейнера на «192.168.65.1» (т.е. выбранный IP-адрес + 1).
Вы можете запускать свои контейнеры и должны быть настроены для локальной разработки / тестирования.
Более подробную информацию вы можете найти в моей статье:Простое подключение контейнеров Docker.
В моем случае подключение хоста в приложении к контейнеру из другого контейнера по IP-адресу, предоставленному мостом, не сработало.
Но это работает с именем контейнера (см. мой скриншот).
Таким образом, вы можете заменить IP на имя контейнера.