Доступ к контейнеру докера из другого другого контейнера

я создал два контейнера докеров на основе двух разных изображений. один из db и другой для веб-сервера. оба контейнера работают на моем mac osx.

Я могу получить доступ к контейнеру db с хост-машины, и таким же образом можно получить доступ к веб-серверу с главной машины.

однако, как мне получить доступ к соединению db с веб-сервера?

способ запуска контейнера db

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

Я могу получить доступ к db на хосте, подключившись к

sqlplus scott/[email protected]//localhost:1521/ORCLCDB

Я могу получить доступ к wls на хосте в качестве

http://localhost:7001/console

Ответ 1

Самый простой способ - использовать --link, однако более новые версии докера уходят от этого, и фактически этот коммутатор будет вскоре удален.

Ссылка ниже предлагает также как подключить два контейнера. Вы можете пропустить часть прикрепления, так как это просто полезно при добавлении элементов к изображениям.

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/#prerequisites

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

имя файла 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: "[email protected]"
      HTTP_PROXY: "${HTTP_PROXY}"
      HTTPS_PROXY: "${HTTPS_PROXY}"
      NO_PROXY: "${NO_PROXY}"
  db:
    image: postgres:9
    environment:
      POSTGRES_USER: moodle
      POSTGRES_PASSWORD: "[email protected]"
      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 или что-то подобное для модульного теста, вы можете включить дополнительный файл .yml в команду up, и он будет перезаписывать любые элементы с похожими именами, я думаю, что это замена ключа => значения.

Пример:

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, поскольку предоставление портов не требуется для container-> связи с контейнером. Это необходимо только в том случае, если вы хотите, чтобы хост подключался к контейнеру или приложению извне хоста. Если вы выставите порт, то порт будет открыт для всех соединений, которые разрешает хост. Таким образом, доступ к сети через порт 80 аналогичен запуску веб-сервера на физическом хосте и разрешает внешние подключения, если хост позволяет это. Кроме того, если по какой-либо причине вы хотите запустить более одного веб-приложения одновременно, то доступ к порту 80 не позволит вам запускать дополнительные веб-приложения, если вы попытаетесь также использовать этот порт. Таким образом, для CI/CD лучше вообще не открывать порты, и при использовании docker compose с переключателем --name все контейнеры будут находиться в собственной сети, поэтому они не будут конфликтовать. Таким образом, у вас будет контейнер с контейнерами.

ОБНОВЛЕНИЕ: после дальнейшего использования функций и просмотра того, как другие сделали это для программ CICD, таких как Jenkins. Сеть также является жизнеспособным решением.

Пример:

docker network create test_network

Приведенная выше команда создаст "сеть_тестов", к которой вы можете присоединить и другие контейнеры Это легко сделать с помощью оператора переключения --network.

Пример:

docker run \
    --detach \
    --name DB1 \
    --network test_network \
    -e MYSQL_ROOT_PASSWORD="${DBPASS}" \
    -e MYSQL_DATABASE="${DBNAME}" \
    -e MYSQL_USER="${DBUSER}" \
    -e MYSQL_PASSWORD="${DBPASS}" \
    --tmpfs /var/lib/mysql:rw \
    mysql:5

Конечно, если у вас есть настройки прокси-сети, вы все равно должны передавать их в контейнеры с помощью операторов переключателя "-e" или "- -e nv-file". Таким образом, контейнер может общаться с Интернетом. Докер говорит, что настройки прокси должны быть поглощены контейнером в более новых версиях докера; однако, я все еще передаю их как привычку. Это замена выключателя "--link", который уходит. После того, как контейнеры подключены к созданной вами сети, вы можете ссылаться на эти контейнеры из других контейнеров, используя "имя" контейнера. В приведенном выше примере это будет DB1. Вам просто нужно убедиться, что все контейнеры подключены к одной сети, и вы готовы к работе.

Подробный пример использования сети в конвейере cicd вы можете найти по этой ссылке:   https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh

Это сценарий, который запускается в Jenkins для огромных интеграционных тестов для Moodle, но идею/пример можно использовать где угодно. Я надеюсь, что это помогает другим.

Ответ 2

Вам нужно будет получить доступ к db через ip хост-компьютера, или если вы хотите получить к нему доступ через localhost: 1521, затем запустите веб-сервер, например -

docker run --net=host --name oracle-wls wls-image:latest

Смотрите здесь

Ответ 3

Используя docker-compose, сервисы по умолчанию выставляются друг другу по имени. Docs.
Вы также можете указать псевдоним как;

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 в этом случае.