使用Docker构建Laravel环境

使用Docker搭建Laravel开发环境

目录

    1. 环境准备

 

    1. 创建目录

 

    1. 创建docker-compose.yml文件

 

    1. 创建Dockerfile文件

 

    1. 创建PHP配置文件

 

    1. 创建Nginx配置文件

 

    1. 创建Laravel项目

 

    进行功能测试

请参考

使用Docker来构建Laravel开发环境。

环境准备

既然如此,还是试试用全新的EC2吧,可能更好。
最低限需要什么?所以我试了一下上次的复习,大概是这个感觉吧。

Dockerインストール
# sudo amazon-linux-extras install docker

Dockerサービス起動
# systemctl start docker.service

サービスの起動確認
# systemctl status docker

Dockerの自動起動設定
# systemctl enable docker

試しにDockerコマンド実行
# docker info
Docker Composeインストール
# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose

Docker Composeのインストールを確認
# docker-compose --version
docker-compose version 1.21.2, build a133471

这样看起来没问题。轻松自如呢。

创建目录

以下是所设想的结构:
项目
├ docker-compose.yml
├ docker
│  ├ php
│  │  ├ php.ini
│  │  └ Dockerfile
│  └ nginx
│    └ default.conf
└ 服务器

如所述。(加粗文字表示目录)

# cd /var
# mkdir project
# mkdir project/docker project/server
# mkdir project/docker/{php,nginx}
# ll -d `find ./project`
drwxr-xr-x 4 root root 34 Mar  5 02:51 ./project
drwxr-xr-x 4 root root 30 Mar  5 02:52 ./project/docker
drwxr-xr-x 2 root root  6 Mar  5 02:52 ./project/docker/nginx
drwxr-xr-x 2 root root  6 Mar  5 02:52 ./project/docker/php
drwxr-xr-x 2 root root  6 Mar  5 02:51 ./project/server

不一定非要用var,只是感觉用var的话比较好。

创建一个docker-compose.yml文件。


version: '3'

services:
  php:
    container_name: php
    build: ./docker/php
    volumes:
    - ./server:/var/www

  nginx:
    image: nginx
    container_name: nginx
    ports:
    - 80:80
    volumes:
    - ./server:/var/www
    - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
    depends_on:
    - php

  db:
    image: mysql:5.7
    container_name: db-host
    environment:
      MYSQL_ROOT_PASSWORD: root
      MYSQL_DATABASE: database
      MYSQL_USER: docker
      MYSQL_PASSWORD: docker
      TZ: 'Asia/Tokyo'
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
    volumes:
    - ./docker/db/data:/var/lib/mysql
    - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf
    - ./docker/db/sql:/docker-entrypoint-initdb.d
    ports:
    - 3306:3306

听说要做成这样子。
思考一下里面的内容。

使用PHP

 php:
   container_name: php  ①
   build: ./docker/php  ②
   volumes:
   - ./server:/var/www  ③

① 容器的名称
② 参考./docker/php目录下的Dockerfile
③ 将主机的./server和容器的/var/www进行挂载

nginx 是一款高性能的开源反向代理服务器和 Web 服务器,广泛用于构建可靠性更高、负载更平衡的网站和应用程序。

nginx:
  image: nginx  ①
  container_name: nginx  ②
  ports:
  - 80:80 ③
  volumes:
  - ./server:/var/www ④
  - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf ⑤
  depends_on:
  - php ⑥

① 指定 Docker 镜像
② 指定容器名称
③ 指定端口 PORT
④ 将主机的 ./server 目录与容器的 /var/www 目录进行挂载
⑤ 将主机的 default.conf 文件复制(或挂载)到容器内
⑥ 指定依赖关系。在此情况下,先运行 php 再运行 nginx。

数据库

db:
  image: mysql:5.7 ①
  container_name: db-host ②
  environment:
    MYSQL_ROOT_PASSWORD: root ③
    MYSQL_DATABASE: database ④
    MYSQL_USER: docker ⑤
    MYSQL_PASSWORD: docker ⑥
    TZ: 'Asia/Tokyo' ⑦
  command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci ⑧
  volumes:
  - ./docker/db/data:/var/lib/mysql ⑨
  - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf ⑩
  - ./docker/db/sql:/docker-entrypoint-initdb.d ⑪
  ports:
  - 3306:3306 ⑫

就数据库而言,实际上我想要使用RDS。
目前,我们只是先创建容器并使用它。

① Docker镜像的指定
② 容器的名称
③~⑦
各种环境变量。
也可以将其记录在另一个文件中,像”env_file: .env”这样指定。
(考虑到安全性等方面,这种方式可能更好)
⑧ 据说可以覆盖默认命令。
⑨~⑪
各种挂载
⑫ 指定端口

创建Dockerfile

在构建php容器时,使用以下的Dockerfile。

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client \
  && docker-php-ext-install zip pdo_mysql

#Composer install
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

请参阅Dockerfile参考文档以了解各行处理的详情。

创建一个php.ini文件

PHP的配置文件。

[Date]
date.timezone = "Asia/Tokyo"
[mbstring]
mbstring.internal_encoding = "UTF-8"
mbstring.language = "Japanese"

创建默认配置文件default.conf

Nginx的配置文件。

