GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So stellen Sie eine PHP-Anwendung mit Nginx und MySQL mit Docker und Docker Compose bereit

Docker ist ein Open-Source-Containerisierungstool, mit dem Sie Anwendungen mithilfe von Containern erstellen, bereitstellen und ausführen können. Mit Containern können Sie eine Anwendung mit allen erforderlichen Teilen packen und als einzelnes Paket bereitstellen. Container sind portabel und können überall eingesetzt werden. Ein Container bietet Entwicklern eine einheitliche und optimierte Arbeitsumgebung, die einfach geteilt werden kann.

In diesem Leitfaden zeigen wir Ihnen, wie Sie eine PHP-Anwendung mit Nginx und MySQL mithilfe von Docker und Docker Compose bereitstellen.

Voraussetzungen

  • Ein frischer Ubuntu 20.04-Server auf der Atlantic.Net Cloud Platform
  • Ein auf Ihrem Server konfiguriertes Root-Passwort

Schritt 1 – Atlantic.Net Cloud-Server erstellen

Melden Sie sich zunächst bei Ihrem Atlantic.Net Cloud Server an. Erstellen Sie einen neuen Server und wählen Sie Ubuntu 20.04 als Betriebssystem mit mindestens 4 GB RAM. Stellen Sie über SSH eine Verbindung zu Ihrem Cloud-Server her und melden Sie sich mit den oben auf der Seite hervorgehobenen Anmeldeinformationen an.

Sobald Sie sich bei Ihrem Ubuntu 20.04-Server angemeldet haben, führen Sie den folgenden Befehl aus, um Ihr Basissystem mit den neuesten verfügbaren Paketen zu aktualisieren.

apt-get update -y

Schritt 2 – Docker und Docker Compose installieren

Installieren Sie zunächst die erforderlichen Abhängigkeiten mit dem folgenden Befehl:

apt-get install apt-transport-https ca-certificates curl tree software-properties-common -y

Fügen Sie als Nächstes das Docker-Repository mit dem folgenden Befehl hinzu:

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"

Als nächstes installieren Sie Docker und Docker Compose mit dem folgenden Befehl:

apt-get install docker-ce docker-compose -y

Wenn Sie fertig sind, können Sie mit dem nächsten Schritt fortfahren.

Schritt 3 – Verzeichnisstruktur

Für dieses Tutorial verwenden wir die folgende Verzeichnisstruktur:

/root/docker-project/
├── docker-compose.yml
├── nginx
│   ├── default.conf
│   └── Dockerfile
├── php
│   └── Dockerfile
└── www
    └── html
        └── index.php

Schritt 4 – Erstellen Sie einen Nginx-Container

Bevor Sie beginnen, müssen Sie einen Nginx-Container erstellen und starten, um die PHP-Anwendung zu hosten.

Erstellen Sie zunächst mit dem folgenden Befehl ein Verzeichnis für Ihr Projekt:

mkdir ~/docker-project

Wechseln Sie als Nächstes in das Verzeichnis Ihres Projekts und erstellen Sie eine docker-compose.yml-Datei, um den Nginx-Container zu starten.

cd ~/docker-project
nano docker-compose.yml

Fügen Sie die folgenden Zeilen hinzu:

     nginx:   
      image: nginx:latest  
      container_name: nginx-container  
      ports:   
       - 80:80 

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Die obige Datei lädt das neueste Nginx-Image herunter, erstellt einen Nginx-Container und stellt ihn auf Port 80 bereit.

Starten Sie als Nächstes den Nginx-Container mit dem folgenden Befehl:

docker-compose up -d

Sie können den laufenden Container mit dem folgenden Befehl überprüfen:

docker ps

Sie sollten die folgende Ausgabe sehen:

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

Öffnen Sie nun Ihren Webbrowser und greifen Sie über die URL http://your-server-ip auf Ihren Nginx-Container zu . Sie sollten die Nginx-Testseite auf dem folgenden Bildschirm sehen:

Schritt 5 – Erstellen Sie einen PHP-Container

Erstellen Sie zunächst mit dem folgenden Befehl ein neues Verzeichnis in Ihrem Projekt:

