Docker演示之php+nginx+mysql环境搭建
- 前言
- MySQL镜像的下载及部署
- PHP镜像的下载及部署
- Nginx镜像的下载及部署
- 通过Nginx查看php脚本执行结果
前言
这里主要用于记录网上学习到的docker技术,具体讲解到了如何下载、启动mysql、php、nginx镜像,并且完成了三者之间的合作。具体视频点此处。
MySQL镜像的下载及部署
- 拉取镜像
docker pull mysql
- 使用该镜像启动容器
docker run -p 33066:3306 -v /Users/weihuanwen/software/DockerProject/StudyProject/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name=mysql mysql
- 这里需要强调以下几点:
①通过命令:docker inspect mysql查出Volumes下有mysql设置好的挂载点,即/var/lib/mysql
②启动mysql的命令中需要预先设定其root的密码,即加入-e参数
③这里是将本地的33066端口映射到了容器的3306端口 - 启动后观察事先创建好的mysql目录
- 构造数据
①创建数据库:test
②创建表:user,设置一个name字段
③插入几个名字
PHP镜像的下载及部署
- 拉取镜像
这里需要使用的是带有fpm的php:7.2-fpm版本镜像,通过前面的学习知道部署好的php环境中仍缺少插件pdo_mysql,所以这里将整个过程整理为Dokerfile文件来生成镜像即可。
①下面就是Dockerfile的内容:
②将写好的Dockerfile文件放置在事先创建好的php文件夹下
③在当前路径下执行镜像的构建命令
docker build -t php72-fpm .
④生成后的镜像如下
- 使用该镜像启动容器
docker run -itd -v /Users/weihuanwen/software/DockerProject/StudyProject/code/:/var/www/html --link mysql:mysql --name=php php72-fpm
这里需要强调以下几点:
①通过docker inspect php72-fpm未找到其提供的挂载点,但找到一个WorkingDir可用
②需要被挂载的本地目录code是事先创建好的,用于存放测试代码
③代码执行需要取mysq中的数据,所以需要与mysql进行关联
进入启动后的php容器内,可以看到代码已加载进入容器:
Nginx镜像的下载及部署
- 拉取镜像
docker pull nginx
- 启动nginx来获取其配置文件
# 启动nginx容器
docker run -itd -p 8888:80 --name=nginx nginx
# 进入容器,并获取配置文件的路径为:/etc/conf.d/default.conf
docker exec -it nginx /bin/bash
# 将该配置文件从容器拷贝到本地事先创建好的nginx目录下
docker cp nginx:/etc/conf.d/default.conf .
- 修改本地default.conf配置文件
server {
listen 80;
listen [::]:80;
server_name localhost;
#charset koi8-r;
#access_log /var/log/nginx/host.access.log main;
# 设置root变量
set $root '/var/www/html';
location / {
root $root;
index index.html index.htm;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/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
#
# 将127.0.0.1改为php
location ~ \.php$ {
root $root;
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $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;
#}
}
- 还需要强调以下几点!
①配置文件中修改了nginx的欢迎文件加载位置为/var/www/html,但目录下我们并没有index.html文件。这样就会导致nginx启动报错。所以,我们会在本地创建一个index.html,并在启动nginx时将此文件挂载至容器内。
②location ~ .php中也使用了root变量,这是应为root变量的值恰巧与php中代码存放路径一致而已。如果php中代码存放路径并非/var/www/html,这里也无法使用$root变量了。
③ocation ~ .php的php:9000中,php表示这php容器的ip地址。我们会在启动nginx时关联php容器并为其设置别名php,这也是配置文件中设置为php:9000的由来。
④nginx的日志我们最好挂载至本地方便查看,nginx容器中日志存放的位置:/var/log/nginx
⑤我们需要将本地code目录挂载至nginx的/var/www/html下,这样通过nginx访问code下的php文件时,会将其重定向至php容器的执行脚本 - 了解了以上的内容,我们来启动nginx容器
docker run -itd -p 8888:80 -v /Users/weihuanwen/software/DockerProject/StudyProject/nginx/default.conf:/etc/nginx/conf.d/default.conf -v /Users/weihuanwen/software/DockerProject/StudyProject/nginx/index.html:/var/www/html/index.html -v /Users/weihuanwen/software/DockerProject/StudyProject/nginx/logs/:/var/log/nginx/ -v /Users/weihuanwen/software/DockerProject/StudyProject/code/:/var/www/html --link php:php --name=nginx nginx
通过Nginx查看php脚本执行结果
- 打开浏览器输入网址:localhost:8888/index.php
这里产生了报错,因为8.0版本需要手动的去修改mysql容器内的root密码 - 进入mysql容器手动修改root密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';
- 打开浏览器再次输入网址:localhost:8888/index.php