server {
  listen 80;
    index index.php index.html;
    root /var/www/public;

  location / {
    root /var/www/public;
    index  index.html index.php;
    }

  location ~ \.php$ {

    try_files $uri =404;
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass php:9000;
    fastcgi_index index.php;
    include fastcgi_params;
      fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
      fastcgi_param PATH_INFO $fastcgi_path_info;
  }
 }

创建一个Laravel项目

docker起動
# docker-compose up -d
ERROR: Service 'php' failed to build: The command '/bin/sh -c php composer-setup.php' returned a non-zero code: 1

摔倒了。
摔倒了之后,我以为它会自己恢复,但似乎没有恢复过来。

イメージ一覧を表示
# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              4744417607b3        10 minutes ago      472MB
php                 7.2-fpm             6ff5bc1d81f0        7 days ago          398MB

我在想他在哪里摔了一跤,所以查看了原文的评论。

如果遇到与自己一样的Composer安装问题的人,
我认为可以在下面的网站上确认并更改最新的哈希值,就可以成功安装了。
https://getcomposer.org/download/

嗯嗯,确实当我确认链接时发现哈希值不同。
※说实话,我对于直接写的事情有一点怀疑,但是如果我仔细追踪就好了。

由于Composer的安装在不同版本下哈希值会有所不同,每次都修改Dockerfile非常麻烦。为了避免这个问题,我们可以使用以下的方法,无需修改,非常方便!

# 変更前
RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
RUN php -r "if (hash_file('sha384', 'composer-setup.php') === 'a5c698ffe4b8e849a443b120cd5ba38043260d5c4023dbf93e1558871f1f07f58274fc6f4c93bcfd858c6bd0775cd8d1') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
RUN php composer-setup.php
RUN php -r "unlink('composer-setup.php');"
RUN mv composer.phar /usr/local/bin/composer

# 変更後
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

这是什么?天才吗?

FROM php:7.2-fpm
COPY php.ini /usr/local/etc/php/

RUN apt-get update \
  && apt-get install -y zlib1g-dev mariadb-client \
  && docker-php-ext-install zip pdo_mysql

#Composer install
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1

ENV COMPOSER_HOME /composer

ENV PATH $PATH:/composer/vendor/bin


WORKDIR /var/www

RUN composer global require "laravel/installer"

感觉好多了。
再试一次看看。

docker起動(2回目)
# docker-compose up -d
ERROR: Service 'php' failed to build: The command '/bin/sh -c composer global require "laravel/installer"' returned a non-zero code: 1

虽然有些问题,但是处理似乎比刚才要进展得多。在红字部分发现了这样的内容。

[ErrorException]
proc_open(): fork failed - Cannot allocate memory

我知道這個啊
當初在開始使用Laravel之前,就遇到了這個問題。
現在我面對和當時一樣的情況,所以如果發生相同的事情也不奇怪吧。

以前,我在这篇文章中找到了一个”启用Swap区”的方法,它起作用得很好。但是现在我正在使用Docker,不知道这个方法是否适用。
让我们试试看。

# /bin/dd if=/dev/zero of=/var/swap.1 bs=1M count=1024
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 14.0341 s, 76.5 MB/s

# /sbin/mkswap /var/swap.1
mkswap: /var/swap.1: insecure permissions 0644, 0600 suggested.
Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes)
no label, UUID=672b24c0-04f2-4b5b-b6ce-b3bd6ad3a764

# /sbin/swapon /var/swap.1
swapon: /var/swap.1: insecure permissions 0644, 0600 suggested.

准备好了。出发。

docker起動(3回目)
# docker-compose up -d
(略)
Creating php     ... done
Creating db-host ... done
Creating nginx   ... done

# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS                               NAMES
c111408c89a5        nginx               "nginx -g 'daemon of…"   2 minutes ago       Up 2 minutes                0.0.0.0:80->80/tcp                  nginx
1d5bc8716afa        mysql:5.7           "docker-entrypoint.s…"   2 minutes ago       Up 2 minutes                0.0.0.0:3306->3306/tcp, 33060/tcp   db-host
94d3abb55903        project_php         "docker-php-entrypoi…"   2 minutes ago       Up 2 minutes                9000/tcp                            php
93eae4fcf1cc        f959b6f2dc70        "/bin/sh -c 'compose…"   12 minutes ago      Exited (1) 11 minutes ago                                       upbeat_saha
7e3ab5b0fb47        4744417607b3        "/bin/sh -c 'php com…"   45 minutes ago      Exited (1) 45 minutes ago                                       sleepy_hellman
※下の2つはこけた時のなので、後で消した

大脑活跃不已

我们继续做下去吧。

phpコンテナに入る
# docker-compose up -d
root@94d3abb55903:/var/www#

Laravelプロジェクト作成
# laravel new
(略)
Application ready! Build something amazing.

我迅速地取得了成功。

确认行动

不要忘记事先修改EC2的安全组。

摔倒了。
(忘记截屏了,但)出现了类似Laravel的Permission Denied的提示。

需要更改Laravel相关目录的权限。虽然我会考虑安全性方面的问题,但目前还不需要考虑得太多,所以会无所顾忌地继续进行更改。

# sudo chmod 2775 /var/project/server
# find /var/project/server -type d -exec sudo chmod 2775 {} +
# find /var/project/server -type f -exec sudo chmod 0664 {} +
# sudo chmod -R 777 /var/project/server/storage/
# sudo chmod -R 777 /var/project/server/bootstrap/cache
20200305_DockerLaravelTest.PNG
广告
将在 10 秒后关闭
bannerAds