Docker快速搭建PHP+Nginx+Mysql环境

目录

文章写了很久了,慢慢整理一下发出来。

20170420111451_197.png

目标

部署好mysql,php,nginx,运行一个php程序

安装Docker

看这个:https://yeasy.gitbooks.io/docker_practice/

创建资源文件夹

既然安装好了Docker,我们创建容器后,我们需要映射一些配置文件或网站程序文件到宿主机,所以我们创建一些文件夹来存放这些东西,我是创建了以下这些文件夹,你可以按照自己平时的习惯来创建。

/data
  /mysql  存放数据库备份
  /nginx  nginx配置文件
    /conf
    /rewrite 伪静态
  /wwwroot  网站文件
  /wwwlogs  日志
  /source  程序源代码
  /download 下载目录

部署Mysql

1. 拉取镜像

# docker pull mysql:5.7

2. 运行容器

# docker run \
  -d \
  -p 3306:3306 \
  -e MYSQL_ROOT_PASSWORD=12345678910 \
  --name m_mysql mysql:5.7

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射,前面是映射到本地的端口,后面是需要映射的端口
-e 设置环境变量,MYSQL_ROOT_PASSWORD这里是设置mysql的root用户的初始密码
--name 容器的名字,随便取,但是必须唯一

ps:其实我们可以仅仅使用docker run命令就行了。docker run会先去pull,然后再create。个人习惯先把镜像pull下来,在run的时候会很快。

在实际项目中,不建议用docker启动mysql,除非你能抱枕数据安全,否则很容易数据丢失,性能也不能最大化。

3. 进入容器

# docker exec -it m_mysql /bin/bash

参数说明
-t 在容器里生产一个伪终端
-i 对容器内的标准输入 (STDIN) 进行交互

容器中默认是没有vim的,所以我们首先要安装vim,需要注意的是安装前记得先执行apt-get update命令,不然安装会出现问题。

4. 开启Mysql远程连接

这步你当然也可以不开启,可以使用ssh通道来连接,但是我这里记一笔。这里是5.7,注意了。

1.进入mysql

# mysql -uroot -p12345678910 

2.选择数据库

> use mysql

3.开启远程连接

> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
> FLUSH PRIVILEGES;

4.重启

# service mysqld restart

这样就可以通过公网IP连接了,如果还是不行,请看看防火墙(自身防火墙或者各大云服务商的安全组配置)。

部署PHP

1. 拉取镜像

# docker pull bitnami/php-fpm:7.0

2. 运行容器

# docker run \
  -d \
  -p 9000:9000 \
  -v /data/wwwroot:/usr/share/nginx/html \
  --link m_mysql:mysql \
  --name m_phpfpm bitnami/php-fpm:7.0

参数说明
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射
–-name 容器的名字,随便取,但是必须唯一
--link link 是在两个contain之间建立一种父子关系,父container中的web,可以得到子container db上的信息。
通过link的方式创建容器,我们可以使用被Link容器的别名进行访问,而不是通过IP,解除了对IP的依赖。

3. 创建php文件

在/data/wwwroot文件夹中创建一个文件夹default,代表一个默认的工作目录,在default中创建一个文件

# touch index.php

编辑index.php

<?php
  echo "hello!";
?>

这时候你进php容器,在/usr/share/nginx/html文件夹中也能看到我们创建的index.php文件,因为我们设置了目录映射。这样我们就可以直接在宿主机直接更改,而不用进容器修改。

配置Nginx

1. 拉取镜像

# docker pull nginx:1.11.10

2. 运行容器

我们先运行无挂载的容器,拿到nginx的一些配置文件

# docker run \
  -d \
  -p 80:80 \
  --name m_nginx nginx:1.11.10

成功后,我们可以进入容器看看,使用docker exec -it m_nginx /bin/bash进入容器,然后进入/etc/nginx/文件夹中,我们需要的挂载nginx.confconf.d文件夹中的配置文件,因为是我们平时需要频繁更改的配置,所以,我们将他们复制到宿主机上。

退出命令行,不要使用exit,因为exit会让容器停止。这里使用ctrl + p + q来退出容器。

然后使用docker cp操作复制出文件

# docker cp m_nginx:/etc/nginx/nginx.conf /data/nginx
# docker cp m_nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf

3. 删除之前运行的Nginx容器

# docker stop m_nginx
# docker rm m_nginx

4. 重新运行Nginx容器

# docker run \
  -d \
  -p 80:80 \
  -v /data/wwwroot:/usr/share/nginx/html \
  -v /data/nginx/nginx.conf:/etc/nginx/nginx.conf:ro \
  -v /data/nginx/conf:/etc/nginx/conf.d \
  -v /data/wwwlogs:/var/log/nginx \
  --link m_phpfpm:phpfpm \
  --name m_nginx nginx:1.11.10

