掘金 后端 ( ) • 2024-04-25 11:38

一,安装nginx容器

拉取nginx镜像(拉取最新的nginx镜像)

[user@hostname ~]docker pull nginx

查看本地的nginx镜像

[user@hostname ~]docker image ls
REPOSITORY                                            TAG       IMAGE ID       CREATED         SIZE
nginx                                                 latest    c613f16b6642   2 months ago    187MB

二、安装php容器

方法一:拉取php镜像(指定版本)

[user@hostname ~]docker pull php:8.2.5-fpm

方法二:通过Dockerfile构建镜像(Dockerfile的配置见文章末尾)

[user@hostname php]ls
-rw-r--r-- 1 user   user     1255 Apr 15 19:05 Dockerfile-rw-r--r-- 1 root   root         17 Apr 12 15:29 index.php
-rw-r--r-- 1 root   root   19936114 Feb  8 02:28 php-7.2.34.tar.gz
-rw-r--r-- 1 root   root   19053522 Feb  8 02:29 php-8.2.5.tar.gz
[user@hostname php]docker build -t php-fpm:8.2.5 -f Dockerfile .

查看本地的所有镜像

[user@hostname ~]docker image ls
REPOSITORY                                            TAG       IMAGE ID       CREATED         SIZE
php-fpm                                               8.2.5     e056423645ca   12 days ago     1.85GB
nginx                                                 latest    c613f16b6642   2 months ago    187MB

三、在本地建立logs目录与html目录(便于查看nginx的日志和查看html代码)

[user@hostname workspace]mkdir -P /home/workspace/logs  /home/workspace/html
[user@hostname workspace]ll
drwxr-xr-x 3 root   root   4096 Apr 23 16:11 html
drwxr-xr-x 2 root   root   4096 Apr 16 11:50 logs
drwxr-xr-x 3 root   root   4096 Apr 25 11:00 nginx
drwxr-xr-x 2 irteam irteam 4096 Apr 15 19:05 php
drwxr-xr-x 2 root   root   4096 Apr 23 16:52 php-config

四、启动nginx + php容器

通过挂载的形式启动php

[user@hostname workspace]docker run -p 9000:9000 --name php-fpm -v /home1/irteam/workspace/html:/home1/irteam/html -d php-fpm:8.2.5

说明:
-v 本机目录:容器目录 -- 将本机的目录挂载到容器的目录,这样设置的好处是,在本机就                                       可以查看html目录,不用进入容器;
                                     容器目录会在启动时自动创建;

通过挂载的形式启动nginx

[user@hostname workspace]docker run -p 80:80 --name nginx-php -v /home1/irteam/workspace/logs:/var/log/nginx -v /home1/irteam/workspace/nginx:/etc/nginx -v /home1/irteam/workspace/html:/usr/share/nginx/html --link php-fpm:phpfpm -d nginx

说明:

-p 80:80 -- 将容器的80端口与本机的80端口连接,进行通信。如果不设置此步骤,在本                    机是无法访问容器的80端口的
-v 本机目录:容器目录 -- 将本机的目录与容器的目录建立连接,这样设置的好处是:不用                    进入容器就可以看到与容器里相同的logs和html代码
-- link 容器名称:别名 -- 将当前的nginx容器与另一容器php-fpm建立连接,
                  别名:在nginx容器中要访问php容器时,所要使用的名称

nginx配置如下:

注意:

1. root 目录:必须与启动时设置的容器目录相同
2. fastcgi_pass phpfpm:9000 :不能使用127.0.0.1,因为这是在nginx容器中,在没有任何设置的情况下,容器与容器之前是相互隔离的,所以这里必须使用--link中设置的别名phpfpm
3.fastcgi_param SCRIPT_FILENAME /home1/irteam/html$fastcgi_script_name: 这里的目录应该使用php容器中的html目录,因为此时访问的是php容器中的内容

 server {
        listen       80;
        server_name  localhost;
        root /usr/share/nginx/html;
        index index.php;

        location ~ \.php$ {
             #fastcgi_pass   127.0.0.1:9000;
             fastcgi_pass   phpfpm:9000;
             fastcgi_index  index.php;
             fastcgi_param  SCRIPT_FILENAME  /home1/irteam/html$fastcgi_script_name;
             include        fastcgi_params;
             fastcgi_intercept_errors on;
        }
    }

五、查看nginx与php是否启动成功

查看所有的docker容器启动的情况,查看status是否都是up状态

[user@hostname workspace]docker pa -a
CONTAINER ID   IMAGE           COMMAND                  CREATED        STATUS          PORTS                    NAMES
be06a7b0acc0   nginx           "/docker-entrypoint.…"   25 hours ago   Up 58 minutes   0.0.0.0:80->80/tcp       nginx-php
4a79b18351a5   php-fpm:8.2.5   "./sbin/php-fpm -c /…"   25 hours ago   Up 25 hours     0.0.0.0:9000->9000/tcp   php-fpm

如果非up状态,则说明启动时出现了错误

排查错误的方式:

1. 查看容器logs日志
[user@hostname workspace]docker logs -fnt CONTAINER ID
2. 进入容器,查看目录或者日志
   进入容器:
[user@hostname workspace]sudo docker exec -it 容器名称 /bin/bash

六、运行结果

附件:php Dockerfile

#!/bin/bash
#this docker file

FROM centos:7
RUN yum install -y gcc gcc-c++ make gd-devel libxml2-devel libcurl-devel libjpeg-devel libpng-devel openssl-devel sqlite-devel epel-release
RUN yum install -y oniguruma-devel -- enablerepo=epel

ADD php-8.2.5.tar.gz /tmp/

RUN cd /tmp/php-8.2.5 && \
    ./configure --prefix=/home1/irteam/sample/php \
    --with-config-file-path=/home1/irteam/sample/php/etc \
    --with-mysql --with-mysqli \
    --with-openssl --with-zlib --with-curl --with-gd \
    --with-jpeg-dir --with-png-dir --with-iconv \
    --enable-fpm --enable-zip --enable-mbstring && \
    make -j 4 && \
    make install && \
    cp /home1/irteam/sample/php/etc/php-fpm.conf.default /home1/irteam/sample/php/etc/php-fpm.conf && \
    cp /home1/irteam/sample/php/etc/php-fpm.d/www.conf.default /home1/irteam/sample/php/etc/php-fpm.d/www.conf && \
    sed -i "s/127.0.0.1/0.0.0.0/" /home1/irteam/sample/php/etc/php-fpm.d/www.conf && \
    sed -i "21a \daemonize = no" /home1/irteam/sample/php/etc/php-fpm.conf && \
    cp  php.ini-production /home1/irteam/sample/php/etc/php.ini

RUN rm -rf /tmp/php-8.2.5.* && yum clean all

WORKDIR /home1/irteam/sample/php
EXPOSE 9000
CMD ["./sbin/php-fpm", "-c", "/home1/irteam/sample/php/etc/php-fpm.conf"]