Найпростіший спосіб - використовувати --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/#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: "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
це так, щоб ви могли мати більше одного екземпляра веб-сервера та db, і в цьому випадку docker compose знає, який екземпляр ви хочете запускати команди проти; а також, щоб ви могли одночасно запускати більше одного. Чудово підходить для CI / CD, якщо ви паралельно запускаєте тест на одному сервері.
Docker compose також має ті самі команди, що і docker so 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
Це перезапише db. з іншим налаштуванням. Коли потрібно підключатись до цих служб з кожного контейнера, ви використовуєте ім’я, встановлене під службою, в даному випадку веб-сервер та db.
Я думаю, що це може бути більш корисним налаштуванням у вашому випадку. Оскільки ви можете встановити всі необхідні змінні у файлах yml і просто запустити команду для docker compose, коли вони вам потрібні. Тож більше запускайте це і забудьте про налаштування.
ПРИМІТКА: Я не використовував --port
команда, оскільки оголення портів не потрібне для зв'язку контейнер-> контейнер. Це потрібно лише в тому випадку, якщо ви хочете, щоб хост підключився до контейнера або програми поза хостом. Якщо ви виставите порт, порт буде відкритий для всіх зв’язків, дозволених хостом. Отже, оголення веб-сторінок через порт 80 - це те саме, що запуск веб-сервера на фізичному хості і дозволить зовнішні підключення, якщо хост це дозволяє. Крім того, якщо ви хочете запустити більше однієї веб-програми з будь-якої причини, тоді викриття порту 80 завадить вам запустити додаткові веб-додатки, якщо ви спробуєте експонувати на цьому порту. Отже, для CI / CD найкраще взагалі не виставляти порти, і якщо ви використовуєте docker compose з перемикачем --name, всі контейнери будуть у своїй мережі, тому вони не зіткнуться. Таким чином, ви майже отримаєте контейнер з контейнерами.
ОНОВЛЕННЯ: Після подальшого використання функцій та перегляду того, як це робили інші для програм CICD, таких як Дженкінс. Мережа також є життєздатним рішенням.
Приклад:
docker network create test_network
Вищенаведена команда створить "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" або "--env-file". Таким чином контейнер може спілкуватися з Інтернетом. Docker каже, що налаштування проксі повинні бути поглинені контейнером у нових версіях docker; однак, я все ще передаю їх як звичку. Це заміна комутатора "--link", який відключається. Після того, як контейнери приєднані до створеної вами мережі, ви все ще можете посилатися на ці контейнери з інших контейнерів, використовуючи "ім'я" контейнера. За наведеним вище прикладом це було б db1
. Вам просто потрібно переконатися, що всі контейнери підключені до однієї мережі, і ви готові до роботи.
Детальний приклад використання мережі в конвеєрі cicd можна знайти за цим посиланням:
https://git.in.moodle.com/integration/nightlyscripts/blob/master/runner/master/run.sh
Це сценарій, який запускається в Jenkins для величезних тестів інтеграції Moodle, але ідею / приклад можна використовувати де завгодно. Сподіваюся, це допомагає іншим.