Fork me on GitHub

Docker搭建LNMP环境

为了学习docker多容器的使用,以搭建Linux+Nginx+Mysql+PHP为例,讲述docker的详细搭建过程。

准备工作

下载需要的nginx(v1.12.2),mysql(latest),php(5.6.34-fpm)镜像

docker pull nginx:1.12.2
docker pull php:5.6.34-fpm
docker pull mysql

创建容器

创建mysql容器

docker run --name mysql
    -p 3306:3306
    -v /Users/jason/Desktop/mysql:/var/lib/mysql  #数据库数据挂载
    -e MYSQL_ROOT_PASSWORD=123456 #初始化mysql的root密码
    -d mysql  

创建php的fpm容器

docker run --name fpm 
    -p 9000:9000
    --link mysql:mysql
    -v /Users/jason/Sites:/Users/jason/Sites  #运行项目代码目录挂载
    -d php:5.6.34-fpm

创建nginx容器

docker run --name nginx
    -p 80:80
    -p 443:443
    -v /Users/jason/Source/conf.d:/etc/nginx/conf.d
    --link fpm:fpm
    --volumes-from fpm
    -d nginx:1.12.2

查看创建的各容器:
containers ps

Nginx配置

server {
        listen       80 default_server;
        server_name  localhost;

        charset utf-8;
        error_log /var/log/nginx/error_log;
        #access_log  /var/log/nginx/access_log  main;

        root   /var/www/web;
        index  index.php index.html index.htm;

        # pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
        location ~ \.php$ {
            include        fastcgi.conf;
            fastcgi_pass   fpm:9000;  #fpm创建的容器名称/docker-compose服务名称
            fastcgi_index  index.php;
        }
}

php连接Mysql

<?php
    $conf = array(
        'host'  => 'mysql', //容器名称/docker-compose服务名称
        'db'    => 'beecloud',
        'user'  => 'root',
        'pwd'   => '123456',
        'port'  => 3306
    );

    try{
        $conn = new mysqli( $conf['host'], $conf['user'], $conf['pwd'], $conf['db'], $conf['port']);
        if(mysqli_connect_errno()){
            exit(mysqli_connect_error());
        }

        mysqli_query($conn,"set names utf8");
        $sql = "SELECT * FROM bank";
        $rs = $conn->query($sql);

        $data = array();
        while ($row = $rs->fetch_assoc()){
            $data[] = $row;
        }
        echo '<pre>';
        print_r($data);die;
    }catch(Exception $e){
        echo $e->getMessage();
    }

在使用进行数据库连接时,提示缺少mysqli模块,即:

Fatal error: Class 'mysqli' not found in /var/www/web/mysql.php on line 12

进入容器php -m查看确实没有。PHP官方镜像提供了几个工具命令来帮助安装扩展,只是安装扩展前需要手动安装相应的依赖。
用docker-php-ext-install 安装PHP内核提供的扩展,安装可用php扩展名的选项:

docker php ext

如:安装扩展mysql

docker-php-ext-install mysql

docker php ext-mysql

用docker-php-ext-configure 自定义配置安装扩展时的配置参数,如:

docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/

用docker-php-ext-enable 可以将 extension=xxxxx.so加入php配置文件中如:
安装redis,但是发现docker-php-ext-install不包含redis,先使用pecl install redis 下载编译并安装

docker pecl redis
(省略中间过程。。。)
docker enbale redis

轻轻的我走了,正如我轻轻的来