写在前面

前几天我写了一篇博客docker搭建nginx+php+mysql开发环境。当时主要是参考一片博文搭建记录的。

可是这样搭建出来是有一些问题的,具体的原因我还没找出。当然那篇文章还是有一些参考价值。

于是我又自己重新搭建了一个,踩了很多很多的坑,好在都解决了。

本文就是记录我的搭建过程,踩的坑,以及结合thinkphp项目存在的一些问题解决方案。

docker的好处我就不说了,和git一样,谁用谁知道。

本文参考的文章,会放在文末的参考。部分参考内容会在文中给出参考链接。

搭建

环境介绍

操作系统

Ubuntu 16.04 LTS

docker版本

Docker version 17.05.0-ce

项目结构参考

这里先给出项目结构参考树形图,有的内容是在搭建中产生的,故仅供参考,与后文内容结合看。

sail@codeBetter:~$ tree www -L 1

www

├── default.conf

├── Dockerfile

├── html

├── mysql

├── php.ini

└── www.conf复制代码

sail@codeBetter:~$ tree www -L 2

www

├── default.conf

├── Dockerfile

├── html

│   ├── coalball

│   ├── index.html

│   ├── index.php

│   └── mysql.php

├── mysql

│   ├── auto.cnf

│   ├── ca-key.pem

│   ├── ca.pem

│   ├── client-cert.pem

│   ├── client-key.pem

│   ├── coalball

│   ├── coalball.sql

│   ├── ib_buffer_pool

│   ├── ibdata1

│   ├── ib_logfile0

│   ├── ib_logfile1

│   ├── ibtmp1

│   ├── mysql

│   ├── performance_schema

│   ├── private_key.pem

│   ├── public_key.pem

│   ├── server-cert.pem

│   ├── server-key.pem

│   ├── sys

│   └── test_db

├── php.ini

└── www.conf

### 去掉一些无关内容

www

├── default.conf

├── Dockerfile

├── html

│   ├── coalball

│   ├── index.html

│   ├── index.php

│   └── mysql.php

├── mysql

│   ├── coalball.sql

├── php.ini

└── www.conf复制代码

MySQL

从 Dockerhub拉取 MySQL 镜像:

$ docker pull mysql复制代码

实例容器,启动数据库

$ docker run -p 3306:3306 --name mysql -v ~/www/mysql/:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d --privileged=true mysql

### 命令说明:

-p 3306:3306:将容器的3306端口映射到主机的3306端口

-v ~/www/mysql/:/var/lib/mysql:将主机当前用户目录下的mysql文件夹挂载到容器的/var/lib/mysql 下,在mysql容器中产生的数据就会保存在本机mysql目录下

-e MYSQL_ROOT_PASSWORD=123456:初始化root用户的密码

-d 后台运行容器

--name 给容器指定别名

--privileged=true 可能会碰到权限问题,需要加参数复制代码

Nginx

从 Dockerhub拉取 Nginx 镜像:

$ docker pull nginx复制代码

实例容器,启动Nginx

$ docker run --name nginx -p 80:80 -d nginx

运行成功后,终端会返回容器的ID号,上面的命令中,

run:创建一个新的容器

--name:指定容器的名称(如果留空,docker会自动分配一个名称)

-p:导出容器端口到本地服务器,格式:-p :。在本例中,我们映射容器的80端口到本地服务器的80端口。

nginx:是 Dockerhub 上下载nginx镜像名称(如果本地没有可用的镜像,Docker会自动下载一个)

-d:后台启动。复制代码

通过浏览器浏览:http://localhost 就会看到Nginx欢迎界面。

几个命令介绍

$ docker ps -a # 查看正在运行的容器

$ docker ps # 查看容器

$ docker stop nginx # 停止正在运行的容器

$ docker start nginx # 启动一个已经停止的容器

$ docker start nginx # 重启一个容器

$ docker rm nginx # 删除容器复制代码

映射HTML路径

默认情况下,Docker nginx服务器的HTML路径(网站根目录)在容器/usr/share/nginx/html目录下,现在需要把这个目录映射到本地服务器的~/www/html目录。在上面命令的基础上加上-v参数,具体如下:

## 先删除之前的容器

$ docker rm nginx

$ docker run --name nginx -p 80:80 -d -v ~/www/html:/usr/share/nginx/html nginx复制代码

-v的参数格式为::。

在~/www/html下创建一个index.html文件,内容随意

比如 hello world

在浏览器上访问 http://localhost,刷新一下就可以看到新的内容了。

配置 Nginx

Nginx的强大很大部分体现在配置文件上,对于一些高级的应用来说,自定义Nginx非常重要。所以,我们需要把Nginx的配置文件复制到本地服务器目录:

$ cd ~/www

$ docker cp nginx:/etc/nginx/conf.d/default.conf default.conf复制代码

再加一个-v参数,把本地的配置文件映射到容器上,在重启容器:

$ docker stop nginx

$ docker rm nginx

$ docker run --name nginx -p 80:80 -v ~/www/html:/usr/share/nginx/html -v ~/www/default.conf:/etc/nginx/conf.d/default.conf -d nginx复制代码

如果配置文件有修改,需要重启容器生效:

$ docker restart nginx复制代码

这样就可以直接在本地修改配置文件了。

PHP-FPM

从 Dockerhub拉取 PHP-FPM 镜像:

$ docker pull php:fpm复制代码

实例容器,启动php:fpm

$ docker run --name php-fpm -p 9000:9000 -d php:fpm复制代码

把配置文件复制到本地:

$ cd ~/www

$ docker cp php-fpm:/usr/local/etc/php-fpm.d/www.conf www.conf

$ docker cp php-fpm:/usr/src/php/php.ini-production php.ini复制代码

这里要特别注意一下,php-fpm:/usr/src/php/php.ini-production,在实例出的容器中,不一定是路径src/php,拉取的php:fpm版本镜像不同,php.ini路径不同。

可以这样查看php.ini路径

# 先进入容器

$ docker exec -it php-fpm bash

$ cd /usr/src/ && ls

# 有以下两个文件

php.tar.xz php.tar.xz.asc

# 这里我们需要解压php.tar.xz文件,因为php.ini-production就在其中

//先解压xz

xz -d php.tar.xz

//再解压tar

# tar -xvf php.tar复制代码

解压完毕后, php.ini-production便出现了,我当时的路径是/usr/src/php-7.1.9/php.ini-production。

即,前文中的

$ docker cp php-fpm:/usr/src/php/php.ini-production php.ini

改为

$ docker cp php-fpm:/usr/src/php-7.1.9/php.ini-production php.ini复制代码

在本地服务器修改 php.ini 的内容,设置cgi.fix_pathinfo=1(要先删除前面的;注释符)。

前面关于php-fpm的一系列操作主要是为了获得配置文件,并没有挂载本地目录到容器中,所以接下来需要删除容器,重新实例一个容器出来

$ docker stop php-fpm

$ docker rm php-fpm

$ docker run --name php-fpm -p 9000:9000 --link mysql:mysql -v ~/www/html:/var/www/html -v ~/www/www.conf:/usr/local/etc/php-fpm.d/www.conf -v ~/www/php.ini:/usr/local/etc/php/php.ini -d php:fpm复制代码

配置Nginx

修改Nginx的配置文件,也就是前面我们从容器中复制出的default.conf

server {

listen 80;

server_name _;

root /usr/share/nginx/html;

index index.php index.html index.htm;

#charset koi8-r;

#access_log /var/log/nginx/log/host.access.log main;

location / {

#root /usr/share/nginx/html;

#index index.php index.html index.htm;

try_files $uri $uri/ =404;

}

error_page 404 /404.html;

location = /40x.html {

root /user/share/nginx/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 /var/www/html/;

fastcgi_pass php-fpm:9000;

fastcgi_index index.php;

# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

}

# deny access to .htaccess files, if Apache's document root

# concurs with nginx's one

#

location ~ /\.ht {

deny all;

}

}复制代码

关于配置文件,有个需要注意的地方

location ~ \.php$ {

root /var/www/html/;

fastcgi_pass php-fpm:9000;

fastcgi_index index.php;

# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;

include fastcgi_params;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

}

include fastcgi_params;

要放在

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

的前面复制代码

删除刚才的nginx容器,重新生成一个

$ docker stop nginx

$ docker rm nginx

$ docker run --name nginx -p 80:80 --link php-fpm -v ~/www/html:/usr/share/nginx/html -v ~/www/default.conf:/etc/nginx/conf.d/default.conf -d nginx复制代码

在 ~/www/html 下创建 index.php

phpinfo();复制代码

浏览器访问http://localhost

上面的讲述基本描述了如何搭建一个基本的php+nginx+mysql的开发环境。

然而在实际开发中,还是有问题的,比如php需要安装的一系列的扩展,比如pdo_mysql,我们可以通过编写Dockerfile的方式来定制镜像

编写Dockerfile

这里我们再看一下前面展示的项目结构

www

├── default.conf

├── Dockerfile

├── html

│   ├── coalball

│   ├── index.html

│   ├── index.php

│   └── mysql.php

├── mysql

│   ├── coalball.sql