参数说明:
-d 让容器在后台运行
-p 添加主机到容器的端口映射
-v 添加目录映射,这里最好nginx容器的根目录最好写成和php容器中根目录一样。但是不一点非要一模一样,如果不一样在配置nginx的时候需要注意
-–name 容器的名字
–-link 与另外一个容器建立起联系

5. 编辑配置文件

修改/data/nginx/conf/default.conf,我的配置如下:

server {
    listen       80;
    server_name  _;

    #charset koi8-r;
    access_log  /var/log/nginx/default_nginx.log  main;

    location / {
        root   /usr/share/nginx/html/default;
        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
    #
    location ~ \.php$ {
        root           /usr/share/nginx/html/default;
        fastcgi_pass   phpfpm:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_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;
    #}
}

配置文件中的fastcgi_pass phpfpm:9000;,因为我们在启动容器的时候--linkphpfpm容器,所以这里直接填phpfpm,就能找到phpfpm的IP,当然你也可以不配置--link,那么你可以这样找到容器IP,再将IP填入。

docker inspect 容器名或ID | grep "IPAddress"

最后,我们来测试一下配置是否成功

q1.png

安装phpMyAdmin

安装个phpMyAdmin,顺便测试一下MYSQL

1. 下载解压

下载地址:https://www.phpmyadmin.net/

解压到/data/wwwroot/default,并将文件夹重命名为phpMyAdmin

2. 配置phpMyAdmin

打开 libraries 目录下,找到config.sample.inc.php,改名为config.inc.php,用文本编辑器打开文件。

blowfish_secret中填入值,如:

$cfg['blowfish_secret'] = 'sadsadsadasffdsadfsa'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

host中填入数据库的访问IP,这里我填的Mysql容器的内网IP,你也可以填外网IP试试。

$cfg['Servers'][$i]['host'] = '172.17.0.2';

保存退出

3. 访问

访问http://外网IP/phpMyAdmin/index.php

q2.png

用数据库账号密码登录

q3.png

ojbk! icon_lol.png

2018.4.25 修改了以下,之前写的自己看着都恼火。 icon_mad.png

文章最后编辑时间为:2019-08-23 18:11:40

标签: php mysql recommend Docker nginx phpMyAdmin

声明:本博客如无特殊说明皆为原创,转载请注明来源:Docker快速搭建PHP+Nginx+Mysql环境谢谢!

相关文章

精彩评论
  1. 111 111  Ubuntu x64 Chromium 78.0.3904.108

    docker cp m_nginx:/etc/nginx/conf.d/default.conf /data/nginx/conf
    这一行应该是挂载目录吧,default.conf是文件 conf是目录 启动容器会失败的 改成下面这个了

    docker cp m_nginx:/etc/nginx/conf.d /data/nginx/conf

  2. Flicker Flicker  Mac OS X 10.14.2 Google Chrome 72.0.3626.109

    检查~ \.php$部分的配置,肯定是nginx配置问题或者php未正常启动。

  3. 木木的木头 木木的木头  Mac OS X 10.13.6 Google Chrome 72.0.3626.119

    按照你的配置了一下,访问php页面始终显示空白页面,html文件能正常访问,请问这是什么情况呢

  4. Flicker Flicker  Windows 10 x64 Edition Google Chrome 70.0.3538.110

    谢谢支持。

  5. 一片楚云 一片楚云  Windows 10 x64 Edition Firefox 64.0

    很好的文章

  6. Flicker Flicker  Windows 10 x64 Edition Google Chrome 69.0.3497.100

    下划线代表允许所有ip或域名进行访问匹配;dedecms访问不了静态文件请检查nginx是否配置正确。

  7. 阿伟 阿伟  Mac OS X 10.13.6 Google Chrome 69.0.3497.100

    nginx servername 的下划线变量是那里定义的啊 还有启动 dedecms后 静态文件访问不到了 icon_sad.png

  8. Flicker Flicker  Windows 10 x64 Edition Google Chrome 68.0.3440.106

    restart Mysql容器后,docker会关闭?

  9. Khao Khao  Mac OS X 10.12.6 Google Chrome 68.0.3440.106

    在拉mysql时候 修改完参数要求restart,但是docker会因为mysql的关闭而关闭。 icon_question.png icon_question.png icon_question.png

  10. Flicker Flicker  Windows 10 x64 Edition Google Chrome 68.0.3440.106

    谢谢您的反馈,现已修复该兼容性问题。 icon_wink.png

发表评论:

icon_question.pngicon_razz.pngicon_sad.pngicon_evil.pngicon_exclaim.pngicon_smile.pngicon_redface.pngicon_biggrin.pngicon_surprised.pngicon_eek.pngicon_confused.pngicon_cool.pngicon_lol.pngicon_mad.pngicon_twisted.pngicon_rolleyes.pngicon_wink.pngicon_idea.pngicon_arrow.pngicon_neutral.pngicon_cry.pngicon_mrgreen.png