CodeIgniter 4 – Создадим несколько контейнеров Docker для разработки

Каждый раз, когда я хочу начинать работать с «новым» CodeIgniter 4 (он не такой уж и новый, так как был запущен довольно давно), у меня возникает эта большая стена под названием «Контейнеры Docker», хотя в документации она не упоминается. , да и не особо нужно.

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

Итак, давайте углубимся в запуск нашего стека докеров, требуя Apache, PHP и MySQL. Прежде всего, я должен предупредить вас, что вам сначала нужно установить Docker и запустить его. Я не буду объяснять вам, как установить Docker.

Я начал с создания следующей структуры каталогов

project_folder
  - db_data
  - docker
    - apache
    - mysql
  - src
  - public

ХОРОШО. Итак, у нас есть каталог «docker», в который мы помещаем (почти) все, что связано с докером. Кроме того, у нас есть каталог «db_data», в котором мы будем хранить все, что хранится в нашей базе данных. В нашем каталоге «src» мы будем хранить наши основные файлы CodeIgniter, а в «public» будут находиться общедоступные активы нашего приложения.

Теперь нам нужно создать  «docker-compose.yml» , который мы поместим в папку нашего проекта (в нашем случае «project_folder»). Этот файл должен содержать, для начала, следующее:

version: '3'
services:

В нашем  docker-compose.yml  мы скажем docker, что нам нужно два или три контейнера — зависит от ваших потребностей. Первый — это сервер Apache с PHP, второй будет контейнером базы данных, а третий, если хотите, может быть клиентом базы данных, а именно «Adminer».

Контейнер «db»

Учитывая, что нам понадобится база данных MySQL, начнем с определения  контейнера «db»  в наших  «сервисах» . Пока что  файл docker-compose.yml  будет выглядеть так:

version: '3'
services:
    db:
        build:
            context: .
            dockerfile: docker/mysql/Dockerfile
        environment: 
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        command: --default-authentication-plugin=mysql_native_password
        restart: unless-stopped
        volumes:
            - ./db_data:/usr/data
        ports:
            - 3306:3306
volumes:
    db_data:

Что мы здесь делали? Мы сказали Docker, что для создания контейнера db потребуется использовать  файл «Dockerfile»  , который можно найти в  «docker/mysql» . Мы также сказали ему перезапускаться до тех пор, пока он не будет остановлен вручную или пока не возникнет проблема со службой. Мы также объявили локальный том, который контейнер должен использовать для сохранения данных, и открыли порт 3306 для связи между контейнерами.

Ранее я говорил что-то о  «Dockerfile» . Итак, давайте создадим его в  «docker/mysql» . Не волнуйся. Это будет быстро, так как это выглядит так:

FROM mysql

ENV MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD}
ENV MYSQL_DATABASE=${MYSQL_DATABASE}

#COPY ./docker/mysql/codeigniter_database.sql /docker-entrypoint-initdb.d/init.sql

EXPOSE 3306

Вот и все. Мы просто сказали докеру получить последнюю версию MySQL и выставить порт 3306 «всему миру». Если мы хотим, мы также можем выбрать версию MySQL, выполнив что-то вроде: FROM mysql:5.7 . Подробнее здесь:  https://hub.docker.com/_/mysql

Мы также сказали ему создать пароль root, который можно получить из имени переменной среды  MYSQL_ROOT_PASSWORD  , и создать базу данных, имя которой также упоминается в переменной среды с именем  MYSQL_DATABASE .

Вы также можете увидеть закомментированную строку, начинающуюся с COPY . Если вы хотите начать проект с некоторыми таблицами по умолчанию, вы можете в любое время сохранить таблицы в файле (может быть, « codeigniter_database.sql »?) и использовать его в нашем контейнере в качестве отправной точки для базы данных MySQL.

Я упомянул что-то о переменных среды. Эти переменные среды можно сохранить в  файле «.env»  , который можно сохранить в папке нашего проекта (в моем случае в «project_folder»).

Итак, давайте создадим тот, который будет содержать наши первые переменные:

MYSQL_ROOT_PASSWORD=cod31gn1t3
MYSQL_DATABASE=codeigniter_db

Хорошщ. Теперь, идем дальше, давайте установим наш серверный контейнер Apache.

«Веб-контейнер»

Мы создаем серверный контейнер, добавляя «веб-сервис» в наш  файл docker-compose.yml  , который теперь должен выглядеть так:

