在 Ubuntu 18.04 LTS 上使用 Nginx MySQL 和 Docker Compose 对 Laravel 进行 Docker 化在 Ubuntu 18.04 LTS 上使用 Nginx MySQL 和 Docker Compose 对 Laravel 进行 Docker 化在 Ubuntu 18.04 LTS 上使用 Nginx MySQL 和 Docker Compose 对 Laravel 进行 Docker 化在 Ubuntu 18.04 LTS 上使用 Nginx MySQL 和 Docker Compose 对 Laravel 进行 Docker 化
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

在 Ubuntu 18.04 LTS 上使用 Nginx MySQL 和 Docker Compose 对 Laravel 进行 Docker 化

在此页

  1. 第 1 步 - 安装 Docker 和 Docker Compose
  2. 第 2 步 - 下载 Laravel 并安装依赖项
  3. 第 3 步 - Docker 化 Laravel 项目
    1. - 定义 Laravel 应用服务
    2. - 定义 Nginx HTTP 服务
    3. - 定义 MySQL 数据库服务
    4. - 为 Laravel 创建 Nginx 虚拟主机
    5. - 为 Laravel 应用创建 Dockerfile

    Laravel 是一个免费开源的 PHP 框架,它实现了 MVC(模型-视图-控制器)设计模式。它的设计易于使用,允许开发人员立即创建简单和复杂的应用程序。 Laravel 由 Taylor Otwell 于 2011 年创建,旨在提供 CodeIgniter (CI) 框架的高级替代方案。 2011 年,Laravel 发布了版本 1 和版本 2,最新版本 5.6 带来了更多和改进的功能,例如命令行 (CLI) 支持命名为 artisan、支持不同的数据库系统、路由改进等。

    在本指南中,我们将向您展示如何使用 Ubuntu Server 18.04 上的 Docker Compose 将 Laravel 项目与 PHP-FPM、MySQL 数据库和 Nginx Web 服务器进行 Docker 化。我们将为 Laravel 项目创建一个新的 docker 镜像,然后创建包含一些服务的 docker-compose.yml 脚本,包括 App/Laravel 本身、Nginx 网络服务器和 MySQL 数据库。

    先决条件

    • Ubuntu 18.04
    • 根权限

    我们将要做什么:

    1. 安装 Docker 和 Docker Compose
    2. 下载 Laravel 并安装依赖项
    3. Docker 化 Laravel 项目
      • 定义 Laravel 应用服务
      • 定义 Nginx HTTP 服务
      • 定义 MySQL 数据库服务
      • 为 Laravel 创建 Nginx 虚拟主机
      • 为 Laravel 应用创建 Dockerfile
    4. 构建 Laravel 项目
    5. Laravel 安装后

    第 1 步 - 安装 Docker 和 Docker Compose

    首先,我们要将 Docker 和 Docker Compose 包安装到 Ubuntu 系统。我们将使用官方 Ubuntu 存储库中的 Docker 包。

    在继续之前,我们需要更新 Ubuntu 系统上的存储库。只需运行以下命令即可。

    sudo apt update

    现在使用下面的 apt 命令安装 Docker 和 Docker Compose 包。

    sudo apt install docker.io -y
    sudo apt install docker-compose -y

    Docker 和 Docker Compose 包现在应该安装在系统上,使用以下命令检查它。

    docker version
    docker-compose version

    结果,您将在系统上获得 Docker 和 Docker Compose 的版本。

    接下来,我们需要将非 root 用户分配到 docker 组,以便为非 root 用户运行 Docker 容器。

    对于这种情况,我们将通过运行以下命令将名为 hakase 的用户添加到 docker 组。

    usermod -a -G docker hakase

    之后,登录到 hakase 用户 shell 并运行 docker hello-world 命令。

    su - hakase
    docker run hello-world

    现在您将看到来自 Docker 的 Hello World 消息,并且 Docker 安装已经完成。

    第 2 步 - 下载 Laravel 并安装依赖项

    在这一步中,我们将把 Laravel 网络框架下载到 hakase 主目录,然后使用 PHP composer docker 镜像安装 Laravel 依赖项。因此,请确保您以非 root 用户身份登录到服务器。

    下载 Laravel 项目到 myapp 目录并进入。

    git clone https://github.com/laravel/laravel.git myapp/
    cd myapp/

    现在运行以下 docker 命令以安装 Laravel 依赖项。

    docker run --rm -v $(pwd):/app composer install

    使用上面的命令,我们将运行一个新的临时 docker 容器并将 myapp 项目目录挂载到容器上的 /app 目录。该容器基于 composer docker 镜像,并在该临时容器内使用 composer 命令安装 Laravel 依赖项。

    Laravel 依赖项安装完成后,我们必须使用下面的 sudo 命令将 myapp 目录的所有者更改为我们自己的用户。

    sudo chown -R $USER:$USER ~/myapp

    第 3 步 - Docker 化 Laravel 项目

    下载 Laravel 并安装其依赖项后,我们将创建一个新的 docker-compose.yml 脚本并为 Laravel 项目创建一个新的 Dockerfile。

    cd myapp/
    vim docker-compose.yml

    - 定义 Laravel 应用服务

    首先,我们将定义 Laravel 项目本身并使用 Dockerfile 为 Laravel 项目构建 docker 镜像。

    将 docker compose 脚本粘贴到其中。

    version: '3'
    services:

      #Laravel App
      app:
        build:
          context: .
          dockerfile: Dockerfile
        image: hakase-labs/laravel
        container_name: app
        restart: unless-stopped
        tty: true
        environment:
          SERVICE_NAME: app
          SERVICE_TAGS: dev
        working_dir: /var/www/html
        volumes:
          - ./:/var/www/html
        networks:
          - mynet

    Laravel 容器服务的详细信息:

    • Laravel 容器服务将命名为 app。它基于我们将使用 Dockerfile 创建的自定义 docker 镜像,新镜像将命名为 hakase-labs/laravel。
    • 我们想把myapp项目目录挂载到容器服务里面的/var/www/html。
    • 在我们的设置中使用自定义 docker 网络,该网络将被命名为 mynet。

    - 定义 Nginx HTTP 服务

    现在我们将定义 nginx 容器服务。

    在应用程序容器服务行之后粘贴以下配置。

      #Nginx Service
      nginx:
        image: nginx:alpine
        container_name: nginx
        restart: unless-stopped
        tty: true
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./:/var/www/html
          - ./nginx/conf.d/:/etc/nginx/conf.d/
          - ./nginx/ssl/:/etc/nginx/ssl/
        networks:
          - mynet

    nginx容器服务的配置细节:

    • 我们要基于 docker 镜像 nginx:alpine 创建一个名为 nginx 的新容器。
    • 容器服务将打开 HTTP 和 HTTPS 端口。
    • 容器将安装三个不同的卷。 myapp项目目录到/var/www/html目录,nginx虚拟主机配置nginx/conf.d/到/etc/nginx/conf.d目录,证书文件nginx/ssl/挂载到/etc/容器上的 nginx/ssl 目录。
    • 容器服务将使用同一个名为 mynet 的网络。

    - 定义 MySQL 数据库服务

    最后,我们定义了 MySQL 数据库服务。

    在 nginx 容器服务行之后粘贴以下配置。

      #MySQL Service
      db:
        image: mysql:5.7
        container_name: db
        restart: unless-stopped
        tty: true
        ports:
          - "3306:3306"
        environment:
          MYSQL_DATABASE: laraveldb
          MYSQL_USER: laravel
          MYSQL_PASSWORD: laravelpassworddb
          MYSQL_ROOT_PASSWORD: rootpasswordmysql
        volumes:
          - mysqldata:/var/lib/mysql/
        networks:
          - mynet

    #Docker Networks
    networks:
      mynet:
        driver: bridge
    #Volumes
    volumes:
      mysqldata:
        driver: local

    保存并关闭配置。

    详细 MySQL 容器服务:

    • MySQL 容器服务将命名为 db,基于 mysql:5.7 docker 镜像。
    • 数据库服务将打开默认的 MySQL 端口 3306。
    • Laravel 项目将根据 db 服务的环境变量使用数据库、用户和密码。
    • MySQL 数据库服务将装载名为 mysqldata 的卷,并具有相同的网络 mynet。
    • 并且我们使用网桥驱动程序定义自定义网络 mynet,mysql 数据卷将使用本地驱动程序。

    下面是完成的 docker-compose.yml 配置:

    version: '3'
    services:
    
      #Laravel App
      app:
        build:
          context: .
          dockerfile: Dockerfile
        image: hakase-labs/laravel
        container_name: app
        restart: unless-stopped
        tty: true
        environment:
          SERVICE_NAME: app
          SERVICE_TAGS: dev
        working_dir: /var/www/html
        volumes:
          - ./:/var/www/html
        networks:
          - mynet
    
      #Nginx Service
      nginx:
        image: nginx:alpine
        container_name: nginx
        restart: unless-stopped
        tty: true
        ports:
          - "80:80"
          - "443:443"
        volumes:
          - ./:/var/www/html
          - ./nginx/conf.d/:/etc/nginx/conf.d/
          - ./nginx/ssl/:/etc/nginx/ssl/
        networks:
          - mynet
    
      #MySQL Service
      db:
        image: mysql:5.7
        container_name: db
        restart: unless-stopped
        tty: true
        ports:
          - "3306:3306"
        environment:
          MYSQL_DATABASE: laraveldb
          MYSQL_USER: laravel
          MYSQL_PASSWORD: laravelpassworddb
          MYSQL_ROOT_PASSWORD: rootpasswordmysql
        volumes:
          - mysqldata:/var/lib/mysql/
        networks:
          - mynet
    
    #Docker Networks
    networks:
      mynet:
        driver: bridge
    #Volumes
    volumes:
      mysqldata:
        driver: local

    - 为 Laravel 创建 Nginx 虚拟主机

    在 myapp 项目目录中,创建一个名为 nginx 的新目录,它将包含另外两个目录 conf.d 和 ssl。然后在conf.d目录里面新建一个nginx虚拟主机配置laravel.conf。

    运行以下命令。

    mkdir -p nginx/{conf.d,ssl}
    vim nginx/conf.d/laravel.conf
    server {
        listen 80;
        server_name laravel.hakase-labs.io;
    
        return 301 https://laravel.hakase-labs.io$request_uri;
    }
    
    
    server {
        listen 443 ssl http2;
        server_name laravel.hakase-labs.io;
    
        ssl_certificate /etc/nginx/ssl/fullchain.pem;
        ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    
        # Log files for Debug
        error_log  /var/log/nginx/error.log;
        access_log /var/log/nginx/access.log;
    
        # Laravel web root directory
        root /var/www/html/public;
        index index.php index.html;
    
        location / {
            try_files $uri $uri/ /index.php?$query_string;
            gzip_static on;
        }
    
        # Nginx Pass requests to PHP-FPM
        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_split_path_info ^(.+\.php)(/.+)$;
            fastcgi_pass app:9000;
            fastcgi_index index.php;
            include fastcgi_params;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            fastcgi_param PATH_INFO $fastcgi_path_info;
        }
    }

    保存并关闭。

    之后,将您的 ssl 证书文件复制到 nginx/ssl/ 目录。

    sudo cp /path/to/ssl/fullchain.pem nginx/ssl/
    sudo cp /path/to/ssl/privkey.pem nginx/ssl/

    - 为 Laravel 应用程序创建 Dockerfile

    接下来,为 Laravel 项目创建一个新的 Dockerfile。

    运行以下命令。

    vim Dockerfile

    下面粘贴配置。

    # Set master image
    FROM php:7.2-fpm-alpine
    
    # Copy composer.lock and composer.json
    COPY composer.lock composer.json /var/www/html/
    
    # Set working directory
    WORKDIR /var/www/html
    
    # Install Additional dependencies
    RUN apk update && apk add --no-cache \
        build-base shadow vim curl \
        php7 \
        php7-fpm \
        php7-common \
        php7-pdo \
        php7-pdo_mysql \
        php7-mysqli \
        php7-mcrypt \
        php7-mbstring \
        php7-xml \
        php7-openssl \
        php7-json \
        php7-phar \
        php7-zip \
        php7-gd \
        php7-dom \
        php7-session \
        php7-zlib
    
    # Add and Enable PHP-PDO Extenstions
    RUN docker-php-ext-install pdo pdo_mysql
    RUN docker-php-ext-enable pdo_mysql
    
    # Install PHP Composer
    RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
    
    # Remove Cache
    RUN rm -rf /var/cache/apk/*
    
    # Add UID '1000' to www-data
    RUN usermod -u 1000 www-data
    
    # Copy existing application directory permissions
    COPY --chown=www-data:www-data . /var/www/html
    
    # Change current user to www
    USER www-data
    
    # Expose port 9000 and start php-fpm server
    EXPOSE 9000
    CMD ["php-fpm"]

    保存并关闭配置。

    并准备好构建 myapp Laravel 项目并运行我们定义的容器服务。

    第 4 步 - 使用 Nginx 和 MySQL 服务构建 Laravel

    使用以下命令为我们的 Laravel 项目构建自定义 docker 镜像。

    docker-compose build

    然后再次运行以下命令。

    docker-compose up -d

    它将根据需要下载所有 docker 镜像,然后根据 docker-compose.yml 配置构建容器服务。

    完成后,使用下面的 docker-compose 命令进行验证。

    docker-compose ps

    结果,您将启动并运行三个容器服务。在默认端口 9000 PHP-FPM 上运行的应用程序,服务 nginx 在 HTTP 和 HTTPS 端口上,MySQL 数据库服务在默认 MySQL 端口 3306 上。

    之后,再次验证所有可用的 docker 镜像和系统上的开放端口。

    docker-compose images
    netstat -plntu

    你会在列表中得到自定义的 docker 镜像 hakase-labs/laravel,HTTP 和 HTTPS 端口都处于 LISTEN 状态。

    第 5 步 - Laravel 安装后

    在此阶段之前,Laravel 项目作为 Docker 容器启动并运行。现在我们要创建一个新的 .env 文件,生成密钥并使用 Laravel 命令行 artisan 迁移 Laravel 数据。

    复制 .env 文件的示例并在容器内编辑它。

    cp .env.example .env
    docker-compose exec app vim .env

    更改数据库配置如下。

    DB_CONNECTION=mysql
    DB_HOST=db
    DB_PORT=3306
    DB_DATABASE=laraveldb
    DB_USERNAME=laravel
    DB_PASSWORD=laravelpassworddb

    保存并关闭。

    接下来,生成 Laravel 应用程序密钥并清除缓存配置。

    docker-compose exec app php artisan key:generate
    docker-compose exec app php artisan config:cache

    之后,使用以下命令迁移数据库。

    docker-compose exec app php artisan migrate

    确保没有错误。

    现在打开您的网络浏览器并输入您的项目的域名。

    http://laravel.hakase-labs.io/

    您将被重定向到安全的 HTTPS 连接,并将显示默认的 Laravel 主页,如下所示。

    最后,Laravel 项目与 Nginx Web 服务器和 MySQL 数据库的 Dockerizing 已成功完成。

©2015-2025 艾丽卡 support@alaica.com