将 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"]
请记住,如果您的应用程序有其他 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
在卷配置中,您可以添加或删除所需的卷。在本例中,仅添加了 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;
}
}
1.4 PHP配置
如果您需要配置 PHP,可以通过该php.ini
文件进行配置。如以下示例所示,其中最大文件上传大小设置为 10MB。
# deploy/php.ini
upload_max_filesize = 10M
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
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=
我们需要将其更改为:
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
在这种情况下,我们忽略以下配置:DB_CONNECTION
、DB_HOST
和DB_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
2. 运行 Laravel 迁移:
docker exec -t laravelapp php artisan migrate
3. 运行 Laravel 播种机:
在此步骤中,不仅运行命令就足够了,而且如果您正在使用该"fakerphp/faker"
库,则需要修改composer.json
文件以将库从开发依赖项列表移动到生产依赖项列表。
发生这种情况是因为在创建图像时,指示不安装开发依赖项,因此在运行命令时,它会显示找不到库的错误。
文件示例composer.json
:
前:
{
"require": {
...
},
"require-dev": {
"fakerphp/faker": "^1.23"
}
}
后:
{
"require": {
...
"fakerphp/faker": "^1.23"
},
"require-dev": {
...
}
}
需要澄清的是,这
...
意味着你的文件中可能包含更多依赖项。因此,你不应该复制它们。
现在,我们可以运行命令:
docker exec -t laravelapp php artisan db:seed
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
如果您对为什么是这个数字感到好奇,那是因为它是Alpine Linux
81
中的 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如有任何问题或建议,请随时发表评论。