Как использовать docker-compose yml файл для производства?
У меня есть приложение Docker на моем локальном хосте, который работает нормально. Я использую PHP, Nginx и Mariadb.
Это шаблон докера, который я использую: https://github.com/matchish/skeleton
Вышеуказанный репо имеет только один docker-compose.yml
файл, который содержит этот код:
version: '3'
services:
db:
build:
context: ./mariadb
volumes:
- "./.data/db:/var/lib/mysql"
- "./logs/mariadb:/var/log/mysql"
environment:
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
MYSQL_DATABASE: ${MYSQL_DATABASE}
MYSQL_USER: ${MYSQL_USER}
MYSQL_PASSWORD: ${MYSQL_PASSWORD}
networks:
- default
php-fpm:
build:
context: ./php7-fpm
args:
TIMEZONE: ${TIMEZONE}
volumes:
- ${APP_PATH}:/var/www/app
environment:
DB_HOST: db
DB_PORT: 3306
DB_DATABASE: ${MYSQL_DATABASE}
DB_USERNAME: ${MYSQL_USER}
DB_PASSWORD: ${MYSQL_PASSWORD}
depends_on:
- db
networks:
- default
nginx:
build:
context: ./nginx
args:
- 'php-fpm'
- '9000'
volumes:
- ${APP_PATH}:/var/www/app
- ./logs/nginx/:/var/log/nginx
ports:
- "80:80"
- "443:443"
depends_on:
- php-fpm
networks:
- default
networks:
default:
driver: bridge
Сначала я подумал, что требуется только один файл компоновки, и когда я собрал образ, передал его в докер-концентратор, а затем вытащил этот образ на моем производственном сервере, контейнер не запустился.
Я немного почитал, и есть много интернет-источников, предлагающих использовать от 1 до 4 файлов Docker и проверить две ветки Git... среди прочего...
Я понимаю, что я должен по крайней мере создать еще один файл с именем docker-compose-prod.yml
и в этом файле я должен опустить volumes:
а также port:
атрибуты, но, похоже, нет четкого руководства по:
как заставить докер работать на локальном
Точно, когда и как построить контейнер для производства.
Может кто-нибудь прояснить это для меня, пожалуйста?
1 ответ
Предлагаем вам использовать Multiple Compose files
:
Использование нескольких файлов Compose позволяет настроить приложение Compose для разных сред или разных рабочих процессов.
Далее приведен пример:
(ПРИМЕЧАНИЕ: далее опустите некоторые элементы составного файла)
докер-compose.yml:
web:
image: example/my_web_app:latest
докер-compose.dev.yml:
web:
ports:
- 80:80
- казнить
docker-compose -f docker-compose.yml -d
не будет никакой карты портов. - казнить
docker-compose -f docker-compose.yml -f docker-compose.dev.yml -d
сделаюdocker-compose.dev.yml
переопределить некоторое значениеdocker-compose.yml
которые делают ваши цели.
Для получения подробной информации, обратитесь к докеру документации, это официальное предложение для обработки вашего сценария, к вашему сведению.
ОБНОВЛЕНО:
Ты используешь build: context: ./mariadb
так что сочинять всегда можно найти Dockerfile
в папке mariadb
чтобы построить, независимо от того, локальный сервер разработки или прод-сервер.
Чуть выше будет изображение как на dev
& prod
сервер, это один вариант для вас, чтобы следовать.
Другой вариант, как вы сказали в комментариях:
Но на prod-сервере я могу только вытащить и запустить образ, а образ должен быть заранее создан с помощью файла prod yml.
Таким образом, вы можете не захотеть строить изображение снова на prod
сервер?
Затем следующее обновленное решение, просто пример:
докер-compose.yml:
db:
image: your_maridb_image_name:your_maridb_image_version
networks:
- default
докер-compose.dev.yml:
db:
build:
context: ./mariadb
ports:
- "xxx:xxx"
докер-compose.prod.yml:
db:
otheroptions_special_for_prod_just_a_example: xxx
1) docker-compose -f docker-compose.yml -f docker-compose.dev.yml -d
Это будет сочетаться как следующее:
db:
image: your_maridb_image_name:your_maridb_image_version
networks:
- default
build:
context: ./mariadb
ports:
- "xxx:xxx"
в docker-compose
синтаксис, если build:context
было позволено, составить не будет тянуть образ из реестра, просто найти Dockerfile
в context
и, наконец, построить изображение с именем, указанным в image
вот это your_maridb_image_name:your_maridb_image_version
,
Затем вам нужно подтолкнуть его dockerhub
, но вам нужно остановить ваш локальный контейнер.
2) docker-compose -f docker-compose.yml -f docker-compose.prod.yml -d
Это будет сочетаться как следующее:
db:
image: your_maridb_image_name:your_maridb_image_version
networks:
- default
otheroptions_special_for_prod_just_a_example: xxx
в docker-compose
синтаксис, нет build:context
было позволено, поэтому compose будет напрямую извлекать образ Docker из удаленного реестра (Docker Hub). Помните, что вы выдвинули образ в Dockerhub после того, как закончили разработку на локальном сервере dev? Поэтому нет необходимости строить изображение снова.