Docker 是一个强大的工具,允许开发者创建容器化应用程序。容器化可以帮助简化开发和部署流程,以及更轻松地在多个环境中一致地运行应用程序。本文将演示如何使用 PHP 8.2、MySQL 和 Redis 来 dockerize 一个 Laravel 10 应用程序。
先决条件
在开始之前,请确保你的系统上安装了 Docker 和 Docker Compose。要开始,请按照你的操作系统的官方 Docker 安装说明进行操作。还需要一个 Laravel 10 应用程序。如果你还没有一个,可以按照官方 Laravel 文档来创建一个。
第 1 步:创建 Dockerfile
第一步是为 Laravel 应用程序创建 Dockerfile。在 Laravel 应用程序的根目录下创建一个名为 docker
的新目录,然后创建一个名为 Dockerfile
的新文件,并粘贴以下代码:
FROM php:8.2.3-fpm-alpine3.17
# Install required packages
RUN apk add --no-cache --virtual .build-deps \
$PHPIZE_DEPS \
build-base \
libpng-dev \
libzip-dev \
unzip \
linux-headers \
zip \
&& pecl install redis \
&& docker-php-ext-enable redis
# Install PHP extensions
RUN docker-php-ext-install \
pdo_mysql \
gd \
zip
# Set working directory
WORKDIR /srv/app
RUN addgroup -g 1000 -S docker && \
adduser -u 1000 -S docker -G docker
# Install composer dependencies
COPY --from=composer:latest /usr/bin/composer /usr/local/bin/composer
RUN set -eux; \
composer clear-cache
COPY ./docker-entrypoint.sh /docker-entrypoint.sh
RUN chmod +x /docker-entrypoint.sh
RUN chown -R www-data:www-data /srv/app
USER docker
# Expose port 9000 for PHP-FPM
EXPOSE 9000
ENTRYPOINT ["/docker-entrypoint.sh"]
# Start PHP-FPM
CMD ["/bin/sh"]
这个 Dockerfile
创建了一个 php:8.2-fpm 的基础镜像,并安装了 Laravel 依赖项,例如 Zip、Unzip 和所需的 PHP 扩展。它还安装了 Redis 并使 PHP Redis 扩展可用。
WORKDIR 指令将容器的工作目录定向到 /srv/app
,Laravel 应用程序将被安装在这里。
在启动 PHP-FPM 之前,Dockerfile 安装了 Composer、应用程序的依赖项和适当的权限,并暴露了端口 9000。
第 2 步:创建 docker-compose.yml 文件
下一步是创建一个 docker-compose.yaml
文件,定义 Laravel 应用程序的服务和网络。在 Laravel 应用程序的根目录中创建一个名为 docker-compose.yaml
的新文件,并粘贴以下代码:
version: '3.8'
services:
app:
container_name: dockerize-laravel-app
build: ./docker
volumes:
- '.:/srv/app'
command: ["webapp"]
depends_on:
- mysql
networks:
- dockerize-laravel
nginx:
container_name: dockerize-laravel-nginx
image: 'nginx:1.23.3-alpine'
depends_on:
- app
networks:
- dockerize-laravel
ports:
- '80:80'
- '443:443'
volumes:
- './docker/nginx/conf.d:/etc/nginx/conf.d:ro'
- './:/srv/app:ro'
mysql:
image: mysql:8.0.32
container_name: dockerize-laravel-mysql
ports:
- '3306:3306'
env_file:
- ./.env
environment:
MYSQL_ROOT_PASSWORD: ${DB_PASSWORD}
MYSQL_DATABASE: ${DB_DATABASE}
MYSQL_USER: ${DB_USERNAME}
MYSQL_PASSWORD: ${DB_PASSWORD}
networks:
- dockerize-laravel
volumes:
- dockerize-laravel-db-data:/var/lib/postgresql/data
redis:
image: redis:7.0.8-alpine3.17
container_name: dockerize-laravel-redis
ports:
- '6379:6379'
volumes:
- dockerize-laravel-redis-data:/data
networks:
- dockerize-laravel
healthcheck:
test: [ "CMD", "redis-cli", "ping" ]
volumes:
dockerize-laravel-db-data: {}
dockerize-laravel-redis-data: {}
networks:
dockerize-laravel:
driver: bridge
volumes 部分定义了将为 MySQL 和 Redis 数据创建的两个卷。
networks 部分定义了所有服务将使用的 dockerize-laravel
网络。
第 3 步:创建默认的 Nginx 配置文件
在 docker-compose.yml 文件中,我们定义了一个卷来挂载默认的 Nginx 配置文件。在 Laravel 应用程序的根目录下名为 docker
的目录中创建一个名为 nginx
的新目录。在 nginx
目录下,创建一个名为 default.conf
的新文件,并粘贴以下代码:
server {
client_max_body_size 100M;
listen 80 default;
server_name localhost;
root /srv/app/public;
index index.php;
access_log /var/log/nginx/sandbox-access.log;
error_log /var/log/nginx/sandbox-error.log debug;
location / {
# try to serve file directly, fallback to index.php
try_files $uri /index.php?$query_string;
gzip_static on;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass app:9000;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
internal;
}
location ~ \.php$ {
return 404;
}
}
这个 Nginx 配置文件定义了一个服务器块,监听端口 80,将服务器名称设置为 localhost,并将根目录设置为 /srv/app/public
。它还定义了两个位置块:一个用于提供静态文件,另一个用于使用 FastCGI 处理 PHP 文件。fastcgi_pass 指令指向端口 9000 上的 app
服务。
第 4 步:创建 docker-entrypoint.sh 文件
最后一步是创建一个 docker-entrypoint.sh
文件,该文件将用于启动 app 服务。在 Laravel 应用程序的 docker
目录中,创建一个名为 docker-entrypoint.sh
的新文件,并粘贴以下代码:
#!/bin/sh
set -e
# shellcheck disable=SC2120
webapp() {
echo "Starting PHP-FPM"
php-fpm
}
case "$1" in
"webapp")
webapp
;;
*)
exec "$@"
;;
esac
这个 shell 脚本定义了一个名为 webapp 的函数,它启动了 PHP-FPM 并将其设置为 app 服务的默认命令。
第 5 步:构建和运行容器
此命令将运行 Dockerfile 来构建 app 服务,为 MySQL 和 Redis 数据创建卷,并启动所有容器。终端中的输出应指示容器正在启动。
容器运行后,你可以通过在 Web 浏览器中访问 http://localhost 来访问你的 Laravel 应用程序。如果一切设置正确,你应该可以看到你的 Laravel 应用程序正在运行!
将 Laravel 应用程序 dockerize 可以轻松部署到不同的环境中,同时确保包含和正确配置了所有依赖项。通过这个配置,你可以轻松地扩展你的应用程序,同时独立管理数据库和缓存服务。
希望本文可以帮助你在 Docker 容器中运行 Laravel 应用程序。祝你编程愉快!
在 GitHub 上找到 boilerplate
评论(0)