Я хотел бы отправить приложение Laravel в контейнер Docker. Должен ли я использовать Docker в Docker или docker, чтобы добавить все службы? - PullRequest
0 голосов
/ 31 марта 2020

Я создаю Laravel приложение, которое ведет себя как приложение SaaS. Для работы у меня есть следующие контейнеры:

  • php
  • nginx
  • контейнер очереди (работает laravel горизонт)
  • redis
  • mysql
  • может стать больше ...

Для разработки я создал общие ресурсы для своей локальной кодовой базы. Теперь мой вопрос: какой самый профессиональный способ доставки такого мультисервисного приложения. Я знаю, что это не просто создание единого контейнера Ubuntu, на котором выполняются все службы.

Это мой текущий docker -compose.yml

version: "3.7"

services:

  store:
    restart: unless-stopped
    image: redis:4.0.11-alpine
    volumes:
      - redis-data:/data

  database:
    restart: unless-stopped
    image: mysql:5.7.27
    command: --default-authentication-plugin=mysql_native_password
    ports:
      # So you can use a database client on your host machine
      - 3306:3306
    environment:
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - mysql-data:/var/lib/mysql

  php:
    restart: unless-stopped
    #    image: php:7.3.10-fpm-alpine
    build:
      context: .
      dockerfile: ./docker/dockerfiles/PHP/Dockerfile
    working_dir: /code
    volumes:
      - code-sync:/code:nocopy
      - terminal-history:/root/
      - ./docker/config/php-fpm/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini
      - ./docker/config/php-fpm/www.conf:/usr/local/etc/php-fpm.d/www.conf

  queue:
    image: custom-laravel_php
    entrypoint: php artisan horizon
    working_dir: /code
    volumes:
      - code-sync:/code:nocopy

  webserver:
    restart: unless-stopped
    image: nginx:1.15.0-alpine
    depends_on:
      - database
      - store
      #      - certbot
      - php
    ports:
      # Exposing both http and https
      - 80:80
      - 443:443
    volumes:
      - code-sync:/code:nocopy
      - ./docker/config/default.conf:/etc/nginx/conf.d/default.conf

volumes:
  mysql-data:
  redis-data:
  terminal-history:
  code-sync:
    external: true

1 Ответ

2 голосов
/ 31 марта 2020

Я хотел бы отправить приложение Laravel в Docker контейнере,

Когда я работал профессионалом с Laravel, я запустил Php Docker Stack , пакет composer для развертывания Laravel с docker в производстве, потому что все решения вовремя были сосредоточены в процессе разработки, но между тем я перешел на работу в Security и остановился это разработка, но вы можете использовать ее в качестве отправной точки для вашего профессионального развертывания, потому что она разделяет каждую службу на свой собственный контейнер.

Затем стек разработки расширяется из производственного стека, а не наоборот. можно увидеть во многих других стеках.

я должен использовать Docker в Docker или docker - составить, чтобы добавить все услуги?

Docker в Docker предназначен для docker разработки, и некоторые используют его в конвейерах CI и даже здесь используют его с осторожностью согласно словам создателя :

Основная цель Docker -in- Docker должен был помочь с разработка самого Docker. Многие люди используют его для запуска CI (например, с Jenkins), что поначалу кажется нормальным, но они сталкиваются со многими «интересными» проблемами, которых можно избежать, если вместо этого подключить сокет Docker к контейнеру Jenkins.

Профессиональное развертывание

Теперь мой вопрос: какой самый профессиональный способ доставки такого мультисервисного приложения.

Это действительно зависит от технического уровня клиентской базы пользователей, но вы можете начать с docker compose, а затем обновить до Docker Swarm или Even Kubernetes.

Попробуйте предоставить все образы из вышестоящего частного реестра, а не создавать их локально, как вы это делаете в некоторых из них.

Безопасность

Порты базы данных

    ports:
      # So you can use a database client on your host machine
      - 3306:3306

Это 3306:3306 эквивалентно 0.0.0.0:3306:3306, поэтому, если вы хотите, чтобы база данных была доступна только на локальном хосте, вы должны сделать вместо этого 127.0.0.1:3306:3306, но если ваша база данных должна быть доступна только для других контейнеров в стеке, вы можете удалить порты в целом, и вместо этого вы можете вызвать базу данных из своего кода, используя docker имя службы compose, в вашем случае это database.

Пароль базы данных

environment:
      - MYSQL_ROOT_PASSWORD=secret

A лучший способ предоставить секреты - установить их в файле .env в root вашего проекта, а затем использовать переменные в docker-compose.yml:

environment:
      - MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD? Missing password for mysql root user.}

или просто заменить environment: на ваш docker-compose.yml с файлом .env в root вашего проекта:

env_file:
    - ./.env
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...