├── php.ini

└── www.conf复制代码

Dockerfile如下

FROM php:5.6-fpm

ADD www.conf /usr/local/etc/php-fpm.d/www.conf

ADD php.ini /usr/src/php/php.ini

RUN apt-get update && apt-get install -y \

libfreetype6-dev \

libjpeg62-turbo-dev \

libmcrypt-dev \

libpng12-dev \

&& docker-php-ext-install -j$(nproc) iconv mcrypt \

&& docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \

&& docker-php-ext-install -j$(nproc) gd \

&& docker-php-ext-install pdo_mysql

EXPOSE 9000复制代码

依旧先删除之前的php-fpm容器

$ docker stop php-fpm

$ docker rm php-fpm

# 构建 运行

# 进入项目的目录,比如我的www文件夹就是建在/home/username下的

$ cd ~/www

$ docker build -t php-fpm:v1 ./

$ docker run --name php-fpm -p 9000:9000 --link mysql:mysql -v ~/www/html:/var/www/html -v ~/www/www.conf:/usr/local/etc/php-fpm.d/www.conf -v ~/www/php.ini:/usr/local/etc/php/php.ini -d php:fpm

即可复制代码

当然具体需要哪些扩展还是根据自己的需求来编写Dockerfile。

结合thinkphp

前面的内容就基本搭建好了开发环境,这里我仅仅谈跑tp项目遇到一些坑(包括一些容器内的坑),做些记录与分享

因为这部分踩的坑比较多,或许记得不太清楚,仅作参考,文末会留下一些参考链接

How to install the locate command?

如果 在容器中 下载东西失败,且提示没有locate命令

$ apt-get update

$ apt-get install mlocate复制代码

然而此时执行locate寻找一些文件还会有些问题

