[Docker Practice Series-02] Используйте DockerCompose для организации полноценной среды разработки PHP

PHP
[Docker Practice Series-02] Используйте DockerCompose для организации полноценной среды разработки PHP

Не нужно объяснять важность Docker, мы каждый день спорим о cloud native, самой важной технологии, вы ее освоили? С сегодняшнего дня давайте Docker вместе!

1. Цели

1. Используйтеdocker-composeорганизовать среду разработки PHP;
2,PHPУстановка общего расширения;
3.Nginx php-fpm Mysql RedisДождитесь подключения контейнера;
4.PHPпрограмма может работатьMysql Redis;
2. Соберите соответствующие журналы для облегчения расследования;


2. Инструменты


1. Операционная система:Ubuntu
2. Редактор:VSCode
3. Докер
4.Docker ComposeОфициальный документ
5.Composeкитайское руководство
6. Если загрузка образа Docker идет медленно, вы можете попробовать это.www.daocloud.io/mirror


3. Шаги

3.1 Проверка программного обеспечения

Убедитесь, что Docker и Docker Compose установлены
Например

docker -v Docker version 19.03.1, build 74b1e89

docker-compose -v

docker-compose version 1.17.1, build 6d101fb

3.2 Создатьdocker-compose.ymlдокумент

Добавьте этот файл в свою папку, это файл шаблона, который мы организовали, формат следующий

version: '3'
services:
  php-workspace:
    image: php:7.3-fpm-alpine
  nginx:
    image: nginx:alpine


будь осторожен:
1. Поле версии, определенное в шаблоне, объявляет поле объявления формата и поддержки шаблона, а 3 является наиболее рекомендуемой и используемой версией в настоящее время.
2. Обратите внимание на уровень и пространство клавиши, мы можем использовать командуdocker-compose configкоманда для проверки правильности формата
3. ИспользуйтеVSCodeУдобно видеть, что код можно свернуть по уровню
image.png
4. Alpine — это небольшой и легкий Linux. Мы используем образ на основе alpine, потому что размер образа относительно небольшой. Что касается оптимизации более поздней конструкции контейнера, это другая тема, которая не будет здесь подробно рассматриваться.

3.3 «Пусть пули летят»

docker-compose up --buildСоберите образ и запустите контейнер

На данный момент вы можете видеть, что уже запущены два контейнера и образа.
image.png

3.4 Как заставить Nginx работать

Только что запущенный контейнер может использоватьdocker-compose downчтобы закрыть проект, а также автоматически удалить контейнер.
Теперь нам нужно указать порт, чтобы Nginx мог обработать запрос, вы можете обратиться к синтаксису файла шаблона в руководстве по составлению китайского языка.
image.png

3.4.1 Добавить параметр портов

Укажите отношение сопоставления между портом хоста и портом контейнера следующим образом;

version: '3'
services:
  php-workspace:
    image: php:7.3-fpm-alpine
  nginx:
    image: nginx:alpine
    ports:
      - "8080:8080"

3.4.2 Исполнениеdocker-compose up 


Зайдите в браузер и запросите localhost:8080
image.png

3.5 Файлы PHP передаются в PHP-FPM для обработки

image.png

Фактически, щелкните контейнер правой кнопкой мыши, чтобы управлять контейнером.Attach ShellМы можем быстро войти в контейнер, и мы можем увидеть внутреннюю ситуацию, когда мы входим в контейнер, например, каталог www и каталог конфигурации nginx, конфигурацию по умолчанию php-fpm и так далее.

3.5.1 Добавление конфигурации сайта nginx

новый файлnginx/conf.d/site.confСодержание файла следующее, следующие идеи также могут относиться к предыдущей статье.«Использование Docker для создания среды разработки PHP»упражняться.
image.png

server {
    listen 8080;
    root /usr/share/nginx/html;
    index index.php index.html;
    server_name localhost;
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    location ~ \.php$ {
        root /var/www/html; # 这里指向的php容器的项目根目录
        fastcgi_pass php-workspace:9000; #php-workspace是模板文件中的php-fpm服务名
        fastcgi_index index.php;
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
    }
}

3.5.2 Модификацияdocker-compose.ymlдокумент

Сборка сервисов nginx и php-fpm на основе Dockerfile

version: '3'
services:
  php-workspace:
    build: ./php # 这里php指我们的创建的目录
  nginx:
    build: ./nginx # 这里nginx指我们的创建的目录
    ports:
      - "8080:8080"

