docker完整配置nginx+php+mysql - 武漢新(xīn)勝電(diàn)腦
  • 武漢市武昌區(qū)南湖(hú)花(huā)園 瑞安(ān)街(jiē)140号 027-88016877
  • 18627003654
  • love6411692@qq.com

docker完整配置nginx+php+mysql

首頁(yè)技(jì )術文(wén)檔

docker完整配置nginx+php+mysql

技(jì )術文(wén)檔 2021年3月14日

首先了解一個方法:

使用(yòng)docker exec進入Docker容器

  docker在1.3.X版本之後還提供了一個新(xīn)的命令exec用(yòng)于進入容器,這種方式相對更簡單一些,下面我們來看一下該命令的使用(yòng):

sudo docker exec --help   

接下來我們使用(yòng)該命令進入一個已經在運行的容器

$ 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

等待下載完成後,我們就可(kě)以在本地鏡像列表裏查到 REPOSITORY 為(wèi) 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 80:80 -v /var/www:/var/www -v /usr/local/nginx/conf/conf.d:/etc/nginx/conf.d -d nginx

注意:

-v 添加文(wén)件映射關系,這樣在宿主機上更改的文(wén)件可(kě)以直接映射到容器中(zhōng)。這裏的目錄根據自己實際情況進行映射。

創建并運行容器後,docker内的nginx即啓動成功,無需進入docker内部再次啓動nginx, 否則會提示80等端口被占用(yòng),因為(wèi)nginx已經啓動。

這時候便可(kě)以訪問nginx配置的域名(míng)驗證了。

我這裏映射的conf.d主要包含nginx的配置文(wén)件,php的配置信息為(wèi):

複制代碼
# 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存在,則為(wèi)真
        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配置常見問題有(yǒu)詳細介紹。

二. 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]
...

這裏我們拉取官方的鏡像,标簽為(wèi)5.6-fpm

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

等待下載完成後,我們就可(kě)以在本地鏡像列表裏查到REPOSITORY為(wèi)php,标簽為(wèi)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 9000:9000 --name  phpfpm -v /var/www:/var/www -d php:5.6-fpm

注意這裏一定要創建文(wén)件映射,或者php容器内有(yǒu)對應的php代碼。上一步nginx的文(wén)件映射,在這裏是找不到的。所以如果沒有(yǒu)文(wén)件映射,127.0.0.1:9000 在此容器内就找不到文(wén)件 。

常見問題:

啓動php容器後,如果訪問nginx為(wèi):502 Bad Gateway

嘗試以下方法:

查看php鏡像的ip地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' phpfpm

 
如:192.168.4.202
 
那麽修改nginx的conf配置文(wén)件,使fastcgi_pass的值為(wèi) 192.168.4.202:9000
vim /docker/nginx/conf.d/default.conf
fastcgi_pass 192.168.4.202:9000;


重啓nginx容器後,就可(kě)以正常訪問。

三. 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]
...

這裏我們拉取官方的鏡像,标簽為(wèi)5.6

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

等待下載完成後,我們就可(kě)以在本地鏡像列表裏查到REPOSITORY為(wèi)mysql,标簽為(wèi)5.6的鏡像。

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

創建并運行MySQL容器:

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

這裏的文(wén)件映射主要目的是把宿主機的sql數據庫數據文(wén)件映射到docker mysql容器,方便導入,注意這裏mysql容器的目錄不能(néng)是已有(yǒu)的目錄,否則會覆蓋。

注意:

這裏創建容易已經有(yǒu)了my.cnf,無需自己添加。

 拓展

使用(yòng)外部工(gōng)具(jù)navicat連接docker 内mysql

mysql的host 填寫docker内的IP,獲取方式為(wèi): 

1 docker inspect --format='{{.NetworkSettings.IPAddress}}' mysql

填寫ssh連接信息:

即可(kě)連接成功!

注意:

docker的容器啓動順序問題會導緻容器的IP地址不一緻,如果在連接數據庫和fastcgi處有(yǒu)用(yòng)到容器的IP,要注意容器的啓動順序。

重啓容器:docker restart 容器名(míng)/容器ID

關閉容器:docker stop xxx

開啓容器:docker start xxx

查看正在運行的容器:docker ps

查看所有(yǒu)容器(包括未運行的容器): docker ps -a

創建并運行容器: docker run

 ---------------------------------------

常見報錯:

1.  thinkphp報錯 Undefined class constant 'MYSQL_ATTR_INIT_COMMAND'

缺少pdo_mysql擴展,鏈接數據庫失敗

找到php.ini,docker中(zhōng)在/usr/local/etc/php中(zhōng),複制一份php.ini,增加 extension=pdo_mysql.so  ,重啓phpfpm。

如果還不行,訪問phpinfo頁(yè)面,查看是否有(yǒu)pdo_mysql

如果沒有(yǒu),說名(míng)擴展不存在,需要編譯。

編譯方法如下:

可(kě)以通過兩種方式實現
方式一(未驗證):

pecl pdo_msql

方式二(已驗證可(kě)行):

到docker的php容器中(zhōng),在php文(wén)件夾下:

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目錄下面新(xīn)建 conf.d目錄和對應的docker-php-ext-pdo_msql.ini文(wén)件
其中(zhōng)docker-php-ext-pdo_msql.ini的内容為(wèi):
extension=pdo_mysql.so

2. thinkphp 報錯 _STORAGE_WRITE_ERROR_:./Application/Runtime/Cache/Home/4e64ea6a2012f26b832b14cbc2152b28.php

是因為(wèi)服務(wù)器緩存文(wén)件夾的操作(zuò)權限不夠,即Runtime沒有(yǒu)權限,把緩存文(wén)件全部删除,再給Runtime777權限就行了

sudo chmod 777 Runtime 或者直接對代碼庫最外層設置777權限

3. thinkphp驗證碼圖片顯示不出來

 缺少gd擴展,安(ān)裝(zhuāng):

docker-php-ext-install gd

可(kě)能(néng)以下報錯:

If configure fails try --with-webp-dir=<DIR>
If configure fails try --with-jpeg-dir=<DIR>
configure: error: png.h not found.

安(ān)裝(zhuāng):

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

// 安(ān)裝(zhuāng)
docker-php-ext-install gd

php.ini增加php_gd2.so

phpinfo中(zhōng)顯示gd庫 

注意如果phpinfo的gd庫中(zhōng)沒有(yǒu)freetype的支持,驗證碼依然顯示不出來, 會報錯:

Call to undefined function Think\imagettftext()

如果gd庫中(zhōng)沒有(yǒu)freeType,則按照以下步驟進行:

docker-php-ext-configure gd --enable-gd-native-ttf --with-freetype-dir=/usr/include/freetype2 --with-png-dir=/usr/include

重新(xīn)編譯:
docker-php-ext-install gd

如果報錯:

configure: error: freetype-config not found.

運行: apt-get -y install libfreetype6-dev ,然後再繼續運行上面的命令。 

gd庫中(zhōng)有(yǒu)了freetype,則驗證碼顯示正常了:

關鍵詞:

聯系方式 / Contact

  • 武漢新(xīn)勝電(diàn)腦
  • 地址:武漢市武昌區(qū)南湖(hú)花(huā)園 瑞安(ān)街(jiē)140号 027-88016877
  • 電(diàn)話:18627003654
  • 聯系人:彭經理(lǐ)
  • 郵箱:love6411692@qq.com
  • 網址:https://www.whxsdn.com
  •  
  •  
  •