首页
Preview

如何使用 Docker 将 Laravel 10 应用程序及其使用 PHP 8.2 和 MySQL 数据库容器化?

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

译自:https://medium.com/@andreic.dev/what-are-the-steps-to-containerize-a-laravel-10-application-with-php-8-2-87b2704c41cc

版权声明:本文内容由TeHub注册用户自发贡献,版权归原作者所有,TeHub社区不拥有其著作权,亦不承担相应法律责任。 如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

点赞(0)
收藏(0)
anko
宽以待人处事,严于律己修身。

评论(0)

添加评论