Docker演示之php+nginx+mysql环境搭建
前言
这里主要用于记录网上学习到的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