将 Laravel 11 应用 Docker 化

2025-06-08

将 Laravel 11 应用 Docker 化

将 Laravel 应用程序 Docker 化并不像看起来那么简单,这就是为什么今天我将指导您完成为 2024 年的 Laravel 11 创建 Docker 镜像的过程。

为此,我们将使用 Docker Compose 配置一个完整的环境,确保我们的 Laravel 应用程序可以在任何环境中部署。

1.创建必要的配置文件

首先,请确保在项目中创建以下文件:

  • ./deploy/docker-compose.yml
  • ./部署/Dockerfile
  • ./部署/nginx.conf
  • ./部署/php.ini
  • ./.dockerignore

这些文件包含创建Docker镜像和管理容器所需的配置。

使用deploy目录是个人惯例;您可以选择任何您喜欢的名称。但是,请确保下面显示的配置与您保存文件的路径匹配。

1.1 构建 Dockerfile

Dockerfile定义了我们的 Laravel 应用程序的开发环境。在本例中,我们将其分为两个阶段:一个阶段是构建应用程序,另一个阶段是在生产环境中运行它(不一定),如下所示:

# deploy/Dockerfile

# stage 1: build stage
FROM php:8.3-fpm-alpine as build

# installing system dependencies and php extensions
RUN apk add --no-cache \
    zip \
    libzip-dev \
    freetype \
    libjpeg-turbo \
    libpng \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    nodejs \
    npm \
    && docker-php-ext-configure zip \
    && docker-php-ext-install zip pdo pdo_mysql \
    && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-enable gd

# install composer
COPY --from=composer:2.7.6 /usr/bin/composer /usr/bin/composer

WORKDIR /var/www/html

# copy necessary files and change permissions
COPY . .
RUN chown -R www-data:www-data /var/www/html \
    && chmod -R 775 /var/www/html/storage \
    && chmod -R 775 /var/www/html/bootstrap/cache

# install php and node.js dependencies
RUN composer install --no-dev --prefer-dist \
    && npm install \
    && npm run build

RUN chown -R www-data:www-data /var/www/html/vendor \
    && chmod -R 775 /var/www/html/vendor

# stage 2: production stage
FROM php:8.3-fpm-alpine

