- Cоздаём сети:
docker network create --subnet 10.0.1.0/24 dmz
docker network create --subnet 10.0.2.0/24 data
-
Создаём каталоги /opt/lab2/*
mkdir /opt/lab2 /opt/lab2/web /opt/lab2/db /opt/lab2/cache
chown 33:33 /opt/lab2/web
chown 123:129 /opt/lab2/db
- Переходим в каталог /opt/lab2 и создаём файл Dockerfile для сборки контейнера с Apache + PHP + все нужные библиотеки для Laravel
# Dockerfile
FROM php:7.3-apache
RUN apt-get update -y && docker-php-ext-install pdo_mysql && mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini" && a2enmod rewrite
ENV APACHE_DOCUMENT_ROOT /var/www/html/public
RUN sed -ri -e 's!/var/www/html!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/sites-available/*.conf
RUN sed -ri -e 's!/var/www/!${APACHE_DOCUMENT_ROOT}!g' /etc/apache2/apache2.conf /etc/apache2/conf-available/*.conf
и собираем контейнер
docker build -t my_web_container .
- Запускаем веб сервер
docker run --name web --network=dmz --ip 10.0.1.100 -p 80:80 --mount type=bind,source=/opt/lab2/web,target=/var/www/html -d -t my_web_container
- Создаём файл index.html в /opt/lab2/web c любым пробным содержимым, и проверяем что он доступен через браузер пробуя зайти на IP виртуальной машины
- Запускаем MySQL сервер
docker run --name db --network=data --ip 10.0.2.100 -e MYSQL_ROOT_PASSWORD=qwerty --mount type=bind,source=/opt/lab2/db,target=/var/lib/mysql -d -t mysql:5.7
и проверяем его работоспособность:
docker run -it --network data --rm mysql mysql -h10.0.2.100 -uroot -p
- Настраиваем iptables, разрешаем доступ из сети dmz в сеть data
iptables -I DOCKER-USER -i br-c42ac4d697ff -o br-f965584d87f9 -j ACCEPT
iptables -I DOCKER-USER -i br-f965584d87f9 -o br-c42ac4d697ff -j ACCEPT
- Проверяем доступность mysql из сети dmz, подключаемся:
docker run -it --network dmz --rm mysql mysql -h10.0.2.100 -uroot -p
а так же создаём базу данных для Laravel
create database laravel;
- Запускаем Redis cервер
docker run --name cache --network=data --ip 10.0.2.200 --mount type=bind,source=/opt/lab2/cache,target=/data -d -t redis
- Проверяем доступность Redis (сразу из сети dmz)
docker run -it --network=dmz --rm redis redis-cli -h 10.0.2.200
-
Устанавливаем Laravel c помощью Composer
docker run --rm --interactive --tty --volume /opt/lab2/web:/app composer create-project laravel/laravel .
docker run --rm --interactive --tty --volume /opt/lab2/web:/app composer require predis/predis
и корректируем права
chown -R 33:33 /opt/lab2/web/storage
- Редактируем файл .env: вписываем правильные адреса MySQL и Redis, а так же пароль
...
DB_HOST=10.0.2.100
...
DB_PASSWORD=qwerty
...
CACHE_DRIVER=redis
...
REDIS_CLIENT=predis
REDIS_HOST=10.0.2.200
- Редактируем файл /opt/lab2/web/database/seeders/DatabaseSeeder.php, раскоментируес строчку с созданием тестовых пользователей
- Инициализируем базу данных через командную строку PHP и подготавливаем файлы используя наш контейнер "изнутри"
docker run --rm --network=dmz --mount type=bind,source=/opt/lab2/web,target=/var/www/html -it my_web_container bash
и внутри контейнера:
php artisan migrate
php artisan db:seed
php artisan make:controller -m User UsersController
-
Тестируем паботу Laravel c MySQL
- Редактируем файл /opt/lab2/web/routes/web.php следующим образом:
<?php
use Illuminate\Support\Facades\Route;
/*
|--------------------------------------------------------------------------
| Web Routes
|--------------------------------------------------------------------------
|
| Here is where you can register web routes for your application. These
| routes are loaded by the RouteServiceProvider within a group which
| contains the "web" middleware group. Now create something great!
|
*/
Route::get('/', 'App\Http\Controllers\UsersController@index');
- В файле /opt/lab2/web/app/Http/Controllers/UsersController.php вписываем в функцию index
dd(User::all());
-
Пробуем снова зайти на сайт через браузер, должна показаться отладочная информация о пользователях в базе.
-
Тестируем паботу Laravel c Redis