如何使用 Docker 和 Docker Compose 使用 Nginx 和 MySQL 部署 PHP 应用程序

Docker 是一个开源容器化工具,允许我们使用容器创建、部署和运行应用程序。 容器允许我们将应用程序与所有必需的部分一起打包,并将其部署为单个包。 容器是可移植的,我们可以将它们部署在任何地方。 容器为开发人员带来了一个可以轻松共享的统一且流线型的工作环境。

在本指南中,我们将向我们展示如何使用 Docker 和 Docker Compose 使用 Nginx 和 MySQL 部署 PHP 应用程序。

先决条件

  • 云平台上的全新 Ubuntu 20.04 服务器
  • 在我们的服务器上配置的 root 密码

第 1 步 – 创建 云服务器

首先,登录到我们的 云服务器。 创建一个新服务器,选择 Ubuntu 20.04 作为至少 4GB RAM 的操作系统。 通过 SSH 连接到我们的云服务器并使用页面顶部突出显示的凭据登录。

登录到 Ubuntu 20.04 服务器后,运行以下命令以使用最新的可用软件包更新基本系统。

apt-get update -y

第 2 步 – 安装 Docker 和 Docker Compose

默认情况下,最新版本的 Docker 不包含在 Ubuntu 默认存储库中,因此我们需要将 Docker 存储库添加到我们的系统中。

首先,使用以下命令安装所需的依赖项:

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

接下来,使用以下命令添加 Docker 存储库:

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"

接下来,使用以下命令安装 Docker 和 Docker Compose:

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

完成后,我们可以继续下一步。

第 3 步 – 目录结构

出于本教程的目的,我们将使用以下目录结构:

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

第 4 步 – 创建 Nginx 容器

在开始之前,我们需要创建并启动一个 Nginx 容器来托管 PHP 应用程序。

首先,使用以下命令为我们的项目创建一个目录:

mkdir ~/docker-project

接下来,将目录更改为我们的项目并创建一个 docker-compose.yml 文件以启动 Nginx 容器。

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

添加以下行:

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

完成后保存并关闭文件。

上面的文件会下载最新的 Nginx 镜像,创建一个 nginx-container,并暴露在 80 端口。

接下来,使用以下命令启动 Nginx 容器:

docker-compose up -d

我们可以使用以下命令检查正在运行的容器:

docker ps

我们应该看到以下输出:

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

现在,打开我们的 Web 浏览器并使用 URL http://wer-server-ip 访问我们的 Nginx 容器。 我们应该在以下屏幕上看到 Nginx 测试页面:

第 5 步 – 创建 PHP 容器

首先,使用以下命令在项目中创建一个新目录:

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

接下来,创建一个 index.php 文件来验证我们的 PHP 版本。

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

添加以下行:

       
       
      Hello World!
       

       
      

Hello World!

保存并关闭文件,然后在项目目录中为 Nginx 创建一个目录:

mkdir ~/docker-project/nginx

接下来,创建一个 Nginx 默认配置文件来运行我们的 PHP 应用程序:

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

添加以下行:

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

保存并关闭文件。

接下来,在 nginx 目录中创建一个 Dockerfile。 这会将 Nginx 默认配置文件复制到 Nginx 容器。

nano ~/docker-project/nginx/Dockerfile

添加以下行:

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

接下来,编辑 docker-compose.yml 文件:

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

删除旧内容并添加以下内容:


nginx:
构建:./nginx/
容器名称:nginx 容器
端口:
– 80:80
链接:
– php
卷:
– ./www/html/:/var/www/html/

php:
图片:php:7.0-fpm
容器名称:php 容器
暴露:
– 9000
卷:
– ./www/html/:/var/www/html/


完成后保存并关闭文件。

上述文件将创建一个新的 php-container,将 PHP-FPM 暴露在 9000 端口,将 nginx-container 链接到 php-container,创建一个卷,并将其挂载到容器上,以便所有内容与容器的目录同步/var/www/html/.

现在,使用以下命令启动容器:

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

我们可以使用以下命令验证正在运行的容器:

docker ps

我们应该看到以下输出:

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

现在,打开我们的 Web 浏览器并访问 URL http://wer-server-ip。 我们应该会看到我们的 Hello World 页面:

接下来,我们将检查我们挂载的卷是否工作。 为此,请编辑 index.php 文件:

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

更改“Hello World! 已应用更改”:

       
       
      Hello World!
       

       
      

Hello World! Changes are Applied

现在,刷新我们的网页。 我们应该在屏幕上看到修改后的页面:

第 6 步 – 创建数据容器

如我们所见,我们已将目录 www/html 挂载到我们的容器 nginx-container 和 php-container。 但是,这不是正确的方法。 在本节中,我们将创建一个单独的数据容器来保存数据并将其链接到所有其他容器。

为此,请编辑 docker-compose.html 文件:

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

进行以下更改:

    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"

现在,使用以下命令重新创建并启动所有容器:

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

现在,使用以下命令验证所有正在运行的容器:

docker ps -a

我们应该看到以下输出:

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

第 7 步 – 创建 MySQL 容器

在本节中,我们将创建一个 MySQL 数据库容器并将其链接到所有其他容器。

首先,我们需要修改 PHP 映像并为 MySQL 安装 PHP 扩展,以便连接到 MySQL 数据库。

首先,使用以下命令为 PHP 创建一个目录:

mkdir ~/docker-project/php

接下来,创建一个 Dockerfile 来安装 PHP 扩展:

nano ~/docker-project/php/Dockerfile

添加以下行:

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

保存并关闭文件。 然后,编辑 docker-compose.yml 文件以创建 MySQL 容器和 MySQL 数据容器来保存数据库和表:

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

进行以下更改:

     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" 

保存并关闭文件。

接下来,编辑 index.php 文件并进行一些更改以测试数据库连接。

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

进行以下更改:

       
       
      Hello World!
        

       
      

Hello World!

query("SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_TYPE='BASE TABLE'"); $tables = $query->fetchAll(PDO::FETCH_COLUMN); if (empty($tables)) { echo "

There are no tables in database \"{$database}\".

"; } else { echo "

Database \"{$database}\" has the following tables:

"; echo "
    "; foreach ($tables as $table) { echo "
  • {$table}
  • "; } echo "
"; } ?>

保存并关闭文件,然后使用以下命令启动容器:

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

使用以下命令验证所有正在运行的容器:

docker ps -a

我们应该看到以下输出:

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

第 8 步 – 验证数据库连接

现在,打开我们的网络浏览器并访问位于 http://wer-server-ip 的网页。 我们应该看到以下屏幕:

如我们所见,mydb 数据库中没有任何表。

但是,实际上有一些表格,但普通用户看不到这些表格。 如果我们想查看它们,请编辑 index.php 文件并将 $user 更改为“root”,将 $password 更改为“secret”

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

更改以下行:

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

保存并关闭文件,然后刷新页面。 我们应该在以下屏幕上看到包含所有表的数据库:

在上述指南中,我们学习了如何使用 Docker 和 Docker Compose 使用 Nginx 和 MySQL 部署 PHP 应用程序。 我们现在应该能够使用 Docker 在生产环境中托管 PHP 应用程序; 在 的 VPS 主机帐户上试用。

© 版权声明
THE END
喜欢就支持一下吧
点赞6 分享
评论 抢沙发

请登录后发表评论