locate: can not stat () `/var/lib/mlocate/mlocate.db’: No such file or directory

更新下数据库

$ updatedb

# 一次不行的话,多执行几次该命令复制代码

Undefined class constant ‘MYSQL_ATTR_INIT_COMMAND’

修改配置文件php.ini

把以下这几项配置都开启,如果你的配置文件(php.ini)中没有,自行添加

extension=php_mysqli.dll

extension=php_pdo.dll

extension=php_pdo_mysql.dll

extension=pdo.so

extension=pdo_mysql.so

# 如果pdo_mysql扩展安装失败

可以执行

docker-php-ext-install pdo_mysql复制代码

No such file or directory

如果访问站点,出现这个错误,可以看看你的phpinfo页面,是否

pdo_mysql.default_socket是否有Local Value 和 Master Value

没有的话,先进入mysql容器中的mysql

$ docker exec -it mysql bash

$ mysql -u root -p

# enter your password复制代码

执行

mysql> STATUS;

记录下UNIX socket的值

在你的php.ini文件将以下的几项配置为UNIX socket的值,没有自行添加

pdo_mysql.default_socket

mysql.default_socket

mysqli.default_socket

## 示范

mysqli.default_socket = /var/run/mysqld/mysqld.sock复制代码

### 这里可以跳过,个人记录

creating a symbolic link in: /var/mysql (create the directory if it does not exist)

cd /var/mysql && sudo ln -s /Applications/MAMP/tmp/mysql/mysql.sock

This fixed it for me. I'm not using MAMP though, so it was cd /var/mysql && sudo ln -s /tmp/mysql.sock复制代码

SQLSTATE[HY000]: General error

SQLSTATE[HY000] [2002]

SQLSTATE[HY000] [2002] Connection refused

最后如果项目出现了这类问题,还需要修改项目配置文件的有关数据的配置

'DB_HOST'=>'xxx',//数据服务器地址

如果用的是虚拟主机,容器的话,’DB_HOST’ => ‘’,这一项应该填数据库的主机地址,而不是本机地址的localhost或者127.0.0.1

执行

docker inspect --format='{{.NetworkSettings.IPAddress}}' $CONTAINER_ID

即可获得容器IP

但是容器的ip每次启动都会改变,知道容器ip没什么意义!

但是容器的ip每次启动都会改变,知道容器ip没什么意义!

但是容器的ip每次启动都会改变,知道容器ip没什么意义!复制代码

这样配置即可,前提是你的容器命名为mysql

'DB_HOST'=>'mysql',//数据服务器地址复制代码

写在最后

以上就是搭建的大致记录。

当然可以自己写一份docker-compose.yml使整个搭建过程自动化起来,只需要敲击几个命令即可,必行每次写shell也挺麻烦的。因为时间原因,这儿我就没写了。

也可以发布成镜像,这样就可以一次搭建环境,永久使用了,下次重装了系统,拉取下即可。

讨论请发邮件到 lichanghangcumt@gmail.com

未经授权,禁止转载

通过支付宝 15262042918 赞助此文

mysql sail_再谈docker搭建nginx+php+mysql开发环境 | Sail相关推荐

  1. Docker搭建 Nginx+PHP+MySQL 环境并部署WordPress实践

    本文给大家分享的是作者基于Docker搭建 Nginx+PHP+MySQL 环境并部署WordPress的详细过程,非常的全面,有需要的小伙伴可以参考下 Docker基于LXC实现了把软件封装到一个完 ...

  2. win7下搭建nginx+php的开发环境

    win7下搭建nginx+php的开发环境,需要的朋友可以参考下 一.下载相关软件 nginx下载:http://nginx.org/en/download.html nginx常见异常:http:/ ...

  3. docker搭建nginx+php+mysql环境

    1.安装docker https://www.runoob.com/docker/centos-docker-install.html #启动docker systemctl start docker ...

  4. Docker入门指南:基于 docker 搭建机器学习/深度学习开发环境

    实际工作中,许多项目开发需要在Linux服务器上进行,本文为习惯使用 Windows 操作系统的朋友介绍一种基于Docker的,跨平台.便携性(方便移植.重新部署.可远程访问)的开发环境搭建方法. 1 ...

  5. hhvm mysql_Linux_在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程,貌似最近这个HHVM特别火,其主 - phpStudy...

    在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程 貌似最近这个HHVM特别火,其主要原因大概要归咎于大的运行效率吧,安装完之后使用探针测试,计算运行的时间都是0.0*的级别,据说 ...

  6. 使用docker 搭建Nginx服务器,照做就行

    大家好,今天分享使用docker 搭建Nginx服务器 首先,我们使用的是vm 虚拟机搭建的Linux (我不是使用云主机做的) 然后,我们要在Linux上开放一个端口,用于外界(外网)访问 在Lin ...

  7. nginx搭建文件服务器脚本,基于docker搭建nginx文件服务器的方法步骤

    1.在本机新建配置文件docker_nginx.conf server { listen 7070; server_name localhost; charset utf-8; location /f ...

  8. Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境

    Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...

  9. nginx nodejs环境配置_基于docker的nodejs、php开发环境,包含多种组合安装

    dnnmmp 基于docker的nodejs.php开发环境 (docker,nodejs,php,nginx,mongo,mysql,redis) Dnnmmp包含以下组合 dnm(Docker + ...

最新文章

  1. 如何在windows xp下使用ntfs权限控制
  2. 批量启动关闭MS SQL 2005服务BAT
  3. react滑动切换tab动画效果_[React Native]react-native-scrollable-tab-view(入门篇)
  4. php curl重用,使用PHP CURL解析负载较重的站点?
  5. for循环,定时器,闭包混合一块的那点事。
  6. 数据有偏差,照样能学对!20年前就有这么强的算法了?
  7. Android——启动本地QQ,实现与指定的QQ号临时会话
  8. 杰里之一拖八烧写器版本更新:1TO8_V3.0.25【篇】
  9. excel两列数据对比找不同_数据相差太大在Excel图表对比柱形图,那是你不会次坐标设置!...
  10. IEEE格式如何使用在线参考文献生成器
  11. 动手搭建自己的本地测试服务器
  12. 进行CAD图纸文件查看时如何对其进行平移?
  13. 卡片互动悬停下载动画
  14. 2022-03-13-Redis
  15. 数据分析领域不同职位de薪酬职能差异
  16. Ubuntu16.04安装GTX960闭源驱动(Dell XPS 9550)
  17. 怎么理解 Web 3.0?
  18. mac笔记本部分按键失灵
  19. activiti学习01
  20. R语言学习笔记 07 Probit、Logistic回归

热门文章

  1. 学生使用计算机注意事项有哪些,购买笔记本有哪些注意事项?学生购买笔记本八项注意...
  2. 关于页面失去焦点时定时器乱序问题
  3. 三星s5html查看器,三星S5玩机技巧之系统精简篇
  4. ROS学习笔记(十二)ROS noetic ubuntu20.04 版本 rosdep init,rosdep update 问题解决方法
  5. object-c的存取权限(public/protected/private)
  6. Failed to find config ‘085569ce-73ed-11df-83c3-002264764cea‘
  7. 计算机专业和软件工程专业哪个好就业率,从就业看专业:软件工程专业就业率异军突起...
  8. 国内SSD品牌如何异军突起
  9. Qt 字体字号和字体像素关系
  10. 微博只显示来自android,修改手机发新浪微博显示的来源