下载镜像
$ docker pull nginx
$ docker pull mysql:5.7
$ docker pull php:7.1-fpm
启动容器&配置&测试
MySQL
- 
    
启动容器,注意要添加 MYSQL_ROOT_PASSWORD 环境变量,用来设置 root 密码
$ docker run -d --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=password mysql:5.7 - 
    
创建测试 mysql 数据
$ docker exec -ti mysql /bin/bash # mysql -h host -u username -p mysql> USE mysql; mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION; mysql> FLUSH PRIVILEGES; mysql> CREATE DATABASE test; mysql> USE test; mysql> CREATE TABLE a ( mysql> id INT(11) NOT NULL AUTO_INCREMENT COMMENT '自增 ID', mysql> name VARCHAR(32) NOT NULL DEFAULT '' COMMENT '名称', mysql> PRIMARY KEY (id) mysql> ) ENGINE=InnoDB CHARSET=utf8; mysql> INSERT INTO a mysql> (name) VALUES mysql> ('aaa'), mysql> ('bbb'); 
PHP
- 
    
准备测试 php 文件
<?php # /workingDirectory/index.php # 将 new mysqli() 中的 host, username, password, dbname 改成对应的值 # 这里的 host 填写启动容器中的 --link mysql:mysql 配置的网络名称,此处为 mysql $db = new mysqli("mysql", "username", "password", "dbname"); $res = $db->query("select * from a"); while ($row = $res->fetch_assoc()) { print_r($row); } - 
    
启动容器,安装 mysqli 扩展,将 php 文件复制到容器对应目录中,有以下两种方法,推荐使用第二种,直接挂载数据卷
- 
        
没有数据卷挂载
$ docker run -d --name php -p 9000:9000 --link mysql:mysql php:7.1-fpm $ docker exec php docker-php-ext-install mysqli $ docker restart php $ docker exec php mkdir /usr/share/php # 根据自己的实际创建,DOCUMENT_ROOT $ docker cp /workingDirectory/index.php php:/usr/share/php/index.php - 
        
数据卷挂载,使用
-v参数将/var/www/html目录挂载到容器的/usr/share/php中,注意,使用数据卷要加上privileged=true,否则很可能会提示没有权限$ docker run -d --name php -p 9000:9000 --link mysql:mysql -v /var/www/html:/usr/share/php --privileged=true php:7.1-fpm $ docker exec php docker-php-ext-install mysqli $ docker restart php $ cp /workingDirectory/index.php /var/www/html/index.php 
 - 
        
 
Nginx
- 
    
启动容器,在容器内的
/etc/nginx/conf.d/default.conf文件中server模块内添加如下location{}配置,fastcgi_pass中的php是--link php:php启动参数中的连接名称$ docker run -d --name nginx -p 9999:80 --link php:php nginx $ docker cp nginx:/etc/nginx/conf.d/default.conf default.conf $ vim default.conf location ~ \.php$ { root /usr/share/php; # $document_root fastcgi_pass php:9000; # php 指的是 --link php:php 参数指定的网络名称 fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } $ docker cp default.conf nginx:/etc/nginx/conf.d/default.conf $ docker restart nginx 
测试
至此,基本的环境已经搭建好了。现在测试一下环境能否正常工作。nginx 容器启动时-p 9999:80参数指定了宿主机通过9999端口访问服务器。可以看到在访问index.php时,nginx 正确转发到 php-fpm 中了,mysqli 扩展也能正常工作。docker 下的 LNMP 环境已经搭建完成。

