2017-02-22 8 views
2

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

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

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

путь я начал дб контейнер

докер запустить --name оракул-дб -p 1521: 1521 -p 5501: 5500 оракул/база данных: 12.1.0.2-е-е

я начал WLS контейнер в докер запустить --name оракул-WLS -p 7001: 7001 WLS-образ: последние

я могу получить доступ к БД на хосте путем подключения к SQLPLUS скотт/welcome1 @ // локальный: 1521/ORCLCDB

я могу получить доступ к wls на хосте, как http://localhost:7001/console

+0

Итак, как контейнер для контейнеров, так и контейнер db находятся на главной машине? Если да, то какую версию докера вы используете? Поскольку более старые версии докеров имели один способ сделать это, в то время как новые версии имеют другой способ. Вы также можете использовать docker-compose? Это упростит, но я не хочу давать ответ, используя метод, который вы не можете использовать. – Caperneoignis

ответ

1

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

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

https://deis.com/blog/2016/connecting-docker-containers-1/

Часть вас интересует связь между двумя контейнерами. Самый простой способ - обратиться к контейнеру БД по имени из контейнера веб-сервера.

Пример:

вы назвали дб контейнер DB1 и веб-сервер контейнер WEB0. Контейнеры должны находиться в сети моста, что означает, что веб-контейнер должен иметь возможность подключаться к контейнеру БД, ссылаясь на его имя.

Итак, если у вас есть веб-конфигурационный файл для вашего приложения, то для хоста DB вы будете использовать имя DB1.

Если вы используете старую версию докера, то вы должны использовать ссылку.

Пример:

Шаг 1:

затем при запуске веб-приложения. Использование:

Шаг 2: docker run --name web0 --link db1 webapp/webapp:3.0

и веб-приложение будет связано с БД. Однако, как я уже сказал, скоро будет удален переключатель -link.

Вместо этого я буду использовать докеры, которые построят для вас сеть. Однако; вам нужно будет загрузить 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 сочинять, так docker-compose --name setup1 down это, так что вы можете иметь более одного экземпляра веб-сервера и БД, и в этом случае, так что сборщик докеров знает, к какому экземпляру вы хотите запускать команды; и также вы можете иметь более одного запуска одновременно. Отлично подходит для CI/CD, если вы параллельно проводите тестирование на одном сервере.

Docker сочинить также имеет ту же команду, как докер так docker-compose --name setup1 exec webserver do_some_command

лучшая часть, если вы хотите изменить децибел или что-то подобное для модульного тестирования вы можете включить дополнительный файл .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

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

Я думаю, что это действительно может быть более полезной установкой в ​​вашем случае. так как вы можете установить все переменные, которые вам нужны в файлах yml, и просто запустить команду для компоновки docker, когда они вам понадобятся. Поэтому начните его и забудьте о его настройке.

ПРИМЕЧАНИЕ. Я не использовал команду -port, поскольку для контейнеров-контейнеров не требуется использование портов. Это необходимо, только если вы хотите, чтобы хост подключался к контейнеру или к приложению из-за пределов хоста. Если вы выставляете порт, порт открыт для всех сообщений, разрешенных хостом. Таким образом, просмотр веб-порта на порту 80 аналогичен запуску веб-сервера на физическом хосте и разрешению внешних подключений, если хост его разрешает. Кроме того, если вы хотите запустить больше одного веб-приложения сразу, по какой-либо причине, то выставляя порт 80, вы не сможете запускать дополнительные веб-приложения, если вы попытаетесь разоблачить этот порт. Таким образом, для CI/CD лучше всего не открывать порты, и если использование докера выполняется с помощью ключа -name, все контейнеры будут в их собственной сети, поэтому они не будут сталкиваться. Таким образом, у вас в значительной степени будет контейнер с контейнерами.

2

Вы должны получить доступ к БД через IP на хост-машине, или если вы хотите получить к нему доступ с помощью локального хоста: 1521, а затем запустить веб-сервер, как -

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

See here

+0

Как это будет работать в реальной жизни, так как ip хоста будет изменяться в зависимости от того, какие машины работают. – Vik

+1

Это справедливо только в том случае, если машина имеет статический ip или DNS, а другой - со вторым подходом. – xitter

+0

У меня, похоже, проблема с этим. моя точная команда запуска: docker run --name ora-tools-wls -it -p 7001: 7001 orawls это работает и позволяет мне получить доступ к моему серверу, запущенному на этом контейнере, как http: // localhost: 7001/console Тем не менее, доступ db от сервера требует точного ip для доступа к другому контейнеру, работающему с БД. Если я иду с docker run --name ora-tools-wls -it -p 7001: 7001 --network = "host" orawls , то сервер может получить доступ к db с localhost как ip, как вы упомянули, но доступ сервер в браузере хоста не работает. – Vik