Как использовать 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. как заставить докер работать на локальном

  2. Точно, когда и как построить контейнер для производства.

Может кто-нибудь прояснить это для меня, пожалуйста?

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? Поэтому нет необходимости строить изображение снова.

Другие вопросы по тегам