# install nginx
RUN apk add --no-cache \
    zip \
    libzip-dev \
    freetype \
    libjpeg-turbo \
    libpng \
    freetype-dev \
    libjpeg-turbo-dev \
    libpng-dev \
    oniguruma-dev \
    gettext-dev \
    freetype-dev \
    nginx \
    && docker-php-ext-configure zip \
    && docker-php-ext-install zip pdo pdo_mysql \
    && docker-php-ext-configure gd --with-freetype=/usr/include/ --with-jpeg=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    && docker-php-ext-enable gd \
    && docker-php-ext-install bcmath \
    && docker-php-ext-enable bcmath \
    && docker-php-ext-install exif \
    && docker-php-ext-enable exif \
    && docker-php-ext-install gettext \
    && docker-php-ext-enable gettext \
    && docker-php-ext-install opcache \
    && docker-php-ext-enable opcache \
    && rm -rf /var/cache/apk/*

# copy files from the build stage
COPY --from=build /var/www/html /var/www/html
COPY ./deploy/nginx.conf /etc/nginx/http.d/default.conf
COPY ./deploy/php.ini "$PHP_INI_DIR/conf.d/app.ini"

WORKDIR /var/www/html

# add all folders where files are being stored that require persistence. if needed, otherwise remove this line.
VOLUME ["/var/www/html/storage/app"]

CMD ["sh", "-c", "nginx && php-fpm"]
Enter fullscreen mode Exit fullscreen mode

请记住,如果您的应用程序有其他 PHP 扩展,则应在此文件的依赖项安装部分中添加它们。这可能仅在生产阶段才有必要,但在某些情况下,构建阶段也需要这样做。

1.2 添加docker-compose.yml文件

此文件定义了在 Docker 中运行 Laravel 应用程序所需的服务。在下面的 docker-compose.yml 中,我们定义了 Laravel 应用程序的服务以及 MySQL 数据库的服务。

记住按照步骤2创建环境变量,这对于您的应用程序正常工作非常重要。

# deploy/docker-compose.yml

version: '3.8'

services:
  laravel:
    restart: unless-stopped
    container_name: laravelapp
    build:
      context: ../
      dockerfile: ./deploy/Dockerfile
    # allocate as many volumes as necessary, if needed.
    volumes:
      - ../storage/app:/var/www/html/storage/app
    environment:
      APP_NAME: ${APP_NAME}
      APP_ENV: ${APP_ENV}
      APP_DEBUG: ${APP_DEBUG}
      APP_KEY: ${APP_KEY}
      APP_VERSION: ${APP_VERSION}
      APP_URL: ${APP_URL}
      DB_CONNECTION: mysql
      DB_HOST: database
      DB_PORT: 3306
      DB_DATABASE: ${DB_DATABASE}
      DB_USERNAME: ${DB_USERNAME}
      DB_PASSWORD: ${DB_PASSWORD}
      MAIL_MAILER: ${MAIL_MAILER}
      MAIL_HOST: ${MAIL_HOST}
      MAIL_PORT: ${MAIL_PORT}
      MAIL_USERNAME: ${MAIL_USERNAME}
      MAIL_PASSWORD: ${MAIL_PASSWORD}
      MAIL_ENCRYPTION: ${MAIL_ENCRYPTION}
      MAIL_FROM_ADDRESS: ${MAIL_FROM_ADDRESS}
      MAIL_FROM_NAME: ${MAIL_FROM_NAME}
    ports:
      - "8080:80"
    networks:
      - n-laravel
    depends_on:
      - database

  database:
    restart: unless-stopped
    image: mariadb:lts-jammy
    volumes:
      - v-database:/var/lib/mysql
    environment:
      MARIADB_DATABASE: ${DB_DATABASE}
      MARIADB_USER: ${DB_USERNAME}
      MARIADB_PASSWORD: ${DB_PASSWORD}
      MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
    networks:
      - n-laravel

volumes:
  v-database:


networks:
  n-laravel:
    driver: bridge
Enter fullscreen mode Exit fullscreen mode

在卷配置中,您可以添加或删除所需的卷。在本例中,仅添加了 storage/app 文件夹的卷,假设它可能是唯一需要持久化的文件夹。此外,如果您不需要它,也可以将其删除。

同样,您不一定非要使用目录作为卷;您可以毫无问题地使用 Docker 卷。

1.3 Nginx服务器配置

接下来,我们配置该nginx.conf文件来服务我们的 Laravel 应用程序。该文件定义了Nginx服务器配置以及如何处理对应用程序的请求。

# deploy/nginx.conf

server {
    listen 80 default_server;
    listen [::]:80 default_server;

    root /var/www/html/public;
    client_max_body_size 10M;
    add_header X-Frame-Options "SAMEORIGIN";
    add_header X-Content-Type-Options "nosniff";

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

    error_page 404 /index.php;

    location ~ \.php$ {
        fastcgi_pass 127.0.0.1:9000;
        fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
        include fastcgi_params;
    }
}
Enter fullscreen mode Exit fullscreen mode

1.4 PHP配置

如果您需要配置 PHP,可以通过该php.ini文件进行配置。如以下示例所示,其中最大文件上传大小设置为 10MB。

# deploy/php.ini
upload_max_filesize  = 10M
Enter fullscreen mode Exit fullscreen mode

1.5 添加.dockerignore文件

vendor此文件指定 Docker 在构建镜像时应忽略哪些文件或目录。例如,出于兼容性、时间等原因,复制是不合适的。

# .dockerignore
/deploy/docker-compose.yml
/deploy/Dockerfile
/.phpunit.cache
/node_modules
/public/build
/public/hot
/public/storage
/public/bucket
/storage/*.key
/vendor
.env
.env.example
.env.backup
.env.production
.phpunit.result.cache
Homestead.json
Homestead.yaml
auth.json
npm-debug.log
yarn-error.log
/.fleet
/.idea
/.vscode
.git
Enter fullscreen mode Exit fullscreen mode

2.环境变量配置

默认情况下,创建 Laravel 项目时,.env会创建一个包含开发所需环境变量的文件。

但是,如果您没有,则必须.env在项目根目录中创建一个文件,并定义应用程序所需的环境变量。以下链接展示了您的.env文件示例:https://github.com/laravel/laravel/blob/11.x/.env.example

在所有这些配置中,编辑数据库设置非常重要。编辑前的默认设置如下:

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
# DB_DATABASE=laravel
# DB_USERNAME=root
# DB_PASSWORD=
Enter fullscreen mode Exit fullscreen mode

我们需要将其更改为:

DB_CONNECTION=sqlite
# DB_HOST=127.0.0.1
# DB_PORT=3306
DB_DATABASE=laravel
DB_USERNAME=admin
DB_PASSWORD=admin
DB_ROOT_PASSWORD=root
Enter fullscreen mode Exit fullscreen mode

在这种情况下,我们忽略以下配置:DB_CONNECTIONDB_HOSTDB_PORT。原因是这些值已在docker-compose.yml文件中定义。

我们还添加了:DB_ROOT_PASSWORD,这对于正确构建 MySQL 映像至关重要,因为它需要用户密码root

请记住,这些环境变量很敏感,不应公开共享。此外,密码也应确保安全。

3.构建Docker镜像

完成上述所有配置后,就可以构建 Docker 镜像了。为此,我们将使用以下命令:

1. 构建并启动容器:

docker compose -f deploy/docker-compose.yml --env-file ./.env up --build
Enter fullscreen mode Exit fullscreen mode

2. 运行 Laravel 迁移:

docker exec -t laravelapp php artisan migrate
Enter fullscreen mode Exit fullscreen mode

3. 运行 Laravel 播种机:

在此步骤中,不仅运行命令就足够了,而且如果您正在使用该"fakerphp/faker"库,则需要修改composer.json文件以将库从开发依赖项列表移动到生产依赖项列表。

发生这种情况是因为在创建图像时,指示不安装开发依赖项,因此在运行命令时,它会显示找不到库的错误。

文件示例composer.json

前:

{
    "require": {
        ...
    },
    "require-dev": {
        "fakerphp/faker": "^1.23"
    }
}
Enter fullscreen mode Exit fullscreen mode

后:

{
    "require": {
        ...
        "fakerphp/faker": "^1.23"
    },
    "require-dev": {
        ...
    }
}
Enter fullscreen mode Exit fullscreen mode

需要澄清的是,这...意味着你的文件中可能包含更多依赖项。因此,你不应该复制它们。

现在,我们可以运行命令:

docker exec -t laravelapp php artisan db:seed
Enter fullscreen mode Exit fullscreen mode

4. 配置卷

此步骤仅适用于使用目录作为卷的情况。如果不是这种情况,则可以跳过此步骤。

如你所知,Dockerfile我们为应用程序的文件夹定义了一个卷storage/app。同样,在docker-compose.yml文件中,该卷被配置为一个用于存储持久文件的目录。

但是,您可能会遇到一个问题,当写入此目录时,您可能会收到权限错误。

发生这种情况是因为Nginx没有足够的权限写入该文件夹。我的解决方案是运行以​​下命令来修改并添加这些权限:

# first: change group (nginx)
sudo chown -R :81 storage/app
# second: change permissions
sudo chmod -R 775 storage/app
Enter fullscreen mode Exit fullscreen mode

如果您对为什么是这个数字感到好奇,那是因为它是Alpine Linux81中的 nginx 组 ID

5.访问应用程序

一旦您构建了图像并使用命令启动了容器,您就可以在浏览器docker compose中检查应用程序是否正常运行

确保访问 URL http://localhost:8080,如果一切正常,您将看到 Laravel 应用程序的主页。

结论

通过这些步骤,您将在 2024 年为 Laravel 11 应用程序创建 Docker 镜像。现在,您可以在任何环境中部署应用程序,而无需担心依赖项或服务器配置。

值得注意的是,您应该仔细验证是否需要在中添加更多依赖项Dockerfile以及修改应用程序可能需要的其他配置,无论是在 Nginx 中php.ini,还是在您使用的 PHP 版本中,都可能需要进行更改。

如有任何问题或建议,请随时发表评论。

鏂囩珷鏉ユ簮锛�https://dev.to/frankalvarez/dockerize-a-laravel-11-app-4g4a
PREV
使用 React Query 管理状态。〽️
NEXT
5 种创新开发工具,助您改善工作流程