Docker: запутался в нескольких контейнерах
Я хотел бы иметь возможность реплицировать среду разработки на нескольких компьютерах. Я думал, что Docker может быть хорошим инструментом для этого, но я застрял.
У меня есть приложение, которое использует:
- Apache с некоторыми расширениями
- PHP FPM
- MySQL
- Composer
- компас (для перекомпиляции файлов SASS)
- Grunt & Bower
все файлы должны оставаться на хост-компьютере и быть предоставляются услуги.
поэтому я создал Dockerfile, который настраивает и запускает Apache. Отлично!
к сожалению, я просто не могу понять, как действовать дальше.
Как настроить PHP FPM, MySQL и Compass? Я понимаю, что я должен выполнить каждый из этих процессов в отдельном контейнере, и связать их вместе (в отличие от запуска нескольких служб в одном контейнере).
инстинктивно, я бы создал несколько Dockerfiles, для каждого сервиса, а потом начать с докер-сочинять. Но, похоже, это не тот путь, и я не мог понять, что такое правильная идея.
Я нашел много пользовательских образов, но я бы предпочел создать лично каждый контейнер с моей собственной конфигурацией. Такое возможно?
или мне лучше просто подготовить и запустить полную виртуальную машину, в Vagrant или непосредственно на VirtualBox??
спасибо!
2 ответов
Docker Compose всегда был отличным инструментом в таком сценарии, где у вас есть небольшие микрослужбы вместо одного большого монолитного приложения, сброшенного в один образ Docker. Если вы не хотите иметь большое количество Dockerfile, вы всегда можете создать свой собственный образ Docker с необходимой упаковкой, чтобы сделать его простым.
пример: вместо того, чтобы вытаскивать официальный образ Ubuntu Docker, вы можете создать свой собственный образ Ubuntu Docker с необходимой упаковкой. Это уменьшит ваше путаница вокруг наличия большого количества Dockerfile. Но имейте в виду, что это будет нести накладные расходы на создание нового образа Docker каждый раз, когда вы хотите внести какие-либо изменения и что-то, что не рекомендуется для среды разработки.
вот фрагмент docker-compose.yml файл из этой ссылка, которая очень проста для понимания, не содержит отдельного файла Dockerfile и может быть легко настроена на основе вашего требования:
version: '3'
services:
web:
image: nginx
volumes:
- "./etc/nginx/default.conf:/etc/nginx/conf.d/default.conf"
- "./etc/ssl:/etc/ssl"
- "./web:/var/www/html"
- "./etc/nginx/default.template.conf:/etc/nginx/conf.d/default.template"
ports:
- "8000:80"
- "3000:443"
environment:
- NGINX_HOST=${NGINX_HOST}
command: /bin/bash -c "envsubst '$$NGINX_HOST' < /etc/nginx/conf.d/default.template > /etc/nginx/conf.d/default.conf && nginx -g 'daemon off;'"
restart: always
depends_on:
- php
- mysqldb
php:
image: nanoninja/php-fpm
restart: always
volumes:
- "./etc/php/php.ini:/usr/local/etc/php/conf.d/php.ini"
- "./web:/var/www/html"
composer:
image: "composer"
volumes:
- "./web/app:/app"
command: install
myadmin:
image: phpmyadmin/phpmyadmin
container_name: phpmyadmin
ports:
- "8080:80"
environment:
- PMA_ARBITRARY=1
- PMA_HOST=${MYSQL_HOST}
restart: always
depends_on:
- mysqldb
mysqldb:
image: mysql
container_name: ${MYSQL_HOST}
restart: always
env_file:
- ".env"
environment:
- MYSQL_DATABASE=${MYSQL_DATABASE}
- MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
- MYSQL_USER=${MYSQL_USER}
- MYSQL_PASSWORD=${MYSQL_PASSWORD}
ports:
- "8989:3306"
volumes:
- "./data/db/mysql:/var/lib/mysql"
вы определенно на правильном пути. Docker-compose это то, что вы хотите.
каждая "служба" будет либо образом Docker, либо локальным файлом Dockerfile, который будет построен. Вы можете указать различные пути к файлам и имена файлов в файле compose, чтобы сделать вещи проще. Затем используйте ссылки Docker, чтобы связать все контейнеры вместе.
Другие вопросы docker