version: '3'
services:
    db:
        build:
            context: .
            dockerfile: docker/mysql/Dockerfile
        environment: 
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        command: --default-authentication-plugin=mysql_native_password
        restart: unless-stopped
        volumes:
            - ./db_data:/usr/data
        ports:
            - 3306:3306
    web:
        build:
            context: .
            dockerfile: docker/apache/Dockerfile
            args:
                uid: ${UID}
        environment:
            - APACHE_RUN_USER=#${UID}
            - APACHE_RUN_GROUP=#${UID}
        restart: unless-stopped
        volumes: 
            - ./public:/var/www/html/public
            - ./apache_log:/var/log/apache2
        ports:
            - 80:80
        depends_on: 
            - db
        links:
            - db
volumes:
    db_data:
    src:

Что мы тут сказали? Мы сказали docker, что у нас есть Dockerfile, который мы хотим использовать для настройки контейнера сервера Apache. Мы хотим передать некоторые аргументы (аргументы) в Dockerfile, аргументы, которые также будут взяты из наших переменных среды. Мы хотим, чтобы контейнер перезапускался, если только он не остановлен вручную, а также мы хотим, чтобы он использовал   локальный каталог  «src» для своего каталога «var/www/html»  . Мы будем использовать порт 80 для связи между нашим компьютером и сервером, и мы позволим Apache зависеть и быть связанным со  службой «db»  .

Теперь давайте также посмотрим на наш другой «Dockerfile», тот, который мы сказали Docker использовать для Apache и PHP. Давайте создадим его в каталоге «docker/apache» и поместим туда следующее:

FROM php:7.4-apache
RUN echo "ServerName localhost" >> /etc/apache2/apache2.conf
RUN apt-get update
RUN apt-get install -y \
    git \
    zip \
    curl \
    sudo \
    unzip \
    libicu-dev \
    libbz2-dev \
    libpng-dev \
    libjpeg-dev \
    libmcrypt-dev \
    libreadline-dev \
    libfreetype6-dev \
    g++

RUN docker-php-ext-install \
    bz2 \
    intl \
    bcmath \
    opcache \
    calendar \
    pdo_mysql \
    mysqli

# 2. set up document root for apache
COPY docker/apache/000-default.conf /etc/apache2/sites-available/000-default.conf

# 3. mod_rewrite for URL rewrite and mod_headers for .htaccess extra headers like Access-Control-Allow-Origin-
RUN a2enmod rewrite headers

# 4. start with base php config, then add extensions
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"

# 5. Composer
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
RUN chmod +x /usr/local/bin/composer
RUN composer self-update

COPY src/ /var/www/html/
# 6. we need a user with the same UID/GID with host user
# so when we execute CLI commands, all the host file's ownership remains intact
# otherwise command from inside container will create root-owned files and directories
ARG uid
RUN useradd -G www-data,root -u $uid -d /home/devuser devuser
RUN mkdir -p /home/devuser/.composer && \
    chown -R devuser:devuser /home/devuser

EXPOSE 80

Итак… мы будем использовать Apache с PHP 7.4, назовем наш сервер localhost и начнем с обновления и установки некоторых необходимых расширений PHP. После этого мы устанавливаем новый файл конфигурации apache, который мы создаем в  каталоге «docker/apache»  .

После этого устанавливаем Composer, копируем все, что находим, из нашего локального  каталога «src»  в каталог контейнеров  «/var/www/html»  .

И, наконец, мы настраиваем некоторые права на чтение/запись для нашего пользователя root, который является nemd в нашей переменной окружения UID.

Теперь давайте обновим файл «.env» следующей переменной:

UID=1000

Я уже говорил кое-что о конфигурационном файле Apache. Итак, давайте создадим файл  «000-default.conf»  в нашем  каталоге «docker/apache»  и поместим в него следующее:

<VirtualHost *:80>
  ServerAdmin webmaster@localhost
  DocumentRoot /var/www/html/public
  
  <Directory /var/www/html>
    Options Indexes FollowSymLinks
    AllowOverride All
    Require all granted
  </Directory>
</VirtualHost>

Готово… Если только вам не нужен визуальный клиент MySQL, такой как Adminer.

Настроить контейнер “Adminer” ? Просто…

Нам просто нужно добавить сервис в наш  «docker-compose.yml» . Таким образом, файл теперь должен выглядеть так:

