Доступ к 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).

Открытый порт

  1. PostgreSql --->5436
  2. Пгадмин --->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 на имя контейнера.

Другие вопросы по тегам