3.5.3 Новыйnginx/Dockerfileдокумент

FROM nginx:alpine

COPY conf.d /etc/nginx/conf.d

3.5.4 Новыйphp/Dockerfileдокумент

FROM php:7.3-fpm-alpine

3.5.5 Добавьте папку с кодом в качестве проекта php и добавьте файл index.php

<?php

phpinfo();

3.5.6 Повторная модификацияdocker-compose.ymlдокумент

Пусть папка проекта будет в виде монтирования, чтобы контейнер php-fpm мог напрямую читать директорию файла хоста, чтобы мы могли легко модифицировать отладку кода

version: '3'
services:
  php-workspace:
    build: ./php
    volumes: # 这里指定数据卷,可以指定多个, 中划线代表值为数组的一个成员
      - ./code:/var/www/html
  nginx:
    build: ./nginx #这里nginx指我们的创建的目录
    ports:
      - "8080:8080"

3.5.7 Прогуляйтесь

Перед перезапуском определите примерное расположение файла кода
image.png

docker-compose up --buildПерезапускаем проект и видим какие-то логи в контроллере переднего плана
image.png

Оба контейнера построены и запущен php. если мы попросим сейчасlocalhost:8080, вы также можете увидеть журнал запросов nginx
image.png

3.6 Подключиться к Mysql

Для использования мы по-прежнему ссылаемся на введение зеркалирования >>hub.docker.com/_/mysql

3.6.1 Добавить службу БД

version: '3'
services:
  php-workspace:
    build: ./php
    volumes:
      - ./code:/var/www/html
  nginx:
    build: ./nginx
    ports:
      - "8080:8080"
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment: # 设定环境变量,只给定名称的变量会自动获取运行 Compose 主机上对应变量的值
      MYSQL_ROOT_PASSWORD: root

3.6.2 Восстановить

docker-compose up --build
image.png

существуетVSCodeВ управлении контейнером щелкните правой кнопкой мыши, чтобы подключиться к оболочке и войти в выполнение контейнера.mysql -u root -p,Подтвердите парольroot, убедитесь, что наша база данных доступна
image.png

3.6.3 Установка pdo mysql

Перед операцией убеждаемся, что pdo не поддерживает драйвер mysql
image.png
изменить phpDockerfileФайл выглядит следующим образом
Первая команда RUN — изменить исходный код программного обеспечения системы alpine, чтобы последующая установка прошла быстрее.

FROM php:7.3-fpm-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \ 
    && docker-php-ext-install pdo_mysql


перестроить проектdocker-compose up --build
image.png

3.6.4 Измените файл index.php, код выглядит следующим образом

<?php

$dsn = 'mysql:host=db;port=3306'; // host=db,这里的db其实是mysql的服务名
$user = 'root';
$password = 'root';

try {
    $dbh = new PDO($dsn, $user, $password);
    print_r($dbh);
} catch (PDOException $e) {
    echo 'Connection failed: '.$e->getMessage();
}

3.6.5 Проверка MySQL

image.png

3.7 Подключиться к Redis

3.7.1 Два способа установки расширений PHP в контейнеры

Это ясно из документации по изображению php в Docker Hub.

  • Во-первых, расширения ядра PHP можно установить через docker-php-ext-install ext_name.
  • Второй - PECL
  • Третий - скомпилировать через исходный пакет

Расширение Redis мы используем второе.

3.7.2 Измените файл docker-compose.yml и добавьте службу Redis

version: '3'
services:
  php-workspace:
    build: ./php
    volumes:
      - ./code:/var/www/html
  nginx:
    build: ./nginx
    ports:
      - "8080:8080"
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
  redis:
    image: redis:5.0.5-alpine

3.7.3 Восстановить

docker-compose up --build
После сборки мы также можем войти в контейнер и использовать команду redis-cli, чтобы определить, доступен ли redis.
image.png

3.7.4 Изменение php-файла Docker

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

FROM php:7.3-fpm-alpine

RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories \ 
    && docker-php-ext-install pdo_mysql \
    && apk add ${PHPIZE_DEPS} \
    && pecl install redis-4.0.1 \
    && docker-php-ext-enable redis \
    && apk del ${PHPIZE_DEPS}

