zoukankan      html  css  js  c++  java
  • Docker构建PHP环境

    一、多容器运行 PHP+fpm+apache

    1.1 安装相关镜像

    fpm 镜像地址:https://dev.aliyun.com/detail.html?repoId=1250

    apache 镜像地址:https://dev.aliyun.com/detail.html?spm=5176.1972343.2.51.151b5aaaSVeZ8h&repoId=1220

    尽可能的使用基于 alpine 的镜像,体积很小。

    1.2 运行 Fpm

    docker run -d --rm --name fpm php:7.2.2-fpm-alpine

    1.3 运行 Apache

    首先在宿主机中创建 /home/txl/www 目录,用来映射容器中网站根目录。并且根据镜像说明可知,默认网站根目录存放在 /usr/local/apache2/htdocs/ 下:

    运行 Apache 容器:

    docker run -d -p 80:80 --rm --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ httpd:2.4.33-alpine  

    这时服务器已经具备访问 html 页面的能力了:

    但是还不能识别 PHP 脚本,所以我们需要修改相关配置。一般需要准备一个 Apache 配置文件,或者从容器中拷贝一个默认的,然后挂载就可以了。根据镜像说明可知,配置文件默认存放在 /usr/local/apache2/conf/httpd.conf:

    拷贝到宿主机中 /home/txl/conf/httpd.conf 下:

    docker cp httpd:/usr/local/apache2/conf/httpd.conf /home/txl/conf

     修改配置,开启如下内容:

    LoadModule proxy_module modules/mod_proxy.so
    LoadModule proxy_http_module modules/mod_proxy_http.so
    LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so

     添加虚拟主机站点:

    <VirtualHost *:80>
        ServerAdmin txl@com.cn
        DocumentRoot "/usr/local/apache2/htdocs"
        ServerName localhost
        <Directory "/usr/local/apache2/htdocs">
          Options None
          Require all granted
        </Directory>
        ProxyRequests Off
        ProxyPassMatch ^/(.*.php)$ fcgi://172.17.0.3:9000/var/www/$1
    </VirtualHost>

    注意: 172.17.0.3  需要替换为真实的 fpm IP, 9000  是 fpm 默认的端口, /var/www  是一会要挂载到 fpm 容器中的网站路径。

    首先我使用的是默认网络,宿主机本身是有 docker 网络的,可以通过 ifconfig 查看。

    通过  docker network inspect bridge  可以查看各个容器的 ip,保证 fpm 能正确响应:

    配置完成后,分别挂载网站目录和配置文件到容器中,重新启动 Apache 容器:

    docker run -d -p 80:80 --name httpd -v /home/txl/www:/usr/local/apache2/htdocs/ 
    -v /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf 
    httpd:2.4.33-alpine

    1.4 将网站目录挂载到 fpm 容器

    重新启动 fpm 容器:

    docker run -d --rm --name fpm 
    -v /home/txl/www:/var/www 
    php:7.2.2-fpm-alpine

    这时服务器就可以执行 PHP 脚本了:

    1.5 使用 Compose 编排

    之前安装并手工启动了 PHP + FPM + Apache,为了更方便的启动和删除容器,需要使用到编排工具 docker compose。

    参考文档:https://docs.docker.com/compose/install/#install-compose

    1)安装 docker compose

    Linux 下需要先安装:

    sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
    sudo chmod +x /usr/local/bin/docker-compose

    2)compose file 配置文件

    新建 compose 文件夹,进入后创建新文件 docker-compose.yml,根据之前的启动命令编辑:

    version: "3"
    services:
      fpm:
        image: php:7.2.2-fpm-alpine
        container_name: fpm
        volumes:
          - /home/txl/www:/var/www
        networks:
          mywebnet:
            ipv4_address: 192.158.0.2
      httpd:
        image: httpd:2.4.33-alpine
        container_name: httpd
        ports:
          - "80:80"
        volumes:
          - /home/txl/www:/usr/local/apache2/htdocs/
          - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
        networks:
          mywebnet:
            ipv4_address: 192.158.0.3
    networks:
      mywebnet:
        driver: bridge
        ipam:
          config:
            - subnet: 192.158.0.0/16

    该配置文件设置了 fpm 的子网 ip 为 192.158.0.2,因此需要在 httpd.conf 配置中修改对应配置:

    3)启动

    进入 docker-compose.yml 文件所在路径,执行:

    注意:使用 compose 启动前需要先删除相关容器以及网络

    docker-compose [-p 指定名称] up -d

    启动成功,查看运行的容器:

    查看创建的网络:

    访问:

    4)停止和删除

    进入 docker-compose.yml 文件所在路径,执行:

    # 停止
    docker-compose [-p 指定名称] stop
    # 删除
    docker-compose [-p 指定名称] rm

    注意:如果之前创建了相同子网,需要先删除之前的,否则会产生冲突。

    # 删除空闲网络
    docker network prune
    # 删除指定网络
    docker network rm [network]

    二、多容器运行 PHP+fpm+nginx

    2.1 安装 nginx 镜像

    nginx 镜像地址:https://hub.docker.com/_/nginx

    2.2 运行 Nginx 容器

    根据镜像说明可知:

    • 默认的网页目录是:/usr/share/nginx/html
    • 默认的配置文件是:/etc/nginx/nginx.conf

    一般需要准备一个 nginx 配置文件,或者先临时启动容器,然后拷贝容器中的默认配置文件:

    docker run --name nginx --rm -d  nginx:1.15.1-alpine
    docker cp nginx:/etc/nginx/nginx.conf /home/txl/conf   

    在 http 节点下添加配置节 server:

    server{
          listen 80;
          location / {
          root /usr/share/nginx/html;
            index  index.html index.htm index.php;
          }
          location ~ .php$ {
            root /var/www;
            fastcgi_pass 192.148.0.3:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
          }
    }

    注意:  192.148.0.3   是 fpm 的子网 ip,  9000   是 fpm 默认的端口,  /var/www   是一会要挂载到 fpm 容器中的网站路径。

    创建网络  mynginx :

    docker network create --driver=bridge --subnet=192.148.0.0/16 mynginx

    指定网络  mynginx  启动 nginx 容器:

    docker run --name nginx -d --rm -v /home/txl/www:/usr/share/nginx/html 
    -v /home/txl/conf/nginx.conf:/etc/nginx/nginx.conf 
    --network mynginx -p 80:80 nginx:1.15.1-alpine

    2.3 运行 Fpm 容器

    指定网络  mynginx  以及指定子网 ip  192.148.0.3 :

    docker run --name fpm -d --rm -v /home/txl/www:/var/www 
    --network mynginx --ip 192.148.0.3 php:7.2.2-fpm-alpine

    访问:

    2.4 使用 Compose 编排

    1)compose file 配置文件

    创建新文件 docker-compose.yml,根据之前的启动命令编辑:

    version: "3"
    services:
      fpm:
        image: php:7.2.2-fpm-alpine
        container_name: fpm
        volumes:
          - /home/txl/www:/var/www
        networks:
          mynginx:
            ipv4_address: 192.148.0.3
      nginx:
        image: nginx:1.15.1-alpine
        container_name: nginx
        ports:
          - "80:80"
        volumes:
          - /home/txl/www:/usr/share/nginx/html/
          - /home/txl/conf/nginx.conf:/etc/nginx/nginx.conf
        networks:
          mynginx:
            ipv4_address: 192.148.0.2
    networks:
      mynginx:
        driver: bridge
        ipam:
          config:
            - subnet: 192.148.0.0/16
    2)启动

    进入 docker-compose.yml 文件所在路径,执行:

    docker-compose [-p 指定名称] up -d

    启动成功~

    三、FPM 容器安装 PHP 扩展

    一般情况下需要两个步骤:设置镜像源(/etc/apk/repositories)和执行安装命令(docker-php-ext-install 标准扩展)。如果直接进入容器操作的话,一旦容器删除所有的修改全都会丢失,因此可以:

    • 创建 dockerfile 在源镜像的基础上构建新镜像。
    • 在 docker-compose 文件中的 build 节点通过指定 dockerfile 进行构建。

    以第二种方法为例安装 pdo_mysql 扩展:在 compose 目录下创建 build 文件,新建一个 dockerfile 文件 phpfpm:

    FROM php:7.2.2-fpm-alpine
    RUN echo http://mirrors.ustc.edu.cn/alpine/v3.6/main > /etc/apk/repositories && 
      echo http://mirrors.ustc.edu.cn/alpine/v3.6/community >> /etc/apk/repositories
    RUN apk update && apk upgrade
    RUN docker-php-ext-install pdo_mysql

    修改 docker-compose.yml:

    version: "3"
    services:
      fpm:
        build:
         context: ./build
         dockerfile: phpfpm
        image: php:7.2.2-fpm-alpine
        container_name: fpm
        volumes:
          - /home/txl/www:/var/www
        networks:
          mywebnet:
            ipv4_address: 192.158.0.2
      httpd:
        image: httpd:2.4.33-alpine
        container_name: httpd
        ports:
          - "80:80"
        volumes:
          - /home/txl/www:/usr/local/apache2/htdocs/
          - /home/txl/conf/httpd.conf:/usr/local/apache2/conf/httpd.conf
        networks:
          mywebnet:
            ipv4_address: 192.158.0.3
    networks:
      mywebnet:
        driver: bridge
        ipam:
          config:
            - subnet: 192.158.0.0/16

    然后执行  docker-compose build service名称 :

    docker-compose build fpm

    最后删除并重启 Fpm 容器:

    docker-compose stop fpm
    docker-compose rm fpm
    docker-compose up -d fpm
  • 相关阅读:
    飞腾1500A 上面银河麒麟操作系统 进行远程以及添加用户的方法 linux xrdp
    centos7 安装Anaconda3及使用
    机器学习(ML)中文视频教程
    spring学习笔记(26)spring整合Quartz2持久化稳健任务调度
    Cocos2d-X中使用ProgressTimer实现一些简单的效果
    总结几点关于做互联网产品的思路
    norflash和nandflash电路
    存储过程
    USACO hamming 继续暴搜
    [原理分析]Linux下的栈溢出案例分析-GDB调试操练[1]
  • 原文地址:https://www.cnblogs.com/tangxuliang/p/9328510.html
Copyright © 2011-2022 走看看