docker完整配置nginx+php+mysql
首先了解一个方法:
使用docker exec进入Docker容器
docker在1.3.X版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用:
- sudo docker exec --help
接下来我们使用该命令进入一个已经在运行的容器
- $ sudo docker ps
- $ sudo docker exec -it 775c7c9ee1e1 /bin/bash
一. 配置nginx
查找 Docker Hub 上的 nginx 镜像
- runoob@runoob:~/nginx$ docker search nginx
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- nginx Official build of Nginx. 3260 [OK]
- jwilder/nginx-proxy Automated Nginx reverse proxy for docker c... 674 [OK]
- richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 207 [OK]
- million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 67 [OK]
- maxexcloo/nginx-php Docker framework container with Nginx and ... 57 [OK]
- webdevops/php-nginx Nginx with PHP-FPM 39 [OK]
- h3nrik/nginx-ldap NGINX web server with LDAP/AD, SSL and pro... 27 [OK]
- bitnami/nginx Bitnami nginx Docker Image 19 [OK]
- maxexcloo/nginx Docker framework container with Nginx inst... 7 [OK]
- ...
这里我们拉取官方的镜像
- runoob@runoob:~/nginx$ docker pull nginx
等待下载完成后,我们就可以在本地镜像列表里查到 REPOSITORY 为 nginx 的镜像。
- runoob@runoob:~/nginx$ docker images nginx
- REPOSITORY TAG IMAGE ID CREATED SIZE
- nginx latest 555bbd91e13c 3 days ago 182.8 MB
- 创建并运行容器:
- docker run --name mynginx -p : -v /var/www:/var/www -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -d nginx
注意:
-v 添加文件映射关系,这样在宿主机上更改的文件可以直接映射到容器中。这里的目录根据自己实际情况进行映射。
创建并运行容器后,docker内的nginx即启动成功,无需进入docker内部再次启动nginx, 否则会提示80等端口被占用,因为nginx已经启动。
这时候便可以访问nginx配置的域名验证了。
我这里映射的conf.d主要包含nginx的配置文件,php的配置信息为:
- # php
- server {
- charset utf-;
- client_max_body_size 128M;
- listen ; ## listen for ipv4
- #listen [::]: default_server ipv6only=on; ## listen for ipv6
- server_name www.baidu.com;
- root /var/www;
- index index.php;
- location / {
- #-e表示只要filename存在,则为真
- if (!-e $request_filename){
- rewrite ^(.*)$ /index.php?s=$ last;
- break;
- }
- # Redirect everything that isn't a real file to index.php
- try_files $uri $uri/ /index.php$is_args$args;
- }
- # uncomment to avoid processing of calls to non-existing static files by Yii
- #location ~ \.(js|css|png|jpg|gif|swf|ico|pdf|mov|fla|zip|rar)$ {
- # try_files $uri =;
- #}
- #error_page /.html;
- # deny accessing php files for the /assets directory
- location ~ ^/assets/.*\.php$ {
- deny all;
- }
- location ~ \.php$ {
- include fastcgi_params;
- fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
- fastcgi_pass 172.17.0.3:;
- #fastcgi_pass unix:/var/run/php5-fpm.sock;
- try_files $uri =;
- }
- location ~* /\. {
- deny all;
- }
- }
注意最后面的fastcgi_pass的ip地址,在php配置常见问题有详细介绍。
二. php配置
查找Docker Hub上的php镜像
- runoob@runoob:~/php-fpm$ docker search php
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- php While designed for web development, the PH... 1232 [OK]
- richarvey/nginx-php-fpm Container running Nginx + PHP-FPM capable ... 207 [OK]
- phpmyadmin/phpmyadmin A web interface for MySQL and MariaDB. 123 [OK]
- eboraas/apache-php PHP5 on Apache (with SSL support), built o... 69 [OK]
- php-zendserver Zend Server - the integrated PHP applicati... 69 [OK]
- million12/nginx-php Nginx + PHP-FPM 5.5, 5.6, 7.0 (NG), CentOS... 67 [OK]
- webdevops/php-nginx Nginx with PHP-FPM 39 [OK]
- webdevops/php-apache Apache with PHP-FPM (based on webdevops/php) 14 [OK]
- phpunit/phpunit PHPUnit is a programmer-oriented testing f... 14 [OK]
- tetraweb/php PHP 5.3, 5.4, 5.5, 5.6, 7.0 for CI and run... 12 [OK]
- webdevops/php PHP (FPM and CLI) service container 10 [OK]
- ...
这里我们拉取官方的镜像,标签为5.6-fpm
- runoob@runoob:~/php-fpm$ docker pull php:5.6-fpm
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为php,标签为5.6-fpm的镜像。
- runoob@runoob:~/php-fpm$ docker images
- REPOSITORY TAG IMAGE ID CREATED SIZE
- php 5.6-fpm 025041cd3aa5 6 days ago 456.3 MB
创建并运行php容器:
- docker run -p : --name phpfpm -v /var/www:/var/www -d php:5.6-fpm
注意这里一定要创建文件映射,或者php容器内有对应的php代码。上一步nginx的文件映射,在这里是找不到的。所以如果没有文件映射,127.0.0.1:9000 在此容器内就找不到文件 。
常见问题:
启动php容器后,如果访问nginx为:502 Bad Gateway
尝试以下方法:
查看php镜像的ip地址
- docker inspect --format='{{.NetworkSettings.IPAddress}}' phpfpm
如:192.168.4.202
那么修改nginx的conf配置文件,使fastcgi_pass的值为 192.168.4.202:9000
vim /docker/nginx/conf.d/default.conf
fastcgi_pass 192.168.4.202:9000;
重启nginx容器后,就可以正常访问。
三. mysql配置
查找Docker Hub上的mysql镜像
- runoob@runoob:/mysql$ docker search mysql
- NAME DESCRIPTION STARS OFFICIAL AUTOMATED
- mysql MySQL is a widely used, open-source relati... 2529 [OK]
- mysql/mysql-server Optimized MySQL Server Docker images. Crea... 161 [OK]
- centurylink/mysql Image containing mysql. Optimized to be li... 45 [OK]
- sameersbn/mysql 36 [OK]
- google/mysql MySQL server for Google Compute Engine 16 [OK]
- appcontainers/mysql Centos/Debian Based Customizable MySQL Con... 8 [OK]
- marvambass/mysql MySQL Server based on Ubuntu 14.04 6 [OK]
- drupaldocker/mysql MySQL for Drupal 2 [OK]
- azukiapp/mysql Docker image to run MySQL by Azuki - http:... 2 [OK]
- ...
这里我们拉取官方的镜像,标签为5.6
- runoob@runoob:~/mysql$ docker pull mysql:5.6
等待下载完成后,我们就可以在本地镜像列表里查到REPOSITORY为mysql,标签为5.6的镜像。
- runoob@runoob:~/mysql$ docker images |grep mysql
- mysql 5.6 2c0964ec182a 3 weeks ago 329 MB
创建并运行MySQL容器:
- docker run -p : --name mysql -v /usr/local/mysql:/etc/mysql/sqlinit -e MYSQL_ROOT_PASSWORD= -d mysql:5.6
这里的文件映射主要目的是把宿主机的sql数据库数据文件映射到docker mysql容器,方便导入,注意这里mysql容器的目录不能是已有的目录,否则会覆盖。
注意:
这里创建容易已经有了my.cnf,无需自己添加。
拓展
使用外部工具navicat连接docker 内mysql
mysql的host 填写docker内的IP,获取方式为:
- docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql
填写ssh连接信息:
即可连接成功!
注意:
docker的容器启动顺序问题会导致容器的IP地址不一致,如果在连接数据库和fastcgi处有用到容器的IP,要注意容器的启动顺序。
重启容器:docker restart 容器名/容器ID
关闭容器:docker stop xxx
开启容器:docker start xxx
查看正在运行的容器:docker ps
查看所有容器(包括未运行的容器): docker ps -a
创建并运行容器: docker run
---------------------------------------
常见报错:
1. thinkphp报错 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'
缺少pdo_mysql扩展,链接数据库失败
找到php.ini,docker中在/usr/local/etc/php中,复制一份php.ini,增加 extension=pdo_mysql.so ,重启phpfpm。
如果还不行,访问phpinfo页面,查看是否有pdo_mysql
如果没有,说名扩展不存在,需要编译。
编译方法如下:
可以通过两种方式实现
方式一(未验证):
pecl pdo_msql
方式二(已验证可行):
到docker的php容器中,在php文件夹下:
- docker-php-ext-install pdo pdo_mysql
如果报 /usr/local/bin/docker-php-ext-enable: cannot create /usr/local/etc/php/conf.d/docker-php-ext-pdo_mysql.ini: Directory nonexistent
解决方案:
直接在/usr/local/etc/php目录下面新建 conf.d目录和对应的docker-php-ext-pdo_msql.ini文件
其中docker-php-ext-pdo_msql.ini的内容为:
extension=pdo_mysql.so
2. thinkphp 报错 _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/4e64ea6a2012f26b832b14cbc2152b28.php
是因为服务器缓存文件夹的操作权限不够,即Runtime没有权限,把缓存文件全部删除,再给Runtime777权限就行了
sudo chmod 777 Runtime 或者直接对代码库最外层设置777权限
3. thinkphp验证码图片显示不出来
缺少gd扩展,安装:
- docker-php-ext-install gd
可能以下报错:
- If configure fails try --with-webp-dir=<DIR>
- If configure fails try --with-jpeg-dir=<DIR>
- configure: error: png.h not found.
安装:
- apt-get install libpng-dev libjpeg-dev
再次执行:
- // 增加freetype配置
docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include --with-jpeg-dir=/usr/include- // 安装
docker-php-ext-install gd
php.ini增加php_gd2.so
phpinfo中显示gd库
注意如果phpinfo的gd库中没有freetype的支持,验证码依然显示不出来, 会报错:
- Call to undefined function Think\imagettftext()
如果gd库中没有freeType,则按照以下步骤进行:
- docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include
- 重新编译:
- docker-php-ext-install gd
如果报错:
- configure: error: freetype-config not found.
运行: apt-get -y install libfreetype6-dev ,然后再继续运行上面的命令。
gd库中有了freetype,则验证码显示正常了:
docker完整配置nginx+php+mysql的更多相关文章
- [原创]Centos7 从零配置Nginx+PHP+MySql
序言 这次玩次狠得.除了编译器使用yum安装,其他全部手动编译.哼~ 看似就Nginx.PHP.MySql三个东东,但是它们太尼玛依赖别人了. 没办法,想用它们就得老老实实给它们提供想要的东西. 首先 ...
- windows7配置Nginx+php+mysql教程
windows7配置Nginx+php+mysql教程 最近在学习php,想把自己的学习经历记录下来,并写一些经验,仅供参考交流.此文适合那些刚刚接触php,想要学习并想要自己搭建Nginx+php+ ...
- windows7配置Nginx+php+mysql的详细教程
windows7配置Nginx+php+mysql的详细教程 作者:Vincent.李 字体:[增加 减小] 类型:转载 时间:2016-09-04我要评论 这篇文章主要介绍了windows7配置Ng ...
- virtualBox安装centos7并配置nginx php mysql运行环境
virtualBox安装centos7并配置nginx php mysql运行环境 一:virtualBox安装centos7并进行基础设置 1.下载dvd.iso安装文件,下载地址:https:// ...
- 在ubuntu上配置nginx+php+mysql+phpmyadmin
1.先更新ubuntu系统 更新命令 sudo apt-get update sudo apt-get upgrade 2 添加ubuntu nginx更新源镜像 cd /etc/apt/ sudo ...
- CentOS6.3上安装与配置nginx+php+mysql环境
1. 目前nginx采用是源码包安装的方式(yum安装失败),下载地址:http://nginx.org/en/download.html 我这里的安装包是:nginx-1.12.0.tar.gz 2 ...
- Cubieboard A10 安装Nand系统,配置nginx,php,mysql,samba详细教程
安装前置条件 1.下载win32diskimager-v0.7-binary.zip 2.下载debian_wheezy_armhf_v1_mele.zip 3.下载cubie_nand_uboot_ ...
- Centos 7 手把手教你使用YUM方式安装并配置Nginx+php7-fpm+MySQL
需要准备的内容 一台纯净系统的服务器 远程连接服务器的工具 (我这里使用Xshell) 安装nginx 链接上服务器后执行 yum install nginx 这里需要输入y 后回车,开始安装ngi ...
- 在docker下面安装Nginx PHP mysql let's encrypt
最近自己在弄了个Nginx PHP Mysql Let's encrypt的docker,下面记录一下 1)先装 Let's encrypt docker run --rm -p 80:80 -p 4 ...
随机推荐
- Kotlin入门(33)运用扩展属性
进行App开发的时候,使用震动器要在AndroidManifest.xml中加上如下权限: <!-- 震动 --> <uses-permission android:name=&qu ...
- Git - git clone - 将远端仓库克隆拷贝到本地
索引: 目录索引 参看代码 GitHub: git.txt 一.示例: git clone https://github.com/liumeng0403/lm.solution.git 二.说明: 1 ...
- c/c++ linux 进程间通信系列1,使用signal,kill
linux 进程间通信系列1,使用signal,kill 信号基本概念: 软中断信号(signal,又简称为信号)用来通知进程发生了异步事件.进程之间可以互相通过系统调用kill发送软中断信号.内核 ...
- Python Learning: 01
After a short period of new year days, I found life a little boring. So just do something funny--Py ...
- 建立第一个SpringBoot小列子(碰到的错误)
当加入@SpringBootApplication注解时,无法得到解析 错误提示:SpringBootApplication cannot be resolved to a type 错误原因是因为s ...
- Dijango学习_02_极简本地博客创建
二. Python 自带SQLite3数据库,Django默认使用SQLite3数据库,如果使用其它数据库可以在settings.py文件中设置. DATABASES = { 'default': { ...
- Nginx反向代理实现IP访问分流
通过Nginx做反向代理来实现分流,以减轻服务器的负载和压力是比较常见的一种服务器部署架构.本文将分享一个如何根据来路IP来进行分流的方法. 根据特定IP来实现分流 将IP地址的最后一段最后一位为0或 ...
- SQLServer之添加聚集索引
聚集索引添加规则 聚集索引按下列方式实现 PRIMARY KEY 和 UNIQUE 约束 在创建 PRIMARY KEY 约束时,如果不存在该表的聚集索引且未指定唯一非聚集索引,则将自动对一列或多列创 ...
- 周末班:Python基础之面向对象基础
面向对象基础 面向对象和面向过程 编程思想是什么,就是用代码解决现实生活中问题的思路. 面向过程 核心点在过程二字,过程指的是解决问题的步骤,说白了就是先做什么再干什么.这种解决问题的思路就好比是工厂 ...
- 一篇文章搞定mongodb
一 安装 1 安装目录下新建文件夹data,etc,logs #在bin文件下启动cmd,指定数据存储的路径mongod --dbpath D:\MongoDB\data\db 2 etc文件夹中新建 ...