Создайте среду разработки PHP с помощью Docker

PHP Docker Nginx Composer

Оригинальная ссылка

, если вас интересуют или интересуют акции США, вы можете добавить меня в WeChat: xiaobei060537, и общаться вместе 😝.

1. Введение

1.1 Зачем использовать Докер?

Есть ли такой сценарий, когда вы запускаете проект, вам нужно построить среду для локальной разработки, и вам также нужно построить среду, когда вы выкладываете его в онлайн.Когда вы идете в компанию и хотите играть тайком, вам нужно для создания среды Существует довольно много зависимостей от среды. Если у вас есть Docker в это время, вам нужно только установить Docker на машину, положить написанный Dickerfile, и строка команд автоматически выполнит эту задачу, что удобно и эффективно, не правда ли?

1.2 Подготовка

Далее в этой статье рассказывается, как создать среду разработки PHP, которая будет использоватьzPhal-dockerfilesВ качестве примера, вот набор файлов Dockerfile, которые я подготовил для своей системы блогов.

Теперь, будь то Windows, Mac или Linux, Docker может хорошо поддерживаться, включая систему Windows, Docker для Windows на самом деле неплох в системе win10, но он более интенсивно использует память.

Через командную строку Docker мы можем делать много чего, тянуть образы, запускать контейнеры, выполнять команды в контейнерах и т. д., но теперь нам нужно писать файлы dockerfiles более простым и грубым способом, а затем управлять этими файлами через docker-compose, упростить процесс работы.

Что такое Dockerfile?
Dockerfile — это скрипт, состоящий из набора команд и параметров. Эти команды применяются к извлеченному базовому образу и, наконец, создают новый образ. С помощью Dockerfile мы можем создать нужный вам образ, содержащий программное обеспечение, которое вы хотите установить. эквивалентно предварительной настройке устанавливаемых расширений, команд для выполнения и т. д., а затем их выполнению одним щелчком мыши, что значительно упрощает процесс работы.

Для настройки окружения по этой статье нужно:

  • Во-первых, узнайте о Docker и некоторых основных операциях Docker, а также о том, что такое docker-compose.
  • Затем нужно установить Docker и docker-compose, я буду использовать docker-compose для управления своими файлами docker.

Обратите внимание, что написание dockerfile живо, а не мертво, и dockerfile у всех будут разные, в зависимости от ваших потребностей.

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

2. Начните писать

Далее идутzPhal-dockerfilesНапример, вы можете щелкнуть ссылку, чтобы увидеть полный текст, ниже приведен только фрагмент.

2.1 Предварительный просмотр

Прежде всего, давайте взглянем: созданный мной проект dockerfile примерно разделен на следующие каталоги (конечно, это задается мной, и форматировать ваши файлы таким образом не требуется):

zPhal-dockerfiles
    app/
        index.php
        phpinfo.php
    data/
        .gitignore
    files/
        mysql/
            conf.d/
                mysql-file.cnf
            Dockerfile
        nginx/
            conf.d/
                default.conf
                zphal.conf
            Dockerfile
            nginx.conf
        php/
            pkg/
                .gitignore
            Dockerfile
            php.ini
            php-dev.ini
            php-fpm.conf
        redis/
            Dockerfile
        docker-compose.yml
    logs/
    .gitgnore
    README.md

В этом проекте я использую PHP, MySQL, Nginx, Redis, Composer, расширения Phalcon и т.д.

В общем, для этого у нас есть три процесса: написать dockerfile каждого ПО; написать файл конфигурации; обработать весь dockerfile через docker-compose, в том числе кинуть файл конфигурации конфигурации в образ, который будет собирать файл dockerfile.

2.2 Запись Dockerfile

2.2.1 PHP

Вот Dockerfile для PHP:

FROM php:7.2-fpm
MAINTAINER goozp "gzp@goozp.com"

#  设置时区
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