version: '3'
services:
    db:
        build:
            context: .
            dockerfile: docker/mysql/Dockerfile
        environment: 
            MYSQL_DATABASE: ${MYSQL_DATABASE}
            MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
        command: --default-authentication-plugin=mysql_native_password
        restart: unless-stopped
        volumes:
            - ./db_data:/usr/data
        ports:
            - 3306:3306
    web:
        build:
            context: .
            dockerfile: docker/apache/Dockerfile
            args:
                uid: ${UID}
        environment:
            - APACHE_RUN_USER=#${UID}
            - APACHE_RUN_GROUP=#${UID}
        restart: unless-stopped
        volumes: 
            - ./src:/var/www/html
            - ./apache_log:/var/log/apache2
        ports:
            - 80:80
        depends_on: 
            - db
        links:
            - db
    adminer:
        image: adminer
        restart: unless-stopped
        ports:
            - 8080:8080
volumes:
    db_data:
    src:

Теперь, если мы перейдем по адресу http://localhost:8080, у нас будет доступ к Adminer.

ХОРОШО. Сделанный. Теперь, если мы перейдем к нашей  «project_folder»  и  выполним «docker-compose up»  в нашем терминале, весь наш стек должен быть собран, и мы можем приступить к работе.

Мы можем проверить, что все в порядке, создав файл index.php в нашем «общедоступном» каталоге и поместив в него следующий код:

<?php

$host = 'db';
$user = 'root';
$pass = 'cod31gn1t3';
$conn = new mysqli($host, $user, $pass);

if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
echo "Connected to MySQL successfully!";

Если все прошло нормально, если мы перейдем по  адресу http://localhost , мы должны увидеть, что мы подключены к MySQL с помощью драйвера mysqli. Не волнуйтесь, мы также установили драйвер PDO на тот случай, если он вам больше понравится.

Конечный результат клонирования должен выглядеть примерно так:

После того, как мы клонировали репозиторий, мы открываем терминал в каталоге, в котором мы клонировали репозиторий, и набираем « docker-compose up -d  ».

Если вы случайно встретите такую ​​ошибку: «ОШИБКА: для codeigniter_web_1 Невозможно запустить веб-службу: ошибка при создании исходного пути монтирования ‘/run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu- 20.04/ebc957f10edc09b607f3ae00d638eb7058d47ad57ae3df8c8684373c2895ecff’: mkdir /run/desktop/mnt/host/wsl/docker-desktop-bind-mounts/Ubuntu-20.04/ebc957f10edc09b607f3ae00d638eb7058d47ad57ae3df8c8684373c2895ecff: file exists”, you most likely didn’t close properly the containers in the past. Чтобы пройти эту ошибку, вам нужно удалить все предыдущие тома. Для этого просто введите эти 4 команды одну за другой:

1. docker-compose down
2. docker rm -f $(docker ps -a -q)
3. docker volume rm $(docker volume ls -q)
4. docker-compose up

ОК… Теперь все должно быть в порядке, с созданными службами web , db и adminer .

В чрево Зверя!

Теперь нам нужно зайти в терминал нашего «веб-сервиса», чтобы «установить» CodeIgniter4.

Для этого нам сначала нужно узнать, как называется контейнер. Итак, введите в терминале « docker ps  ». Как видите, имя нашего контейнера — « codeigniter_web_1 ».

Чтобы попасть в терминал этого контейнера, нам нужно всего лишь написать: « docker exec -it codeigniter_web_1 bash  ». И все: мы в контейнерном терминале.

Теперь в терминале контейнера мы просто пишем: » composer create-project codeigniter4/appstarter ./  «; и композитор должен начать установку нашего приложения CodeIgniter4. Если по какой-то причине в вашем каталоге /var/www/html уже есть файл , приложение не будет установлено, поэтому перед установкой убедитесь, что каталог пуст.

Теперь, если вы перейдете в браузере по адресу http://localhost , вы должны увидеть начальное приложение CodeIgniter.

  • Клонируйте мой репозиторий Github: https://github.com/wpdew/CodeIgniter4-Docker-Apache-PHP-MySQL
  • зайдите в терминал и напишите: ‘docker-compose up’
  • зайдите в терминал контейнера и установите CodeIgniter 4, используя ‘create-project’ композитора
  • наслаждайтесь
0 0 голоса
Рейтинг статьи
Подписаться
Уведомить о
guest
0 комментариев
Межтекстовые Отзывы
Посмотреть все комментарии
× iOs app

To install this Web App in your iPhone/iPad press iOs sourse and then Add to Home Screen.