mysql sail_再谈docker搭建nginx+php+mysql开发环境 | Sail
写在前面
前几天我写了一篇博客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相关推荐
- Docker搭建 Nginx+PHP+MySQL 环境并部署WordPress实践
本文给大家分享的是作者基于Docker搭建 Nginx+PHP+MySQL 环境并部署WordPress的详细过程,非常的全面,有需要的小伙伴可以参考下 Docker基于LXC实现了把软件封装到一个完 ...
- win7下搭建nginx+php的开发环境
win7下搭建nginx+php的开发环境,需要的朋友可以参考下 一.下载相关软件 nginx下载:http://nginx.org/en/download.html nginx常见异常:http:/ ...
- docker搭建nginx+php+mysql环境
1.安装docker https://www.runoob.com/docker/centos-docker-install.html #启动docker systemctl start docker ...
- Docker入门指南:基于 docker 搭建机器学习/深度学习开发环境
实际工作中,许多项目开发需要在Linux服务器上进行,本文为习惯使用 Windows 操作系统的朋友介绍一种基于Docker的,跨平台.便携性(方便移植.重新部署.可远程访问)的开发环境搭建方法. 1 ...
- hhvm mysql_Linux_在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程,貌似最近这个HHVM特别火,其主 - phpStudy...
在Ubuntu系统上搭建Nginx+HHVM+MySQL开发环境的教程 貌似最近这个HHVM特别火,其主要原因大概要归咎于大的运行效率吧,安装完之后使用探针测试,计算运行的时间都是0.0*的级别,据说 ...
- 使用docker 搭建Nginx服务器,照做就行
大家好,今天分享使用docker 搭建Nginx服务器 首先,我们使用的是vm 虚拟机搭建的Linux (我不是使用云主机做的) 然后,我们要在Linux上开放一个端口,用于外界(外网)访问 在Lin ...
- nginx搭建文件服务器脚本,基于docker搭建nginx文件服务器的方法步骤
1.在本机新建配置文件docker_nginx.conf server { listen 7070; server_name localhost; charset utf-8; location /f ...
- Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境
Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...
- nginx nodejs环境配置_基于docker的nodejs、php开发环境,包含多种组合安装
dnnmmp 基于docker的nodejs.php开发环境 (docker,nodejs,php,nginx,mongo,mysql,redis) Dnnmmp包含以下组合 dnm(Docker + ...
最新文章
- 如何在windows xp下使用ntfs权限控制
- 批量启动关闭MS SQL 2005服务BAT
- react滑动切换tab动画效果_[React Native]react-native-scrollable-tab-view(入门篇)
- php curl重用,使用PHP CURL解析负载较重的站点?
- for循环,定时器,闭包混合一块的那点事。
- 数据有偏差,照样能学对!20年前就有这么强的算法了?
- Android——启动本地QQ,实现与指定的QQ号临时会话
- 杰里之一拖八烧写器版本更新:1TO8_V3.0.25【篇】
- excel两列数据对比找不同_数据相差太大在Excel图表对比柱形图,那是你不会次坐标设置!...
- IEEE格式如何使用在线参考文献生成器
- 动手搭建自己的本地测试服务器
- 进行CAD图纸文件查看时如何对其进行平移?
- 卡片互动悬停下载动画
- 2022-03-13-Redis
- 数据分析领域不同职位de薪酬职能差异
- Ubuntu16.04安装GTX960闭源驱动(Dell XPS 9550)
- 怎么理解 Web 3.0?
- mac笔记本部分按键失灵
- activiti学习01
- R语言学习笔记 07 Probit、Logistic回归
热门文章
- 学生使用计算机注意事项有哪些,购买笔记本有哪些注意事项?学生购买笔记本八项注意...
- 关于页面失去焦点时定时器乱序问题
- 三星s5html查看器,三星S5玩机技巧之系统精简篇
- ROS学习笔记(十二)ROS noetic ubuntu20.04 版本 rosdep init,rosdep update 问题解决方法
- object-c的存取权限(public/protected/private)
- Failed to find config ‘085569ce-73ed-11df-83c3-002264764cea‘
- 计算机专业和软件工程专业哪个好就业率,从就业看专业:软件工程专业就业率异军突起...
- 国内SSD品牌如何异军突起
- Qt 字体字号和字体像素关系
- 微博只显示来自android,修改手机发新浪微博显示的来源