Каждый раз, когда я хочу начинать работать с «новым» 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’ композитора
- наслаждайтесь