使用Docker构建Laravel环境
使用Docker搭建Laravel开发环境
目录
-
- 环境准备
-
- 创建目录
-
- 创建docker-compose.yml文件
-
- 创建Dockerfile文件
-
- 创建PHP配置文件
-
- 创建Nginx配置文件
-
- 创建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