Как подключить контейнеры Docker?
В «Что такое контейнер?» то dockerдокументы показывают следующее изящное изображение:
Для моего сценария у меня есть только приложение A и приложение B; обозначим их Алисой и Бобом. Как вообще и в частности общаются Алиса и Боб? По принципу KISS, конкретно использую MySQLи BaseXиз docker hub.
Подразумевается, что xqueryфайл находится на хосте, который затем отправляется в BaseXконтейнер для выполнения. Это конкретный запрос SQL, поэтому MySQLнужно будет запросить результат у контейнера.
Это требует переадресации портов или других сетевых подходов? Объемы? Требует ли это дополнительное создание сообщения файл , состоящий из, в свою очередь, MySQLи BaseX?
Несомненно, есть много возможных подходов. Что наиболее прагматично с точки зрения обучения? Концептуально легкий, с постепенным обучением.
Один подход, похоже, использует мостовую сеть:
Воспользовавшись тем, что контейнеры могут видеть друг друга.
Мне кажется, это не связано с RESTполноценными веб-сервисами.
Если посмотреть на связанные вопросы, это может коснуться обратного прокси.
Ответы
Я все еще новичок в игре Docker, но у меня есть несколько небольших проектов, и я делаю именно то, о чем вы спрашиваете. Благодаря моему собственному опыту проб и ошибок (в основном ошибок ...) я бы предложил использовать docker-compose.yml с вашей сетью, настроенной на статические внутренние IP-адреса, чтобы каждый контейнер имел предсказуемые, повторяемые результаты и IP-адреса, которые вы можете настроить для своих контейнеров. общаться.
Я не знаком, BaseXно у меня есть примерная ситуация с использованием docker-compose version: "3.7"здесь, которая может легко запускать несколько приложений и / или быть добавлена или перепрофилирована в соответствии с вашей гипотетической.
В этом примере docker-compose есть следующее:
Отдельный контейнер для заполнения моего
app-volumeтома содержимым публичного репозитория GitHub.Контейнер веб-сервера Apache с включенным PHP-FPM для «выборочного бэкэнда», который создается из файла Docker в каталоге ~ / dockerbuild.
Контейнер веб-сервера nginx, используемый в качестве обратного прокси-сервера для передачи всего PHP в Apache (но обслуживает и кеширует почти все остальное).
Контейнер MariaDB в смеси для БД приложения, который я заполняю файлом mysqldump после сборки приложения.
Это уменьшенная версия моего docker-compose.yml, поэтому обратите внимание, что вы можете добавить множество вещей, таких как healthcheck:и command:в соответствии с вашими потребностями.
Вы выполняете with docker-compose up -d --buildкак для сборки, так и для запуска приложения в одной команде (но вы, вероятно, захотите создать свой собственный файл ba (.sh), который вы будете выполнять впоследствии, также для этих важных штрихов).
Обратите внимание на static-network. И хотя в этом примере я использую именованные тома, это просто мое предпочтение.
version: "3.7"
services:
github_repo_clone:
image: debian:latest
container_name: github_repo_clone
networks:
static-network:
ipv4_address: 172.20.0.254
command: bash -c "
apt-get update &&
apt-get install git -y &&
rm -rf examplerepo &&
git clone https://github.com/exampleuser/examplerepo.git &&
rm -rf /var/www/vhosts/exampleuser/examplerepo &&
mkdir -p /var/www/vhosts/exampleuser/examplerepo &&
cp -rapv examplerepo/* /var/www/vhosts/exampleuser/examplerepo &&
rm -rf examplerepo &&
tail -f /dev/null
"
volumes:
- app-volume:/var/www/vhosts
apache_php-fpm_backend:
container_name: debian-build-demo0
build: ~/dockerbuild
ports:
- "8080:8080"
networks:
static-network:
ipv4_address: 172.20.0.2
volumes:
- app-volume:/var/www/vhosts
nginx_rp:
image: nginx:latest
container_name: nginx-build-demo0
ports:
- "80:80"
- "443:443"
networks:
static-network:
ipv4_address: 172.20.0.3
volumes:
- app-volume:/var/www/vhosts
mariadb:
restart: always
image: mariadb:latest
container_name: mariadb-build-demo0
ports:
- "3306:3306"
networks:
static-network:
ipv4_address: 172.20.0.10
environment:
- MYSQL_ROOT_PASSWORD=4007p@$$w04d - MYSQL_USER=dbusernamegoeshere - MYSQL_PASSWORD=@p@$$w04d
- MYSQL_DATABASE=dbnamegoeshere
volumes:
- app-volume:/var/www/vhosts
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 10s
retries: 5
volumes:
app-volume:
# external: true
networks:
static-network:
driver: bridge
ipam:
driver: default
config:
- subnet: 172.20.0.0/16
Моя команда очистки, когда я отключаю приложение, выглядит некрасиво, но ее не так сложно читать, и она выглядит примерно так: docker-compose down -v ; docker rmi -f dockerbuild_apache_php-fpm_backend:latest mariadb:latest nginx:latest debian:latest ; docker rmi -f $(docker images -q --filter "dangling=true") ; docker rmi -f $(docker images -q --filter label=stage=intermediate) ; docker volume prune -f;
Я думаю, что каждое «независимое приложение» может (и, вероятно, должно) иметь свои собственные файлы docker-compose и / или Dockerfiles, но вы можете найти синергию с некоторыми файлами Docker, для которых вы можете создавать собственные command:инструкции (например, пример git_repo_clone), которые будут использоваться и общий для нескольких «приложений».