reflexions/docker-laravel-fedora

为 Laravel 5 项目提供 Docker 和 Elastic Beanstalk 集成

dev-main 2024-09-18 16:01 UTC

README

reflexions/docker-laravel-fedora

Reflexions 提供

  • 仅依赖于 Docker
  • 支持使用 Sublime、PhpStorm、Eclipse 等编辑器进行编辑
  • 安装启动所需的所有内容 - laravel、php、数据库、imagemagick
    • 可以以空目录或现有的 laravel 项目开始
    • 无需通过 homebrew / MacPorts / .MSI / apt-get / yum 等安装 PHP
  • 无需使用 chmod 777 就可以解决权限错误

说明

1.) 安装 Docker 以获取 docker、docker-compose 和 Kitematic GUI。通过 Kitematic -> 文件 -> 打开 Docker 命令行终端 打开带有 docker 环境变量的终端

2.) 在项目目录中创建 docker-compose.ymldocker-compose.override.yml。定义 laravel 服务和任何所需的数据库服务

docker-compose.yml
version: '3'
services:
  laravel:
    image: reflexions/docker-laravel-fedora:9
    env_file: .env
    links:
      - database

  database:
    image: postgres:13
    env_file: .env
    environment:
      LC_ALL: C.UTF-8

覆盖文件不应提交到 git。它是用于在不同环境之间设置不同值。

docker-compose.override.yml
version: '3'
services:
  laravel:
    ports:
      - "80:80"
    volumes:
      - .:/var/www/laravel

  database:
    ports:
      - "5432:5432"

3.) 在项目目录中创建一个 .env 文件。

上面的 database 服务对应下面的 DB_HOST=database。您需要在 .env 示例中填写空白

# laravel service
APP_KEY=
DB_CONNECTION=pgsql
DB_HOST=database
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=

# database service
POSTGRES_DB=
POSTGRES_USER=
POSTGRES_PASSWORD=

4.) 获取一个 Github 个人访问令牌。将其提供为 GITHUB_TOKEN 环境变量

或者,创建一个仅用于构建的 GitHub 用户和 ssh 密钥,并将其复制到 /root/.ssh/id_rsa

4.) 使用一条命令下载镜像、创建服务容器并启动应用程序

docker-compose up

5.) (可选) APP_KEY

$ docker exec -it $(docker ps | grep reflexions/docker-laravel | awk '{print $1}') bash
root@4c0491540409:/var/www/laravel# php artisan key:generate

6.) (可选) Tinker

$ docker exec -it $(docker ps | grep reflexions/docker-laravel | awk '{print $1}') bash
root@4c0491540409:/var/www/laravel# php artisan tinker

概述

  • 首次运行时先运行设置脚本
  • 使用 github 凭证以避免 composer 速率限制错误
  • 如果缺少 app 目录,则下载新的 laravel 5.4
  • 添加对 reflexions/docker-laravel-fedora composer 包的依赖
  • 更新 bootstrap/app.php 以使用 Reflexions\DockerLaravel\DockerApplication 以防止权限错误

前端构建系统

这些(webpack、gulp 等)应在项目的 Dockerfile 中配置

Elastic Beanstalk

Dockerfile 添加到项目根目录以使用 Elastic Beanstalk 进行部署

FROM reflexions/docker-laravel-fedora:latest

MAINTAINER "Your Name" <your@email.com>

RUN /usr/share/docker-laravel-scripts/setup.sh

COPY . /var/www/laravel
WORKDIR /var/www/laravel

EXPOSE 80
ENTRYPOINT ["/usr/share/docker-laravel/bin/start.sh"]

这将定义一个应用程序容器。使用 RDS 创建数据库。将 .env 文件中的所有变量(包括 APP_KEY、DB_HOST 等)添加到 AWS 管理控制台 -> Elastic Beanstalk -> 您的环境 -> 配置 -> 软件配置

故障排除

问题:Mac OS X:无法连接到 docker 守护进程
$ docker-compose up
ERROR: Couldn't connect to Docker daemon - you might need to run `docker-machine start default`.
$

解决方案:使用 Kitematic -> 文件 -> 打开 Docker 命令行终端 打开终端。

问题:不喜欢 Docker 命令行终端

解决方案:运行 Kitematic -> 安装 Docker 命令。然后向 ~/.bash_profile 添加以下行

eval "$(docker-machine env dev)"
问题:.env 文件的更改似乎被 laravel 忽略

解决方案:重新启动集群。在 .env 文件中的设置仅在启动时读取。

$ docker-compose restart
问题:Mac OS X:非法指令 4
$ docker-compose up
Illegal instruction: 4
$

解决方案:这是 Docker Toolbox 在较老 CPU 上的已知问题。使用 pip 安装 docker-compose

问题:无法连接到数据库

解决方案

  • 检查DB_CONNECTION是否对应正确的laravel数据库驱动
  • 检查DB_HOST是否对应docker-compose.yml中列出的服务名称(例如,上面的示例中的"database")
问题:RuntimeException: 未找到支持的加密器。加密算法和/或密钥长度无效。

解决方案

  • 运行php artisan key:generate更新.env中的APP_KEY,然后重新启动容器。
问题:想要使用mysql而不是postgres

解决方案

  • 修改docker-config.yml以引用MySQL
version: '3'
services:
  laravel:
    image: reflexions/docker-laravel-fedora:26
    env_file: .env
    links:
      - database

  database:
    image: mysql:5.6
    env_file: .env
    environment:
      LC_ALL: C.UTF-8
docker-compose.override.yml
version: '3'
services:
  laravel:
    ports:
      - "80:80"
    volumes:
      - .:/var/www/laravel

  database:
    ports:
      - "3306:3306"
  • 修改.env以引用MySQL
DB_CONNECTION=mysql

# database service
MYSQL_ROOT_PASSWORD=
MYSQL_DATABASE=
MYSQL_USER=
MYSQL_PASSWORD=
问题:想要使用本地机器上已经运行的mysql(非docker)

解决方案

  • 修改docker-config.yml以删除数据库引用
  • 修改.env通过docker-machine主机IP地址(192.168.99.1)连接到MySQL
DB_CONNECTION=mysql
DB_HOST=192.168.99.1
DB_DATABASE=
DB_USERNAME=
DB_PASSWORD=
  • 确保在启动时将"bind_address"配置参数设置为0.0.0.0。这可以通过my.cnf设置,或者可以在启动脚本中硬编码。要检查值,请使用以下sql语句
show variables like 'bind_address';
  • 确保数据库用户有权从docker容器(通常为192.168.99.100)连接
CREATE USER 'username'@'192.168.99.100' IDENTIFIED BY 'password';
GRANT ALL PRIVILEGES ON application.* TO 'username'@'192.168.99.100';
FLUSH PRIVILEGES;