GNU/Linux >> Znalost Linux >  >> Linux

Jak nasadit aplikaci PHP s Nginx a MySQL pomocí Docker a Docker Compose

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.


Linux
  1. Jak nasadit aplikace Node.js s pm2 a Nginx na Ubuntu

  2. Jak nasadit kontejner nginx s Dockerem na Linode

  3. Jak nasadit aplikaci Flask s Nginx a Gunicorn na Ubuntu 20.04

  1. Jak nasadit a spravovat MongoDB pomocí Dockeru

  2. Jak nasadit aplikaci React do produkce pomocí Dockeru a NGINX s API proxy

  3. Jak nasadit mikroslužby s Dockerem

  1. Jak nainstalovat Nextcloud s Nginx a PHP 7.3 na CentOS 8

  2. Jak nainstalovat Nginx s PHP a MySQL (LEMP Stack) na CentOS 7

  3. Dockerizace Laravelu pomocí Nginx MySQL a Docker Compose na Ubuntu 18.04 LTS