mkdir -p ~/docker-project/www/html

Erstellen Sie als Nächstes eine index.php-Datei, um Ihre PHP-Version zu überprüfen.

nano ~/docker-project/www/html/index.php

Fügen Sie die folgenden Zeilen hinzu:

     <!DOCTYPE html>  
     <head>  
      <title>Hello World!</title>
     </head>  

     <body>  
      <h1>Hello World!</h1>
      <p><?php echo 'We are running PHP, version: ' . phpversion(); ?></p>
     </body>

Speichern und schließen Sie die Datei und erstellen Sie dann ein Verzeichnis für Nginx in Ihrem Projektverzeichnis:

mkdir ~/docker-project/nginx

Erstellen Sie als Nächstes eine Nginx-Standardkonfigurationsdatei, um Ihre PHP-Anwendung auszuführen:

nano ~/docker-project/nginx/default.conf

Fügen Sie die folgenden Zeilen hinzu:

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;  
     }  
    } 

Speichern und schließen Sie die Datei.

Als nächstes erstellen Sie eine Dockerfile im nginx-Verzeichnis. Dadurch wird die Nginx-Standardkonfigurationsdatei in den Nginx-Container kopiert.

nano ~/docker-project/nginx/Dockerfile

Fügen Sie die folgenden Zeilen hinzu:

    FROM nginx:latest   
    COPY ./default.conf /etc/nginx/conf.d/default.conf 

Bearbeiten Sie als Nächstes die Datei docker-compose.yml:

nano ~/docker-project/docker-compose.yml

Entfernen Sie die alten Inhalte und fügen Sie die folgenden Inhalte hinzu:

---
nginx:
build: ./nginx/
container_name: nginx-container
ports:
- 80:80
links:
- php
volumes:
- ./www/html/:/var/www/html/

php:
image:php:7.0-fpm
container_name:php-container
expose:
– 9000
volumes:
– ./www/html /:/var/www/html/

 

Speichern und schließen Sie die Datei, wenn Sie fertig sind.

Die obige Datei erstellt einen neuen PHP-Container, stellt PHP-FPM auf Port 9000 bereit, verknüpft den nginx-Container mit dem PHP-Container, erstellt ein Volume und stellt es auf dem Container bereit, sodass alle Inhalte mit dem Verzeichnis des Containers synchron sind /var/www/html/.

Starten Sie nun den Container mit dem folgenden Befehl:

cd ~/docker-project
docker-compose up -d

Sie können die laufenden Container mit dem folgenden Befehl überprüfen:

docker ps

Sie sollten die folgende Ausgabe sehen:

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

Öffnen Sie nun Ihren Webbrowser und greifen Sie auf die URL http://your-server-ip zu . Sie sollten Ihre Hello World-Seite sehen:

Als nächstes prüfen wir, ob unser gemountetes Volume funktioniert oder nicht. Bearbeiten Sie dazu die Datei index.php:

nano ~/docker-project/www/html/index.php

Ändern Sie die Zeile „Hello World! Änderungen werden übernommen”:

     <!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>

Aktualisieren Sie jetzt Ihre Webseite. Sie sollten Ihre geänderte Seite auf dem Bildschirm sehen:

Schritt 6 – Erstellen Sie einen Datencontainer

Wie Sie sehen können, haben wir das Verzeichnis www/html in unsere beiden Container, nginx-container und php-container, gemountet. Dies ist jedoch kein richtiger Weg. In diesem Abschnitt erstellen wir einen separaten Datencontainer für die Daten und verknüpfen ihn mit allen anderen Containern.

Bearbeiten Sie dazu die Datei docker-compose.html:

nano ~/docker-project/docker-compose.yml

Nehmen Sie die folgenden Änderungen vor:

    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"

Erstellen Sie nun alle Container neu und starten Sie sie mit dem folgenden Befehl:

cd ~/docker-project
docker-compose up -d

Überprüfen Sie nun alle laufenden Container mit dem folgenden Befehl:

docker ps -a

Sie sollten die folgende Ausgabe sehen:

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

