参考文档

使用Docker搭建Laravel环境


利用docker快速搭建 laravel 环境

docker-compose

docker-compose.yml简单介绍

docker-compose是用来管理编排多个容器协作的。

通过docker-compose.yml来编排nginx、php、mysql之间的通信和协作。

在docker-lnmp目录下通过命令 docker-compose up 启动容器

然后通过 localhost或者localhost:8000就可以访问index.php了

Mysql

Mysql镜像直接来自与官方,没有做任何修改。
官方Mysql镜像构建参考

1
2
3
4
5
6
7
8
mysql: ### 容器名称
image: mysql:5.7 ### 官方镜像 版本号5.7
volumes:
- mysql-data:/var/lib/mysql ### 数据卷,mysql数据就存放在这里
ports:
- "3306:3306" ###端口映射,主机端口:容器对外端口
environment:
- MYSQL_ROOT_PASSWORD=123456 ### 设置环境变量,这个变量名是官方镜像定义的。

PHP

PHP镜像也来自与官方,但是官方镜像并没有提供连接Mysql相关的pdo_mysql扩展,这里做了一点修改,所以不能直接用image来依赖官方镜像,需要单独写一个Dockerfile来自定义PHP镜像。

1
2
3
4
5
6
7
8
9
php-fpm:
build:
context: ./php ### 自定义PHP镜像的配置目录
volumes:
- ./www:/var/www/html ### 主机文件与容器文件映射共享,PHP代码存这里
expose:
- "9000" ### 容器对外暴露的端口
depends_on:
- mysql ### 依赖并链接Mysql容器,这样在PHP容器就可以通过mysql作为主机名来访问Mysql容器了

自定义PHP镜像的配置文件 Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
### 来自官方的PHP镜像版本为7.1-fpm.
### 该版本只包含FPM不包括CLI,所以这里并不能执行composer
### 如果需要用PHP-CLI 需要再开一个CLI容器,或者安装同时包含FPM和CLI的版本
FROM php:7.1-fpm
### 设置环境变量
ENV TZ=Asia/Shanghai
### 执行bash命令安装php所需的扩展
RUN apt-get update && apt-get install -y \
libfreetype6-dev \
libjpeg62-turbo-dev \
libmcrypt-dev \
libpng12-dev \
### 这里是docker提供的安装php扩展的方法,在这里安装了pdo_mysql扩展还有GD库等
&& docker-php-ext-install -j$(nproc) iconv mcrypt mysqli pdo_mysql \
&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
&& docker-php-ext-install -j$(nproc) gd
### 扩展php.ini
COPY ./php.ini /usr/local/etc/php/conf.d/php.ini

Nginx

Nginx需要配置一个server,所以也需要一点简单的定制

1
2
3
4
5
6
7
8
9
10
nginx:
build:
context: ./nginx ### 自定义Nginx镜像的配置目录
volumes:
- ./www:/var/www/html 主机文件与容器文件映射共享,PHP代码存这里
ports:
- "80:80" ### 端口映射,如果你主机80端口被占用,可以用8000:80
- "443:443"
depends_on:
- php-fpm ### 依赖并连接PHP容器,这样在Nginx容器就可以通过php-fpm作为主机名来访问PHP容器了

自定义Nginx镜像的配置文件Dockerfile

1
2
3
4
5
FROM nginx:1.11 ### 官方镜像
ENV TZ=Asia/Shanghai ### 环境变量
COPY ./nginx.conf /etc/nginx/conf.d/default.conf ### server配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
server_name localhost;
root /var/www/html;
index index.php index.html index.htm;
location / {
try_files $uri $uri/ /index.php$is_args$args;
}
location ~ \.php$ {
try_files $uri /index.php =404;
### 主要是这里用 php-fpm:9000来访问PHP容器
fastcgi_pass php-fpm:9000;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
location ~ /\.ht {
deny all;
}
}

获取镜像

1
docker-compose pull

修改权限

1
sudo chown www-data:www-data -R www/

多docker 容器部署laravel 环境

> 获取和启动运行Lavavel应用程序,我们不仅仅需要一个可以运行PHP的web服务器,我们也需要能够运行PHP命令行应用程序的composer和artisan.也许还有更好运行环境的方式(例如浏览器).但是这是一个好的基础整合Dokcer和Laravel.每个进程都有一个自己的容器.

> 有分离的`composer`和`artisan`容器对我们来说真是一大优势,我们可以只选择推送`docker-laravel-data`,`docker-laravel-nginx`和`docker-laravel-phpfpm`容器到生产环境.

![流程图框图](/images/docker-lnmp-map.png)

docker-laravel-data

1
2
3
4
5
6
7
FROM debian:jessie
MAINTAINER "Dylan Lindgren" <dylan.lindgren@gmail.com>
RUN mkdir -p /data
VOLUME ["/data"]
CMD ["true"]

docker-laravel-nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
FROM debian:jessie
MAINTAINER "Dylan Lindgren" <dylan.lindgren@gmail.com>
WORKDIR /tmp
//Install Nginx
RUN apt-get update -y && \
apt-get install -y nginx
//Apply Nginx configuration
ADD config/nginx.conf /opt/etc/nginx.conf
ADD config/laravel /etc/nginx/sites-available/laravel
RUN ln -s /etc/nginx/sites-available/laravel /etc/nginx/sites-enabled/laravel && \
rm /etc/nginx/sites-enabled/default
//Nginx startup script
ADD config/nginx-start.sh /opt/bin/nginx-start.sh
RUN chmod u=rwx /opt/bin/nginx-start.sh
RUN mkdir -p /data
VOLUME ["/data"]
//PORTS
EXPOSE 80
EXPOSE 443
WORKDIR /opt/bin
ENTRYPOINT ["/opt/bin/nginx-start.sh"]

docker-laravel-phpfpm

Install Composer

1
2
3
RUN curl -sS https://getcomposer.org/installer | php
RUN mv composer.phar /usr/local/bin/composer
RUN chmod a+x /usr/local/bin/composer

Install MySQL package

1
2
3
4
5
RUN echo "mysql-server mysql-server/root_password password devpass" | debconf-set-selections
RUN echo "mysql-server mysql-server/root_password_again password devpass" | debconf-set-selections
RUN apt-get update && apt-get install -y mysql-server mysql-client
RUN usermod -d /var/lib/mysql/ mysql
RUN update-rc.d mysql defaults

Access-Control-Allow-Origin 解决跨域权限问题

Nginx 解决办法:
add_header Access-Control-Allow-Origin *;
add_header Access-Control-Allow-Headers X-Requested-With;
add_header Access-Control-Allow-Methods GET,POST,OPTIONS;
将这段代码添加到 http{} 或者静态资源对应的 server{} 中

如果只为自己的网站使用可以将第一行代码的星号改为自己的域名,例如 *.fbzl.org