用Docker快速构建LNMP

用docker可以短时间内构建一个可用的轻量级环境容器。

配置Docker

安装Docker

直接去到官方选择对应的系统安装Docker官网
然后安装成功后,使用docker -v就可以验证安装了。

国内加速Docker

  1. Docker官方有中文的仓库镜像加速器[地址]
  2. 淘宝的阿里云有一个针对每一位用户的镜像加速器[登陆控制器-产品与服务-容器镜像服务-镜像加速器]

获取基本配置文件

因为docker安装官方的php容器,里面并没有内置的php.ini,所以我直接把php和nginx的配置文件提供并放在Github上。

1
git clone https://github.com/copriwolf/docker-lnmp.git

然后进入文件夹并开始操作

1
cd docker-lnmp

构建Mysql

1
2
3
4
# 从docker仓库拉取mysql映像
docker pull mysql
# 运行一个mysql容器
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=My-Mysql-Root -d mysql
  1. docker run mysql刨除其他的可选项就是这条命令最根本的,表示运行一个mysql映像的容器。
  2. --name表示要用mysql作为这个容器的名字
  3. -p表示暴露外界的端口,格式外界接口:容器接口
  4. -e表示设置环境变量,这里是设置Mysql的Root密码为My-Mysql-Root
  5. -d表示后台运行

构建PHP-FPM

1
2
3
4
# 从docker拉取最新的php-fpm映像
dokcer pull php:fpm
# 运行一个php-fpm
docker run --name php-fpm --link mysql:mysql -v ~/docker-lnmp/www:/var/www/html -v ~/docker-lnmp/conf/php/www.conf:/usr/local/etc/php-fpm.d/www.conf -v ~/docker-lnmp/conf/php/php.ini:/usr/local/etc/php/php.ini -d php:fpm
  1. --name表示要用php-fpm作为这个容器的名字
  2. --link表示连接了mysql这个容器,同时在本容器里面用mysql去替代关于数据库的调用。
  3. -v表示宿主机和docker机之间的映射关系,宿主机文件地址:docker机文件地址
  4. -d表示后台运行

构建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
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
server {
listen 80;
server_name _;
root /usr/www/html;
index index.php index.html index.htm;
#charset koi8-r;
#access_log /var/log/nginx/log/host.access.log main;
location / {
#root /usr/share/nginx/html;
#index index.php index.html index.htm;
try_files $uri $uri/ =404;
}
error_page 404 /404.html;
location = /40x.html {
root /usr/www/html;
}
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/www/html;
}
# proxy the PHP scripts to Apache listening on 127.0.0.1:80
#
#location ~ \.php$ {
# proxy_pass http://127.0.0.1;
#}
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
location ~ \.php$ {
fastcgi_pass php-fpm:9000;
fastcgi_index index.php;
# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
# deny access to .htaccess files, if Apache's document root
# concurs with nginx's one
#
location ~ /\.ht {
deny all;
}
}

要把网站的根目录指向一个我们指定好与php-fpm一样地址的目录。

  1. 要设定root地址
  2. 然后fastcgi-pass要设定应用过来的php-fpm,而不是指定特定的ip。
  3. fastcgi_param 也要改成一个变量的形式$document_root

构建一个nginx容器

1
2
3
4
# 从docker仓库拉取nginx映像
docker pull nginx
# 运行一个nginx
docker run --name nginx --link php-fpm -p 80:80 -v ~/docker-lnmp/www:/var/www/html -v ~/docker-lnmp/conf/nginx/default.conf:/etc/nginx/conf.d/default.conf -d nginx

测试

在本地的~/docker/www目录下创建一个index.php文件,里面的内容是:

1
2
3
<?php
phpinfo();
?>

如果显示正常,说明测试通过。

踩过的坑

  1. nginx与php-fpm在容器里面的地址必须要保持一直,才能让nginx正确加载php-fpm,以及php-fpm能够正确解析php文件。
  2. 如果使用了yii框架这种由框架内单一文件路由的方式驱动的网站,那么nginx的配置文件里就要写/var/www/html/web
  3. 如果docker里面的运行的框架,提示没有读写权限。就要使用docker exec -it php-fpm /bin/bash进入到php-fpm容器里面,然后给目录加权限chown -R www-data:www-data /vat/www/html
  4. 如果在docker里面运行mysql要填写mysql地址,请直接写mysql,因为我们在创建php-fpm容器时使用了命令--link mysql:mysql,等于把mysql容器链接过来,而且别名就叫做mysql,所以直接在mysql地址那里大胆填写mysql就可以调用了。
  5. 如果填写了正确的mysql配置,然后框架提示pdo模块没有找到,那说明php-fpm这个框架没有安装pdo扩展,这个时候,使用docker exec -it php-fpm /bin/bash进入到php-fpm容器里面,然后输入docker-php-ext-install pdo && docker-php-ext-install pdo_mysql && docker-php-ext-install mysqli来安装扩展,然后exit退出后,在宿主机使用命令docker restart php-fpm来重启php-fpm容器才能生效噢!
  6. 如果你发现他显示没有权限访问或者写入文件,要在docker run后面加一个参数,--privileged=true,因为使用该参数,container内的root拥有真正的root权限。否则,container内的root只是外部的一个普通用户权限。