Пересобираем, модифицируем код index.php phpinfo(), видим, что расширение redis включено
image.png

3.7.5 Подключение к Redis

Исправлятьindex.phpСодержимое файла проверяется следующим образом

<?php

$redis = new Redis();
$redis->pconnect('redis', 6379);

$key = 'first';
$redis->incr($key);

echo '页面浏览了:'.$redis->get($key); die;


image.png

3.8 Сбор журнала

Давайте рассмотримnginx/conf.d/site.confКонфигурация

server {
    listen 8080;
    root /usr/share/nginx/html;
    index index.php index.html;
    server_name localhost;
    # 我们已经把nginx相关日志写到这里了,如何放到宿主机呢?
    error_log  /var/log/nginx/error.log;
    access_log /var/log/nginx/access.log;
    # ... more something
}


Конечно, есть много схем сбора логов докеров, но схема сбора логов инструментов управления кластером пока не рассматривается, здесь лог запросов nginx высаживается на хост в виде монтирования данных.

3.8.1 Модификацияdocker-compose.ymlФайл выглядит следующим образом

version: '3'
services:
  php-workspace:
    build: ./php
    volumes:
      - ./code:/var/www/html
  nginx:
    build: ./nginx
    volumes: # 新增这两行
      - ./log/nginx:/var/log/nginx/
    ports:
      - "8080:8080"
  db:
    image: mysql
    command: --default-authentication-plugin=mysql_native_password
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: root
  redis:
    image: redis:5.0.5-alpine

3.8.2 Перезапустить проект

docker-compose upПосле выполнения вы можете увидеть, что в нашей папке есть еще две директории и два файла.
image.png

3.9 Оптимизация

depends_on

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

depends_on:
      - db
      - redis


В некоторых случаях php-workspace не может быть найден при запуске nginx, так же добавляем зависимость под сервисом nginx

nginx:
 depends_on: 
 - php-workspace

переменная среды

Конечно, есть много других полезных настроек параметров, таких как чтение конфиденциальных данных, переменных среды, настройка хоста и т. д., которые можно попробовать и использовать в разработке позже.


4. Резюме

Вышеизложенные идеи могут решить многие проблемы в локальной разработке.Если в проекте используется memcached или другие приложения, то практику можно внедрить в описание документации образа в Docker Hub.
Вдобавок к этому, задолго до того, как Laravel назвали разработку Laravel, существовал проект с открытым исходным кодом.LaradockДля создания приложений Dockerized PHP не только это, но и многие промежуточные программы можно запустить с помощью docker-compose, см. >>laradock.io/, но в нем много чего, потому что для удовлетворения масштабируемости большинства людей добавлено много переменных окружения и если еще суждений, что усложняет исходный Dockerfile и добавляет много логики. Но идея в основном та же.
Еще несколько моментов, на которые стоит обратить внимание:
1. Проект, определенный в файле docker-compose.yml, будет называться именем проекта в папке, в которой он находится.
2. Проект имеет сеть по умолчанию, и службы в проекте могут взаимодействовать друг с другом, поэтому запрос php, который мы только что перенаправили в site.conf, может быть перенаправлен напрямую с именем службы php-workspace:9000 и подключением к базе данных. также можно использовать для ожидания их подключения с именем службы db redis.
image.png


5. Полный код

GitHub.com/baiyutang/…


6. Унаследованные проблемы

1. Указываем объем данных монтируемой базы данных, например Mysql, мы можем копировать базы данных других сред напрямую в виде файлов, а затем использовать их напрямую. Это позволит перенести данные быстрее, чем если бы мы вручную импортировали sql.

2. Как уменьшить размер зеркалирования Mysql Теперь файл зеркалирования Mysql самый большой, как показано на рисунке, их 445M
image.png


7. Следующий трейлер

Фактически, в среде PHP Docker уже есть проект с открытым исходным кодом Laradock, который прост в использовании и легко расширяется, но самая большая проблема заключается в том, что он кажется раздутым, а иногда установка выполняется очень медленно, особенно с учетом слишком большого количества подключаемых модулей расширения. и так далее, чтобы сделать изображение очень большим. Так что идея следующей статьи может вращаться вокруг того, как оптимизировать то, что мы делаем сегодня.demo-docker-compose, или локализация Ларадока работает?
Две другие идеи:
1. Сразу переходим к теме k8s
2. Как сделать CI/CD после докеризации


8. Расширение