Ответ 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, но идею/пример можно использовать где угодно. Я надеюсь, что это помогает другим.