docker完整配置nginx+php+mysql的方法步骤

时间:2021-12-27 13:08:12

首先了解一个方法:

使用docker exec进入docker容器

docker在1.3.x版本之后还提供了一个新的命令exec用于进入容器,这种方式相对更简单一些,下面我们来看一下该命令的使用:

?
1
sudo docker exec --help

docker完整配置nginx+php+mysql的方法步骤

接下来我们使用该命令进入一个已经在运行的容器

?
1
2
$ sudo docker ps
$ sudo docker exec -it 775c7c9ee1e1 /bin/bash

一. 配置nginx

查找docker hub 上的 nginx 镜像

?
1
2
3
4
5
6
7
8
9
10
11
12
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]
...

这里我们拉取官方的镜像

?
1
runoob@runoob:~/nginx$ docker pull nginx

等待下载完成后,我们就可以在本地镜像列表里查到 repository 为 nginx 的镜像。

?
1
2
3
runoob@runoob:~/nginx$ docker images nginx
repository     tag         image id      created       size
nginx        latest       555bbd91e13c    3 days ago     182.8 mb

创建并运行容器:

?
1
docker run --name mynginx -p 80:80 -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的配置信息为:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
# php
server {
  charset utf-8;
  client_max_body_size 128m;
 
  listen 80; ## listen for ipv4
  #listen [::]:80 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=$1 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 =404;
  #}
  #error_page 404 /404.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:9000;
    #fastcgi_pass unix:/var/run/php5-fpm.sock;
    try_files $uri =404;
  }
 
  location ~* /\. {
    deny all;
  }
}

注意最后面的fastcgi_pass的ip地址,在php配置常见问题有详细介绍。

二. php配置

查找docker hub上的php镜像

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
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

?
1
runoob@runoob:~/php-fpm$ docker pull php:5.6-fpm

等待下载完成后,我们就可以在本地镜像列表里查到repository为php,标签为5.6-fpm的镜像。

?
1
2
3
runoob@runoob:~/php-fpm$ docker images
repository     tag         image id      created       size
php         5.6-fpm       025041cd3aa5    6 days ago     456.3 mb

创建并运行php容器:

?
1
docker run -p 9000:9000 --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地址

?
1
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镜像

?
1
2
3
4
5
6
7
8
9
10
11
12
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

?
1
runoob@runoob:~/mysql$ docker pull mysql:5.6

等待下载完成后,我们就可以在本地镜像列表里查到repository为mysql,标签为5.6的镜像。

?
1
2
runoob@runoob:~/mysql$ docker images |grep mysql
mysql        5.6         2c0964ec182a    3 weeks ago     329 mb

创建并运行mysql容器:

?
1
docker run -p 3306:3306 --name mysql -v /usr/local/mysql:/etc/mysql/sqlinit -e mysql_root_password=123456 -d mysql:5.6

这里的文件映射主要目的是把宿主机的sql数据库数据文件映射到docker mysql容器,方便导入,注意这里mysql容器的目录不能是已有的目录,否则会覆盖。

注意:

这里创建容易已经有了my.cnf,无需自己添加。

拓展

使用外部工具navicat连接docker 内mysql

mysql的host 填写docker内的ip,获取方式为:

?
1
docker inspect --format='{{.networksettings.ipaddress}}' mysql

docker完整配置nginx+php+mysql的方法步骤

填写ssh连接信息:

docker完整配置nginx+php+mysql的方法步骤

即可连接成功!

注意:

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

docker完整配置nginx+php+mysql的方法步骤

如果没有,说名扩展不存在,需要编译。

编译方法如下:

可以通过两种方式实现

方式一(未验证):

pecl pdo_msql

方式二(已验证可行):

到docker的php容器中,在php文件夹下:

?
1
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验证码图片显示不出来

docker完整配置nginx+php+mysql的方法步骤

缺少gd扩展,安装:

?
1
docker-php-ext-install pdo pdo_mysql

可能以下报错:

?
1
2
3
if configure fails try --with-webp-dir=<dir>
if configure fails try --with-jpeg-dir=<dir>
configure: error: png.h not found.

安装:

?
1
apt-get install libpng-dev libjpeg-dev

再次执行:

?
1
2
3
4
5
// 增加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

docker完整配置nginx+php+mysql的方法步骤

phpinfo中显示gd库

docker完整配置nginx+php+mysql的方法步骤

注意如果phpinfo的gd库中没有freetype的支持,验证码依然显示不出来, 会报错:

call to undefined function think\imagettftext()

如果gd库中没有freetype,则按照以下步骤进行:

?
1
2
3
4
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的方法步骤

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:http://www.cnblogs.com/saysmy/p/10389902.html