#  更新安装依赖包和PHP核心拓展
RUN apt-get update && apt-get install -y \
        git \
        libfreetype6-dev \
        libjpeg62-turbo-dev \
        libpng-dev \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
        && docker-php-ext-install zip \
        && docker-php-ext-install pdo_mysql \
        && docker-php-ext-install opcache \
        && docker-php-ext-install mysqli \
        && rm -r /var/lib/apt/lists/*

#  将预先下载好的拓展包从宿主机拷贝进去
COPY ./pkg/redis.tgz /home/redis.tgz
COPY ./pkg/cphalcon.tar.gz /home/cphalcon.tar.gz

#  安装 PECL 拓展,这里我们安装的是Redis
RUN pecl install /home/redis.tgz && echo "extension=redis.so" > /usr/local/etc/php/conf.d/redis.ini

#  安装第三方拓展,这里是 Phalcon 拓展
RUN cd /home \
    && tar -zxvf cphalcon.tar.gz \
    && mv cphalcon-* phalcon \
    && cd phalcon/build \
    && ./install \
    && echo "extension=phalcon.so" > /usr/local/etc/php/conf.d/phalcon.ini

#  安装 Composer
ENV COMPOSER_HOME /root/composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
ENV PATH $COMPOSER_HOME/vendor/bin:$PATH

RUN rm -f /home/redis.tgz \
        rm -f /home/cphalcon.tar.gz 

WORKDIR /data

#  Write Permission
RUN usermod -u 1000 www-data

Первая строка определяет базовый образ, здесь мы используем версию PHP7.2 для fpm, а здесь вторая строка определяет сопровождающего.

Далее определяется часовой пояс.Это предложение определяется в каждом dockerfile, в основном для синхронизации времени всех контейнеров с хостом.Фактически мы можем определить это в файле docker-composer.yml:

services:
  php-fpm:
    volumes:
      - /etc/localtime:/etc/localtime:ro

Однако при работе в системах, отличных от Linux, таких как Windows, мы не можем получить /etc/localtime.Для большей совместимости со всеми платформами я записываю синхронизацию времени в dockerfile.

Далее устанавливаем некоторые расширения.По сути, процесс установки расширений похож на установку расширений PHP в linux вручную.Стоит упомянуть о composer. Я установил Composer непосредственно в образ php-fpm.На самом деле, официальный образ Composer также предоставляется.Вытягивание образа composer для выполнения также может достичь цели, потому что мы используем composer только для выполнения команд composer для управления нашими пакетами.Если composer Если это только контейнер, мы также можем отключить контейнер, когда он не используется; но здесь я устанавливаю композитор напрямую в образ php-fpm, в основном потому, что в моем проекте установлены некоторые расширения PHP, и я пишу composer.json В файле я определяю зависимости расширения, чтобы при выполнении композитора он проверял, установлены ли в среде эти зависимости, поэтому, если я использую образ композитора напрямую, мне также нужно установить расширения, которые я использую, в файл image, что более хлопотно, поэтому я делал это прямо в зеркале php, по сути разницы нет, зависит от того, как вы его используете.

2.2.2 Nginx

Вот dockerfile для Nginx:

FROM nginx:1.12

#  set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

Это намного проще, я только устанавливаю время. Поскольку мне не нужно ничего устанавливать, я могу напрямую использовать официальное зеркало.

Конечно, нам нужно модифицировать файл конфигурации, только заранее написать файл конфигурации, и, наконец, закинуть файл конфигурации в файл docker-compose.yml, об этом будет сказано ниже, в том числе файл конфигурации PHP и файл конфигурации MySQL то же самое.

2.2.3 MySQL

Вот dockerfile для MySQL:

FROM mysql:5.7

#  set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

В MySQL нет ничего особенного, и официальное зеркало используется напрямую.

2.2.4 Redis

Ниже приведен Redis, который также напрямую использует официальное зеркало:

FROM redis:3.2

#  set timezome
ENV TZ=Asia/Shanghai
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

2.3 Написать файл конфигурации

Что делать с файлами конфигурации? Я классифицирую файлы конфигурации. Файлы конфигурации PHP помещаются в каталог PHP, а конфигурация Nginx помещается в каталог Nginx. Что касается создания новой подпапки, это зависит от ситуация, такая как папка conf.d.

В качестве примера возьмем конфигурационный файл Nginx.Во-первых, каталог nginx выглядит так:

nginx/
    conf.d/
        default.conf
        zphal.conf
    Dockerfile
    nginx.conf

В дополнение к nginx.conf есть также подпапка conf.d для хранения всех файлов конфигурации доменных имен.Те, кто создавал среду PHP под Linux, должны быть знакомы с ней. Эти файлы конфигурации — это файлы, которые мы будем передавать в контейнер в это время, и мы не будем использовать эти файлы на хосте.

Итак, самое важное, что следует отметить, это то, чтоПуть, указанный в файле конфигурации, — это путь к среде внутри контейнера, а не путь к хосту., у каждого контейнера есть работающая среда, представляющая собой крошечную маленькую систему, и все эти пути — это пути внутри контейнера. мы можем пройтиустанавливатьЧтобы связаться с контейнером для синхронизации файлов, запустить контейнер в командной строке также необходимо смонтировать путь к файлу, и теперь мы также используем docker-compose для решения этого шага.

Вот пример файла конфигурации:

server {
    listen 80 default;
    index index.html index.htm;
    server_name localhost docker;

    root /data/www;
    index index.php index.html index.htm;
    location / {
        try_files $uri $uri/ /index.html;
    }

    location ~ \.php {
        include fastcgi_params;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /data/www/$fastcgi_script_name;
    }
}

иroot /data/wwwсередина,/data/wwwПуть — это путь к контейнеру nginx в данный момент, а не путь к текущему работающему хосту, поэтому нам нужно смонтировать место, где веб-программа размещена, по этому пути.

2.4 Напишите файл docker-compose.yml

На том же уровне, что и php, nginx и другие каталоги, мы создаем docker-compose.yml, Когда мы выполняем команды, связанные с docker-compose, мы автоматически находим этот файл и выполняем его в соответствии с содержимым внутри.

Следуя приведенному выше примеру с nginx, давайте сначала поговорим о монтировании, потому что это самый важный шаг. В docker-compose.yml раздел для nginx:

nginx:
    build: ./nginx
    depends_on:
      - php-fpm
    links:
      - php-fpm:php-fpm
    volumes:
      - ../app:/data/www:rw
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ../logs/nginx:/var/log/nginx
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    restart: always
    command: nginx -g 'daemon off;'

Есть параметр Volumes, вот соответствующая конфигурация каталога, который мы хотим смонтировать, первый, который мы../appподняться на/data/wwwСреди них это также прослушивающий корень по умолчанию, определенный в нашем файле конфигурации, а каталог приложения - это каталог на нашем хосте. Смонтировав таким образом, мы можем напрямую поместить файлы нашего проекта в приложение, а докер поможет вам перейти на в контейнере/data/wwwПод содержанием.

Другие параметры:

  • build определяет, где находится ваш dockerfile. Если вы не пишете dockerfile, вы можете использовать build вместо build. Вы можете использовать параметр images для определения официального образа, напримерimage:mysql:5.7;
  • depend_on означает, что он будет зависеть от других зеркал, например, nginx зависит от php-fpm, без него я не могу играть с nginx;
  • Ссылки определяют соединения, такие как подключение к контейнеру php-fpm, т.е.php-fpm:php-fpm, за которым следует псевдоним;
  • порты означает сопоставление портов,80:80Указывает, что порт 80 сопоставлен с портом 80 хоста.
  • перезапустить перезапустить,restart: alwaysУказывает, что он перезапустится автоматически
  • команда - это автоматически выполняемая команда
  • ...

Параметров много, больше можно посмотреть в официальной документации.

Вот полный файл docker-compose.yml:

version: '3.2'
services:
  php-fpm:
    build: ./php/
    ports:
      - "9000:9000"
    links:
      - mysql-db:mysql-db
      - redis-db:redis-db
    volumes:
      - ../app:/data/www:rw
      - ./php/php-dev.ini:/usr/local/etc/php/php.ini:ro
      - ./php/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro
      - ../logs/php-fpm:/var/log/php-fpm:rw
    restart: always
    command: php-fpm

  nginx:
    build: ./nginx
    depends_on:
      - php-fpm
    links:
      - php-fpm:php-fpm
    volumes:
      - ../app:/data/www:rw
      - ./nginx/conf.d:/etc/nginx/conf.d:ro
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
      - ../logs/nginx:/var/log/nginx
    ports:
      - "80:80"
      - "8080:8080"
      - "443:443"
    restart: always
    command: nginx -g 'daemon off;'

  mysql-db:
      build: ./mysql
      ports:
        - "3306:3306"
      volumes:
        - ../data/mysql:/var/lib/mysql:rw
        - ../logs/mysql:/var/lib/mysql-logs:rw
        - ./mysql/conf.d:/etc/mysql/conf.d:ro
      environment:
        MYSQL_ROOT_PASSWORD: 123456
        MYSQL_DATABASE: zphaldb
        MYSQL_USER: zphal
        MYSQL_PASSWORD: zphal123
      restart: always
      command: "--character-set-server=utf8"

  redis-db:
      build: ./redis
      ports:
        - "6379:6379"
      volumes:
        - ../data/redis:/data
      restart: always

3. Используйте

Этот набор написан, как мы его используем?

3.1 Использование встроенной среды

  1. Сначала войдите в каталог dockerfiles проекта, вот каталог файлов:
cd zPhal-dockerfiles/files

 wget https://pecl.php.net/get/redis-3.1.6.tgz -O php/pkg/redis.tgz
 wget https://codeload.github.com/phalcon/cphalcon/tar.gz/v3.3.1 -O php/pkg/cphalcon.tar.gz

Затем загрузите пакет расширения PHP, который мы будем использовать.

  1. Выполнение заказа:
docker-compose up

Docker автоматически создаст образ с помощью написанного содержимого docker-compose.yml и запустит контейнер.
Если все в порядке, вы можете включить его в режиме демона при следующей загрузке, и все контейнеры будут работать в фоновом режиме:

docker-compose up -d
  1. закрыть контейнер
    Контейнер можно закрыть, а службу удалить следующим образом:
docker-compose down

Использование docker-compose в основном так просто, используйте команды остановки, запуска и другие команды для управления службами контейнеров. И еще работа заключается в написании файлов dockerfile и docker-compose.yml.

3.2 Использование Композитора

Как мы это делаем, когда хотим использовать композитор? Мы установили композитор в php-fpm.

Сделайте это с помощью docker-compose:

docker-compose run --rm -w /data/www/zPhal php-fpm composer update

-w /data/www/zPhalДля рабочей области php-fpm в ней же смонтирован проект zPhal, поэтому мы можем запускать composer прямо в контейнере.

Или войдите в каталог хост-приложения и используйте команду docker:

cd zPhal-dockerfiles/app

docker run -it --rm -v `pwd`:/data/www/ -w /data/www/zPhal files_php-fpm composer update

4. Меры предосторожности

  • Обратите внимание на путь монтирования
  • При сбое сборки обратите внимание на то, сообщается ли об ошибке в контейнере
  • Ускорьте зеркалирование. Если процесс загрузки изображений очень медленный, вы можете использовать отечественные сервисы ускоренных изображений, такие как Alibaba Cloud и Daocloud.