Docker演示之php+nginx+mysql环境搭建

  • 前言
  • MySQL镜像的下载及部署
  • PHP镜像的下载及部署
  • Nginx镜像的下载及部署
  • 通过Nginx查看php脚本执行结果


前言

这里主要用于记录网上学习到的docker技术,具体讲解到了如何下载、启动mysql、php、nginx镜像,并且完成了三者之间的合作。具体视频点此处

MySQL镜像的下载及部署

  1. 拉取镜像
docker pull mysql
  1. 使用该镜像启动容器
docker run -p 33066:3306 -v /Users/weihuanwen/software/DockerProject/StudyProject/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --name=mysql mysql
  1. 这里需要强调以下几点:
    ①通过命令:docker inspect mysql查出Volumes下有mysql设置好的挂载点,即/var/lib/mysql
    ②启动mysql的命令中需要预先设定其root的密码,即加入-e参数
    ③这里是将本地的33066端口映射到了容器的3306端口
  2. 启动后观察事先创建好的mysql目录
  3. 构造数据
    ①创建数据库:test
    ②创建表:user,设置一个name字段
    ③插入几个名字

PHP镜像的下载及部署

  1. 拉取镜像
    这里需要使用的是带有fpm的php:7.2-fpm版本镜像,通过前面的学习知道部署好的php环境中仍缺少插件pdo_mysql,所以这里将整个过程整理为Dokerfile文件来生成镜像即可。
    ①下面就是Dockerfile的内容:

    ②将写好的Dockerfile文件放置在事先创建好的php文件夹下
    ③在当前路径下执行镜像的构建命令
docker build -t php72-fpm .

④生成后的镜像如下

Dockerfile 构建nginx 镜像 docker php-nginx镜像的安装和配置使用_mysql

  1. 使用该镜像启动容器
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容器内,可以看到代码已加载进入容器:

Dockerfile 构建nginx 镜像 docker php-nginx镜像的安装和配置使用_nginx_02

Nginx镜像的下载及部署

  1. 拉取镜像
docker pull nginx
  1. 启动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 .
  1. 修改本地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;
    #}
}
  1. 还需要强调以下几点!
    ①配置文件中修改了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容器的执行脚本
  2. 了解了以上的内容,我们来启动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脚本执行结果

  1. 打开浏览器输入网址:localhost:8888/index.php

    这里产生了报错,因为8.0版本需要手动的去修改mysql容器内的root密码
  2. 进入mysql容器手动修改root密码
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

Dockerfile 构建nginx 镜像 docker php-nginx镜像的安装和配置使用_docker_03

  1. 打开浏览器再次输入网址:localhost:8888/index.php