Schritt 7 – Erstellen Sie einen MySQL-Container

In diesem Abschnitt erstellen wir einen MySQL-Datenbankcontainer und verknüpfen ihn mit allen anderen Containern.

Zunächst müssen Sie das PHP-Image ändern und die PHP-Erweiterung für MySQL installieren, um eine Verbindung zur MySQL-Datenbank herzustellen.

Erstellen Sie zunächst ein Verzeichnis für PHP mit dem folgenden Befehl:

mkdir ~/docker-project/php

Erstellen Sie als Nächstes ein Dockerfile, um die PHP-Erweiterung zu installieren:

nano ~/docker-project/php/Dockerfile

Fügen Sie die folgenden Zeilen hinzu:

    FROM php:7.0-fpm  
    RUN docker-php-ext-install pdo_mysql 

Speichern und schließen Sie die Datei. Bearbeiten Sie dann die Datei docker-compose.yml, um einen MySQL-Container und einen MySQL-Datencontainer für die Datenbank und die Tabellen zu erstellen:

nano ~/docker-project/docker-compose.yml

Nehmen Sie die folgenden Änderungen vor:

     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" 

Speichern und schließen Sie die Datei.

Bearbeiten Sie als Nächstes dieindex.php Datei und nehmen Sie einige Änderungen vor, um die Datenbankverbindung zu testen.

nano ~/docker-project/www/html/index.php

Nehmen Sie die folgenden Änderungen vor:

     <!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>

Speichern und schließen Sie die Datei und starten Sie dann den Container mit dem folgenden Befehl:

cd ~/docker-project
docker-compose up -d

Überprüfen Sie alle laufenden Container mit dem folgenden Befehl:

docker ps -a

Sie sollten die folgende Ausgabe sehen:

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

Schritt 8 – Datenbankverbindung überprüfen

Öffnen Sie nun Ihren Webbrowser und greifen Sie auf die Webseite unter http://your-server-ip zu . Sie sollten den folgenden Bildschirm sehen:

Wie Sie sehen können, gibt es keine Tabellen in der mydb-Datenbank.

Es gibt jedoch tatsächlich einige Tabellen, die jedoch für einen normalen Benutzer nicht sichtbar sind. Wenn Sie sie sehen möchten, bearbeiten Sie die Datei index.php und ändern Sie $user zu „root“ und $passwort zu "geheim"

nano ~/docker-project/www/html/index.php

Ändern Sie die folgende Zeile:

       $user = "root";  
       $password = "secret";  

Speichern und schließen Sie die Datei und aktualisieren Sie dann die Seite. Sie sollten die Datenbank mit allen Tabellen auf dem folgenden Bildschirm sehen:

Schlussfolgerung

In der obigen Anleitung haben Sie gelernt, wie Sie eine PHP-Anwendung mit Nginx und MySQL mithilfe von Docker und Docker Compose bereitstellen. Sie sollten nun in der Lage sein, die PHP-Anwendung in der Produktionsumgebung mit Docker zu hosten; Probieren Sie es auf Ihrem VPS-Hosting-Konto von Atlantic.Net aus.


Linux
  1. Wie man MongoDB mit Docker bereitstellt und verwaltet

  2. So stellen Sie Node.js-Anwendungen mit pm2 und Nginx auf Ubuntu bereit

  3. So stellen Sie Microservices mit Docker bereit

  4. So stellen Sie einen Nginx-Container mit Docker auf Linode bereit

  5. So stellen Sie die Flask-Anwendung mit Nginx und Gunicorn unter Ubuntu 20.04 bereit

So installieren und konfigurieren Sie Laravel mit Docker Compose unter Ubuntu 20.04

So installieren Sie Linux, Nginx, MariaDB und PHP (LEMP) auf Fedora 22

So installieren Sie Nginx, MySQL und PHP (LEMP) auf einem Ubuntu 15.04-Server

Wie man mit PHP eine Verbindung zu MySQL herstellt

Wie stellt man die Laravel-Anwendung mit Nginx auf Ubuntu bereit?

So aktivieren Sie serverseitiges FastCGI-Caching mit Nginx und PHP