Това е последната част от поредицата NGINX, PHP, MySQL и PHPMyAdmin чрез Docker. Тук ще демонстрираме друг метод за управление на контейнерите и тяхната връзка. Ще ползваме Docker compose. Този начин позволява едновременно управление на няколко контейнера с един конфигурационен файл. Предните варианти които показахме също са работещи но се изисква голяма концентрация и винаги трябва да се следи кой контейнер след кой да се пуска. Docker compose използва конфигурационен файл завършващ на .yaml. Дайте да създадем контейнери NGINX, PHP-FPM, MYSQL и MYSQLADMIN чрез конфигурационния файл на Docker compose. Освен това в този файл ще опишем и допълнителната мрежа която ще създадем.
sudo nano ~/docker-project/compose.yaml networks: netowek2: name: network2 services: nginx2: php2: mysql2: phpmyadmin2:
networks: - започваме с директива дефинираща мрежовата част netowek2: - това ще е мрежа netowek2: name: network2 - името на мрежата се описва също така и чрез name, ако този параметър го няма то името се генерира автоматично и ще придобие нещо от вида docker project network2, което е много неудобно за работа. Драйвера не го указваме защото по подразбиране се създава мрежови мост. services директива дефинираща всички контейнери които ще ползваме Това е грубо оформяне на конфигурационния файл. Сега по-подробно да конфигурираме контейнерите.
sudo nano ~/docker-project/compose.yaml networks: network2: name: network2 services: nginx2: container_name: nginx2 image: nginx ports: - 80:80 volumes: - ~/docker-project/vhost.conf:/etc/nginx/conf.d/default.conf - ~/docker-project/www:/var/www/public_html networks: - network2 php2: container_name: php2 build: ~/docker-project/images/php volumes: - ~/docker-project/www:/var/www/public_html networks: - network2 mysql2: container_name: mysql2 image: mysql volumes: - ~/docker-project/mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root networks: - network2 phpmyadmin2: container_name: phpmyadmin2 image: phpmyadmin ports: - 1500:80 environment: - PMA_HOST=mysql2 networks: - network2
container_name: nginx2 - име на контейнера, ако не се укаже то се генерира автоматично. Отново е някакво дълго име и е неудобно за работа. image: nginx - за образ вземаме последната налична версия ports: - портове които ще се прехвърлят за контейнера volumes: - папки и файлове които ще се прехвърлят networks: - добавяме контейнера в мрежа networks2 build: ~/docker-project/images/php - ще ползваме собствен образ за PHP, няма да ползваме готов от Docker HUB Контейнерите са дефинирани но ако оставим така файла, то те ще се стартират отгоре надолу и ще се генерира грешка. За да избегнем горния проблем ще укажем зависимостите между контейнерите. Примерно контейнера NGINX зависи от правилното стартиране на контейнерите PHP и MYSQL. Да дефинираме зависимостите.
sudo nano ~/docker-project/compose.yaml networks: network2: name: network2 services: nginx2: container_name: nginx2 image: nginx ports: - 80:80 volumes: - ~/docker-project/vhost.conf:/etc/nginx/conf.d/default.conf - ~/docker-project/www:/var/www/public_html networks: - network2 depends_on: - php2 - mysql2 php2: container_name: php2 build: ~/docker-project/images/php volumes: - ~/docker-project/www:/var/www/public_html networks: - network2 depends_on: - mysql2 mysql2: container_name: mysql2 image: mysql volumes: - ~/docker-project/mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root networks: - network2 phpmyadmin2: container_name: phpmyadmin2 image: phpmyadmin ports: - 1500:80 environment: - PMA_HOST=mysql2 networks: - network2 depends_on: - mysql2
Много важно!!! За да работи коректно файла трябва отстъпите да се точни. Шпациите които се слагат пред командите трябва да са коректни. depends_on: - php2 - mysql2 - забележете за зависимости указваме не името на контейнера, а името на услугата. В нашия случай името на контейнера е дефиниран чрез реда php2:, а името на услугата е container_name: php2. На практика имената са едни и същи, но ако бяха различни ползвате името на услугата. Вземайки предвид горната забележка по-долу е показан коректния конфигурационен файл.
sudo nano ~/docker-project/compose.yaml networks: network2: name: network2 services: nginx2: container_name: nginx2 image: nginx ports: - 80:80 volumes: - ~/docker-project/vhost.conf:/etc/nginx/conf.d/default.conf - ~/docker-project/www:/var/www/public_html networks: - network2 depends_on: - php2 - mysql2 php2: container_name: php2 build: ~/docker-project/images/php volumes: - ~/docker-project/www:/var/www/public_html networks: - network2 depends_on: - mysql2 mysql2: container_name: mysql2 image: mysql volumes: - ~/docker-project/mysql-data:/var/lib/mysql environment: - MYSQL_ROOT_PASSWORD=root networks: - network2 phpmyadmin2: container_name: phpmyadmin2 image: phpmyadmin ports: - 1500:80 environment: - PMA_HOST=mysql2 networks: - network2 depends_on:
Тъй като променихме имената на контейнерите ще се наложи да редактираме конфигурационния файл на виртуалните хостове.
sudo nano ~/docker-project/vhost.conf server { listen 80; server_name localhost; index index.php; root /var/www/public_html; location ~ \.php$ { try_files $uri =404; fastcgi_pass php2:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } }
Също така е нужно да редактираме и index.php.
sudo nano ~/docker-project/www/index.php <?php $user = 'root'; $pass = 'root'; $dsn = 'mysql:host=mysql2;dbname=information_schema;charset=utf8'; $pdo = new PDO ($dsn, $user, $pass); $stmt = $pdo->query('select * from tables'); $row = $stmt->fetch(); print_r($row);
За да няма конфликти с контейнерите, ще спрем всички стари такива.
docker stop $(docker ps -q) 23e6eb2973ae c80440af84fd 8fa044d5332a 5384d098b695
Внимание ! Командата docker compose се стартира там където се намира композитния файл завършващ на .yaml.
cd ~/docker-project/ docker compose up -d [+] Building 0.8s (9/9) FINISHED docker:default => [php2 internal] load build definition from Dockerfile 0.0s => => transferring dockerfile: 206B 0.0s => [php2 internal] load metadata for docker.io/library/php:8.1-fpm 0.8s => [php2 internal] load .dockerignore 0.0s => => transferring context: 2B 0.0s => [php2 1/5] FROM docker.io/library/php:8.1-fpm@sha256:a3118db1911fdd3b 0.0s => CACHED [php2 2/5] RUN apt-get update 0.0s => CACHED [php2 3/5] RUN apt-get install -y curl git 0.0s => CACHED [php2 4/5] RUN docker-php-ext-install pdo pdo_mysql 0.0s => CACHED [php2 5/5] WORKDIR /var/www/public_html 0.0s => [php2] exporting to image 0.0s => => exporting layers 0.0s => => writing image sha256:130dc21fde5cf7148d1320a54adb614159d0d8a3f36c6 0.0s => => naming to docker.io/library/docker-project-php2 0.0s [+] Running 5/5 ✔ Network network2 Created 0.1s ✔ Container mysql2 Started 0.0s ✔ Container php2 Started 0.0s ✔ Container phpmyadmin2 Started 0.0s ✔ Container nginx2 Started 0.0s
За да разберем дали всичко работи правилно да отворим наново PHPMyAdmin на http://192.168.11.44:1500/. Всичко се отваря правилно, без грешки.