Готовые конфигурации docker-compose для Django, Php

Docker

Очень понравилась идея быстро разворачивать проекты, не мучаясь с установкой зависимостей, используя Docker. Большинство популярных фреймворков уже имеют готовые образы, которые остается только использовать в своих проектах. Если же таких нет, что навряд ли, можно собрать свой описав последовательность сборки в Dockerfile.

Возиться при этом с Dockerfile’ами много не надо, для организации взаимодействия между контейнерами хорошо подходит docker-compose. С его помощью можно описать всю архитектуру нашего веб-проекта (н-р Django, Flask или Php) в одном файле. И этого вместе с готовыми образами с docker hub обычно достаточно.

Несколько таких примеров я оставлю здесь, чтобы не потерять.

Готовые конфигурации docker-compose

Все популярные конфигурации можно найти здесь. Но они для старта, ниже я опишу с чем вам скорее всего придется столкнуться и как это решить.

Django для тестов

Здесь мы просто запускаем джангу готовым образом python3.7 из папки app, в которую она была заблаговременно скопирована нами. Никаких баз и веб серверов при этом не определяя. Для изучения докера или просто тестов, очень даже ничего, но для прода никогда не используйте. Аналогично можно запустить Flask.

version: '3.7' 
services: 
  web: 
    build: app 
    ports: 
      - '8000:8000'  #Здесь можно изменить проброс порта с 8000 на 80 

В папке с приложением откуда будет запускаться приложение мы должны создать вот такой Dockerfile, где выберем нужную нам версию питона и файл откуда будут устанавливаться зависимости.

FROM python:3.7-alpine 
EXPOSE 8000
WORKDIR /app 
COPY requirements.txt /app
RUN pip3 install -r requirements.txt --no-cache-dir
COPY . /app 
ENTRYPOINT ["python3"] 
CMD ["manage.py", "runserver", "0.0.0.0:8000"]
├── docker-compose.yml
 ├── app
     ├── Dockerfile
     ├── requirements.txt
     └── manage.py

Но скорее всего у вас в проекте есть библиотеки требующие не просто установки, а именно сборки (н-р mysqlclient-python). Для них нужно установить определенные зависимости в Linux. В таком случае добавьте в свой Dockerfile следующие строчки.

RUN apt-get update && apt-get install -y \
     default-libmysqlclient-dev \
     automake \
     build-essential \
     && rm -rf /var/lib/apt/lists/*

Php

С php все также: образ, папка с проектом и все готово. Но неожиданно выясняется, что по-умолчанию в образе не будет расширений mysqli pdo pdo_mysql без которых вы вряд ли, развернете проект. А в апаче (да пример с php:7.4-apache) не включен mod_rewrite.

В связи с чем такой Dockerfile

FROM php:7.4-apache

Мы заменяем на такой

FROM php:7.4-apache
RUN a2enmod rewrite
RUN docker-php-ext-install mysqli pdo pdo_mysql

А к docker-compose.yaml

version: "3.7"
services:
  web:
    build: app
    ports: 
      - '80:80'
    volumes:
      - ./app:/var/www/html/

Мы добавим образ mysql и phpadmin для его администрирования.

version: "3.7"
 networks:
   site:
 volumes:
   db_data:
 services:
 Database
 db:
     container_name: mysql
     image: mysql:5.7
     volumes:
       - db_data:/var/lib/mysql
     restart: always
     environment:
       MYSQL_ROOT_PASSWORD: qms2wO
       MYSQL_DATABASE: docker_db
       MYSQL_USER: dcoker_db
       MYSQL_PASSWORD: t9Qjwv
     networks:
       - site
   # phpmyadmin
   phpmyadmin:
     container_name: pma
     depends_on:
       - db
     image: phpmyadmin/phpmyadmin
     restart: always
     ports:
       - '8080:80'
     environment:
       PMA_HOST: db
       MYSQL_ROOT_PASSWORD: rqms2wO 
     networks:
       - site
   web:
     container_name: php_web
     depends_on:
       - db
     build: app
     networks:
       - site
     ports: 
       - '80:80'
     volumes:
       - ./app/files:/var/www/html/

В итоге мы получаем стандартный стек LAMP, в котором не составит труда быстро сменить версию php, mysql и других составляющих. При желании можно вообще заменить образ mysql на postgres, если ваше приложение это позволяет.


Главное не забывайте после любого изменения Dockerfile’ов делать пересборку командой docker-compose build

Позже дополню новыми примерами, а пока будь что есть 🙂

0 0 votes
Рейтинг статьи
Подписаться
Уведомление о
guest
0 комментариев
Inline Feedbacks
View all comments