# 拉取相关镜像
docker pull nginx
docker pull php:7.4-fpm
docker pull mysql:5.6
# 运行镜像并挂载相关文件
docker run -d -p 3310:3306 --name mysql1 -v /Users/aiyaowei/docker/docker1/mysql/conf:/etc/mysql/conf.d -v /Users/aiyaowei/docker/docker1/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 mysql:5.6
docker run -p 9000:9000 --name php1 -v /Users/aiyaowei/docker/docker1/www/:/var/www/html --privileged=true -d --link mysql1 php:7.4-fpm
docker run -p 80:80 --name nginx1 -v /Users/aiyaowei/docker/docker1/www:/usr/share/nginx/html -v /Users/aiyaowei/docker/docker1/nginx/conf.d:/etc/nginx/conf.d --privileged=true --link php1 -d nginx
--name 名称
-p 本地端口:容器内端口
-v 本地路径:容器内路径
-d 后台运行
# 在相关挂载文件中配置
# 在/Users/aiyaowei/docker/docker1/nginx/conf.d中创建default.conf
server {
listen 80 default_server;
server_name localhost;
root /usr/share/nginx/html;
location / {
index index.php index.html index.htm;
autoindex off;
}
location ~ \.php(.*)$ {
root /var/www/html/;
fastcgi_pass php1:9000;
fastcgi_index index.php;
fastcgi_split_path_info ^((?U).+\.php)(/?.+)$;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info;
include fastcgi_params;
}
}
# fastcgi_pass可以写php容器名称:端口名,也可以写ip:端口名,ip的获取方法:docker inspect --format='{{.NetworkSettings.IPAddress}}' php1 #php1是php的容器名
# 这里root /usr/share/nginx/html是nginx容器内的路径;location ~ \.php(.*)$的root /var/www/html/是php容器内的路径;
# 部署网站的时候,比如是laravel框架,php相关文件会通过location ~ \.php(.*)$去解析,静态文件,比如css/image/js等是去的usr/share/nginx/html中的文件的
# 所以,nginx和php的某个本地的挂载文件路径是一致的
# 这里的配置文件不能错,有错误会造成nginx启动失败
# 如果后期用虚拟域名,如www.test.com,nginx配置文件修改好之后,需要去宿主机的etc/hosts上直接添加127.0.0.1 www.test.com即可,不用在nginx容器或php容器中添加
# 创建运行的php文件,在/Users/aiyaowei/docker/docker1/www中创建info.php
<?php
phpinfo();
?>
# 重启nginx,上面运行时将nginx容器命名为了nginx1
docker restart nginx1
# --------------------连接mysql--------------------
# 进入php的容器php1
docker exec -it php1 /bin/bash
# 进入/usr/local/bin目录
cd /usr/local/bin
# 安装mysql的相关扩展
./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysqli
# 进入/usr/local/etc/php,修改php.ini(如果没有php.ini文件,将php.ini-development或php.ini-production复制一下,把文件名改成php.ini即可)
cd /usr/local/etc/php
vim php.ini
# 如果容器内无vim命令,先更新下
apt-get update
# 然后安装
apt-get install vim
# 找到extension=mysqli与extension=pdo_mysql,取消前面的注释“;”
extension=mysqli
extension=pdo_mysql
# 重启php的容器,php1
docker restart php1
# 修改info.php
try {
$conn = new mysqli('容器内mysql的IP:端口', '账号', '密码','数据库');
echo "连接成功";
$conn->query("SET NAMES 'UTF8'");
$sql="SELECT * FROM ggw_user where id=1";
$rs=$conn->query($sql);
$row = $rs->fetch_array();
echo "<pre>";
print_r($row);
}catch(PDOException $e)
{
echo $e->getMessage();
}
如果需要多个php版本,将php搭建好之后,再创建nginx,通过--link来连接多个php容器,例:
docker run -p 9001:9000 --name php2 -v /Users/aiyaowei/docker/docker1/www/:/var/www/html --privileged=true -d --link mysql1 php:5.6-fpm
docker run -p 80:80 --name nginx2 -v /Users/aiyaowei/docker/docker1/www:/usr/share/nginx/html -v /Users/aiyaowei/docker/docker2/nginx/conf.d:/etc/nginx/conf.d --privileged=true --link php1 --link php2 -d nginx
docker run -p 6379:6379 -p 16379:16379 --name redis1 -v /Users/aiyaowei/docker/docker1/redis/data:/data -v /Users/aiyaowei/docker/docker1/redis/conf/redis.conf:/etc/redis/redis.conf -d redis:5.0.9-alpine3.11 redis-server /etc/redis/redis.conf
4b6d20beb8d84749070f997ac1eaa9ff8a25d5e4ad22d5e747881df72eba4ad3
Fatal error: Uncaught Error: Class 'mysqli' not found in /var/www/html/index.php:2 Stack trace: #0 {main} thrown in /var/www/html/index.php on line 2
原因:纯净的php中缺少扩展
解决:
进入容器
docker exec -it php /bin/bash
切换目录到
cd /usr/local/bin
安装扩展
./docker-php-ext-install pdo_mysql
./docker-php-ext-install mysqli
修改php.ini,取消extension=mysqli
与extension=pdo_mysql
前面的注释“;”
重启PHP容器
连接mysql测试:
try {
$conn = new mysqli('容器内mysql的IP:端口', '账号', '密码','数据库');
echo "连接成功";
$conn->query("SET NAMES 'UTF8'");
$sql="SELECT * FROM user where id=1";
$rs=$conn->query($sql);
$row = $rs->fetch_array();
echo "<pre>";
print_r($row);
}catch(PDOException $e)
{
echo $e->getMessage();
}
在使用docker容器时,有时候里边没有安装vim,敲vim命令时提示说:vim: command not found,这个时候就需要安装vim,可是当你敲apt-get install vim
命令时,提示:
Reading package lists... Done
Building dependency tree
Reading state information... Done
E: Unable to locate package vim
这时候需要敲:apt-get update
,这个命令的作用是:同步 /etc/apt/sources.list 和 /etc/apt/sources.list.d 中列出的源的索引,这样才能获取到最新的软件包。