Docker je open-source kontejnerizační nástroj, který umožňuje vytvářet, nasazovat a spouštět aplikace pomocí kontejnerů. Kontejnery umožňují zabalit aplikaci se všemi požadovanými částmi a nasadit ji jako jeden balíček. Kontejnery jsou přenosné a můžete je rozmístit kdekoli. Kontejner přináší vývojářům jednotné a efektivní pracovní prostředí, které lze snadno sdílet.
V této příručce vám ukážeme, jak nasadit aplikaci PHP s Nginx a MySQL pomocí Docker a Docker Compose.
Předpoklady
- Nový server Ubuntu 20.04 na cloudové platformě Atlantic.Net
- Heslo uživatele root nakonfigurované na vašem serveru
Krok 1 – Vytvořte cloudový server Atlantic.Net
Nejprve se přihlaste ke svému cloudovému serveru Atlantic.Net. Vytvořte nový server a jako operační systém vyberte Ubuntu 20.04 s alespoň 4 GB RAM. Připojte se ke svému cloudovému serveru přes SSH a přihlaste se pomocí přihlašovacích údajů zvýrazněných v horní části stránky.
Jakmile se přihlásíte ke svému serveru Ubuntu 20.04, spusťte následující příkaz a aktualizujte svůj základní systém nejnovějšími dostupnými balíčky.
apt-get update -y
Krok 2 – Nainstalujte Docker a Docker Compose
Nejprve nainstalujte požadované závislosti pomocí následujícího příkazu:
apt-get install apt-transport-https ca-certificates curl tree software-properties-common -y
Dále přidejte úložiště Docker pomocí následujícího příkazu:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | apt-key add - add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu focal stable"
Dále nainstalujte Docker a Docker Compose pomocí následujícího příkazu:
apt-get install docker-ce docker-compose -y
Jakmile budete hotovi, můžete přejít k dalšímu kroku.
Krok 3 – Struktura adresáře
Pro účely tohoto tutoriálu použijeme následující adresářovou strukturu:
/root/docker-project/ ├── docker-compose.yml ├── nginx │ ├── default.conf │ └── Dockerfile ├── php │ └── Dockerfile └── www └── html └── index.php
Krok 4 – Vytvořte kontejner Nginx
Než začnete, budete muset vytvořit a spustit kontejner Nginx pro hostování aplikace PHP.
Nejprve vytvořte adresář pro svůj projekt pomocí následujícího příkazu:
mkdir ~/docker-project
Dále změňte adresář na svůj projekt a vytvořte soubor docker-compose.yml pro spuštění kontejneru Nginx.
cd ~/docker-project nano docker-compose.yml
Přidejte následující řádky:
nginx: image: nginx:latest container_name: nginx-container ports: - 80:80
Po dokončení uložte a zavřete soubor.
Výše uvedený soubor stáhne nejnovější obraz Nginx, vytvoří kontejner nginx a vystaví jej na portu 80.
Dále spusťte kontejner Nginx pomocí následujícího příkazu:
docker-compose up -d
Spuštěný kontejner můžete zkontrolovat pomocí následujícího příkazu:
docker ps
Měli byste vidět následující výstup:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c6641e4d5bbf nginx:latest "/docker-entrypoint.…" 5 seconds ago Up 3 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-container
Nyní otevřete webový prohlížeč a otevřete svůj kontejner Nginx pomocí adresy URL http://ip-vaseho-serveru . Na následující obrazovce byste měli vidět testovací stránku Nginx:
Krok 5 – Vytvořte kontejner PHP
Nejprve vytvořte nový adresář v projektu pomocí následujícího příkazu:
mkdir -p ~/docker-project/www/html
Dále vytvořte soubor index.php pro ověření vaší verze PHP.
nano ~/docker-project/www/html/index.php
Přidejte následující řádky:
<!DOCTYPE html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p> </body>
Uložte a zavřete soubor a poté v adresáři projektu vytvořte adresář pro Nginx:
mkdir ~/docker-project/nginx
Dále vytvořte výchozí konfigurační soubor Nginx pro spuštění vaší aplikace PHP:
nano ~/docker-project/nginx/default.conf
Přidejte následující řádky:
server { listen 80 default_server; root /var/www/html; index index.html index.php; charset utf-8; location / { try_files $uri $uri/ /index.php?$query_string; } location = /favicon.ico { access_log off; log_not_found off; } location = /robots.txt { access_log off; log_not_found off; } access_log off; error_log /var/log/nginx/error.log error; sendfile off; client_max_body_size 100m; location ~ .php$ { fastcgi_split_path_info ^(.+.php)(/.+)$; fastcgi_pass php:9000; fastcgi_index index.php; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_intercept_errors off; fastcgi_buffer_size 16k; fastcgi_buffers 4 16k; } location ~ /.ht { deny all; } }
Uložte a zavřete soubor.
Dále vytvořte Dockerfile v adresáři nginx. Tím se zkopíruje výchozí konfigurační soubor Nginx do kontejneru Nginx.
nano ~/docker-project/nginx/Dockerfile
Přidejte následující řádky:
FROM nginx:latest COPY ./default.conf /etc/nginx/conf.d/default.conf
Dále upravte soubor docker-compose.yml:
nano ~/docker-project/docker-compose.yml
Odstraňte starý obsah a přidejte následující obsah:
---
nginx:
build: ./nginx/
container_name: nginx-container
ports:
- 80:80
links:
- php
volumes:
- ./www/html/:/var/www/html/
php:
image:php:7.0-fpm
název_kontejneru:php-container
vystavit:
– 9000
objemy:
– ./www/html /:/var/www/html/
Po dokončení uložte a zavřete soubor.
Výše uvedený soubor vytvoří nový php-container, zpřístupní PHP-FPM na portu 9000, propojí nginx-container s php-container, vytvoří svazek a připojí jej ke kontejneru, takže veškerý obsah bude synchronizován s adresářem kontejneru. /var/www/html/.
Nyní spusťte kontejner pomocí následujícího příkazu:
cd ~/docker-project docker-compose up -d
Spuštěné kontejnery můžete ověřit pomocí následujícího příkazu:
docker ps
Měli byste vidět následující výstup:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 82c8baf15221 docker-project_nginx "/docker-entrypoint.…" 23 seconds ago Up 22 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-container 10778c6686d8 php:7.0-fpm "docker-php-entrypoi…" 25 seconds ago Up 23 seconds 9000/tcp php-container
Nyní otevřete webový prohlížeč a přejděte na adresu URL http://ip-vaseho-serveru . Měla by se zobrazit vaše stránka Hello World:
Dále zkontrolujeme, zda náš připojený svazek funguje nebo ne. Chcete-li tak učinit, upravte soubor index.php:
nano ~/docker-project/www/html/index.php
Změňte řádek „Ahoj světe! Změny jsou použity“:
<!DOCTYPE html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World! Changes are Applied</h1> <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p> </body>
Nyní obnovte svou webovou stránku. Na obrazovce byste měli vidět upravenou stránku:
Krok 6 – Vytvořte datový kontejner
Jak můžete vidět, připojili jsme adresář www/html do obou našich kontejnerů, nginx-container a php-container. To však není správný způsob. V této části vytvoříme samostatný datový kontejner, který bude uchovávat data, a propojíme je se všemi ostatními kontejnery.
Chcete-li tak učinit, upravte soubor docker-compose.html:
nano ~/docker-project/docker-compose.yml
Proveďte následující změny:
nginx: build: ./nginx/ container_name: nginx-container ports: - 80:80 links: - php volumes_from: - app-data php: image: php:7.0-fpm container_name: php-container expose: - 9000 volumes_from: - app-data app-data: image: php:7.0-fpm container_name: app-data-container volumes: - ./www/html/:/var/www/html/ command: "true"
Nyní znovu vytvořte a spusťte celý kontejner pomocí následujícího příkazu:
cd ~/docker-project docker-compose up -d
Nyní ověřte všechny spuštěné kontejnery pomocí následujícího příkazu:
docker ps -a
Měli byste vidět následující výstup:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 849315c7ffc0 docker-project_nginx "/docker-entrypoint.…" 27 seconds ago Up 25 seconds 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-container 59a0d7040fd8 php:7.0-fpm "docker-php-entrypoi…" 28 seconds ago Up 27 seconds 9000/tcp php-container fbca95944234 php:7.0-fpm "docker-php-entrypoi…" 29 seconds ago Exited (0) 28 seconds ago app-data-container
Krok 7 – Vytvořte kontejner MySQL
V této části vytvoříme kontejner databáze MySQL a propojíme jej se všemi ostatními kontejnery.
Nejprve budete muset upravit obraz PHP a nainstalovat rozšíření PHP pro MySQL, abyste se mohli připojit k databázi MySQL.
Nejprve vytvořte adresář pro PHP pomocí následujícího příkazu:
mkdir ~/docker-project/php
Dále vytvořte Dockerfile pro instalaci rozšíření PHP:
nano ~/docker-project/php/Dockerfile
Přidejte následující řádky:
FROM php:7.0-fpm RUN docker-php-ext-install pdo_mysql
Uložte a zavřete soubor. Poté upravte soubor docker-compose.yml a vytvořte kontejner MySQL a kontejner dat MySQL pro uložení databáze a tabulek:
nano ~/docker-project/docker-compose.yml
Proveďte následující změny:
nginx: build: ./nginx/ container_name: nginx-container ports: - 80:80 links: - php volumes_from: - app-data php: build: ./php/ container_name: php-container expose: - 9000 links: - mysql volumes_from: - app-data app-data: image: php:7.0-fpm container_name: app-data-container volumes: - ./www/html/:/var/www/html/ command: "true" mysql: image: mysql:5.7 container_name: mysql-container volumes_from: - mysql-data environment: MYSQL_ROOT_PASSWORD: secret MYSQL_DATABASE: mydb MYSQL_USER: myuser MYSQL_PASSWORD: password mysql-data: image: mysql:5.7 container_name: mysql-data-container volumes: - /var/lib/mysql command: "true"
Uložte a zavřete soubor.
Dále upravte index.php soubor a proveďte nějaké změny, abyste otestovali připojení k databázi.
nano ~/docker-project/www/html/index.php
Proveďte následující změny:
<!DOCTYPE html> <head> <title>Hello World!</title> </head> <body> <h1>Hello World!</h1> <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p> <? $database ="mydb"; $user = "myuser"; $password = "password"; $host = "mysql"; $connection = new PDO("mysql:host={$host};dbname={$database};charset=utf8", $user, $password); $query = $connection->query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE='BASE TABLE'"); $tables = $query->fetchAll(PDO::FETCH_COLUMN); if (empty($tables)) { echo "<p>There are no tables in database \"{$database}\".</p>"; } else { echo "<p>Database \"{$database}\" has the following tables:</p>"; echo "<ul>"; foreach ($tables as $table) { echo "<li>{$table}</li>"; } echo "</ul>"; } ?> </body> </html>
Uložte a zavřete soubor a poté spusťte kontejner pomocí následujícího příkazu:
cd ~/docker-project docker-compose up -d
Ověřte všechny spuštěné kontejnery pomocí následujícího příkazu:
docker ps -a
Měli byste vidět následující výstup:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES d3e82747fe0d mysql:5.7 "docker-entrypoint.s…" 39 seconds ago Up 38 seconds 3306/tcp, 33060/tcp mysql-container 606320e5a7f8 mysql:5.7 "docker-entrypoint.s…" 41 seconds ago Exited (0) 39 seconds ago mysql-data-container ca4f63797d11 docker-project_php "docker-php-entrypoi…" 2 hours ago Up 2 hours 9000/tcp php-container 849315c7ffc0 docker-project_nginx "/docker-entrypoint.…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp nginx-container fbca95944234 php:7.0-fpm "docker-php-entrypoi…" 2 hours ago Exited (0) 39 seconds ago app-data-container
Krok 8 – Ověřte připojení k databázi
Nyní otevřete webový prohlížeč a přejděte na webovou stránku na adrese http://ip-vaseho-serveru . Měli byste vidět následující obrazovku:
Jak vidíte, v databázi mydb nejsou žádné tabulky.
Ve skutečnosti však nějaké tabulky existují, ale běžný uživatel je nevidí. Pokud je chcete vidět, upravte soubor index.php a změňte $user „root“ a $password „tajné“
nano ~/docker-project/www/html/index.php
Změňte následující řádek:
$user = "root"; $password = "secret";
Uložte a zavřete soubor a poté obnovte stránku. Na následující obrazovce byste měli vidět databázi se všemi tabulkami:
Závěr
Ve výše uvedené příručce jste se naučili, jak nasadit aplikaci PHP s Nginx a MySQL pomocí Docker a Docker Compose. Nyní byste měli být schopni hostovat aplikaci PHP v produkčním prostředí pomocí Dockeru; zkuste to na svém hostovacím účtu VPS od Atlantic.Net.