为了学习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
查看创建的各容器:
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扩展名的选项:
如:安装扩展mysql
docker-php-ext-install 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 下载编译并安装
(省略中间过程。。。)