资讯专栏INFORMATION COLUMN

如何构建一个php7-alpine的docker镜像

anonymoussf / 3146人阅读

摘要:我花了大概一周的时间进行了各种踩坑及实验,最终得出了一份可以使用的及内含如下支持可选,如应用,及的配置会有所变化分为两部分,一部分为服务,一部分为下可选先贴代码吧版本,如需安装则取消注释基础依赖

我花了大概一周的时间进行了各种踩坑及实验,最终得出了一份可以使用的dockerfile及compose

内含如下支持

php7

mysql_pdo

postgre_pdo

phpredis

swoole(可选,如应用swoole,dockerfile及nginx的配置会有所变化)

dockerfile分为两部分,一部分为php服务,一部分为nginx(swoole下可选)

先贴代码吧

### php7 ###

FROM php:7.2-rc-fpm-alpine3.6

ENV TIMEZONE Asia/Shanghai
ENV PHP_MEMORY_LIMIT 512M
ENV MAX_UPLOAD 50M
ENV PHP_MAX_FILE_UPLOAD 200
ENV PHP_MAX_POST 100M
## swoole版本,如需安装swoole则取消注释
#ENV PHP_EXT_SWOOLE=swoole-2.0.6
ENV PHP_REDIS=3.1.4
#基础依赖
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g" /etc/apk/repositories && 
  apk update && 
  apk add tzdata curl && 
  cp /usr/share/zoneinfo/${TIMEZONE} /etc/localtime && 
  echo "${TIMEZONE}" > /etc/timezone && 
  apk --update --repository=http://dl-4.alpinelinux.org/alpine/edge/testing add 
    php7-common php7-intl php7-gd php7-mcrypt php7-openssl 
    php7-gmp php7-json php7-dom php7-pdo php7-zip 
    php7-zlib php7-mysqli php7-bcmath php7-pdo_mysql php7-pgsql 
    php7-pdo_pgsql php7-gettext php7-xmlreaderhp7-xmlrpc 
    php7-bz2 php7-iconv php7-curl php7-ctype php7-fpm 
    php7-mbstring php7-session php7-phar curl curl-dev postgresql-dev 
    ## 如果使用swoole  需要取消下行注释
   # hiredis-dev libmcrypt-dev gmp-dev icu-dev linux-headers musl --virtual .phpize-deps $PHPIZE_DEPS 
    tzdata && 
    php -r "copy("https://getcomposer.org/installer", "composer-setup.php");" && 
    php composer-setup.php && 
    php -r "unlink("composer-setup.php");" && 
    mv composer.phar /usr/local/bin/composer && 
    composer self-update && 
    sed -i -e "s/;daemonizes*=s*yes/daemonize = no/g" /etc/php7/php-fpm.conf && 
    sed -i -e "s/listens*=s*127.0.0.1:9000/listen = 9000/g" /etc/php7/php-fpm.d/www.conf && 
    sed -i "s|;date.timezone =.*|date.timezone = ${TIMEZONE}|" /etc/php7/php.ini && 
    sed -i "s|memory_limit =.*|memory_limit = ${PHP_MEMORY_LIMIT}|" /etc/php7/php.ini && 
    sed -i "s|upload_max_filesize =.*|upload_max_filesize = ${MAX_UPLOAD}|" /etc/php7/php.ini && 
    sed -i "s|max_file_uploads =.*|max_file_uploads = ${PHP_MAX_FILE_UPLOAD}|" /etc/php7/php.ini && 
    sed -i "s|post_max_size =.*|max_file_uploads = ${PHP_MAX_POST}|" /etc/php7/php.ini && 
    sed -i "s/;cgi.fix_pathinfo=1/cgi.fix_pathinfo=0/" /etc/php7/php.ini && 
    sed -i "s/;extension=php_pgsql.dll/extension=php_pgsql.dll/" /etc/php7/php.ini && 
    sed -i "s/;extension=php_pdo_pgsql.dll/extension=php_pdo_pgsql.dll/" /etc/php7/php.ini && 
    mkdir -p /usr/src/php/ext/redis && 
    curl -L https://github.com/phpredis/phpredis/archive/$PHP_REDIS.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 && 
    echo "redis" >> /usr/src/php-available-exts && 
    docker-php-ext-install redis pgsql pdo pdo_mysql pdo_pgsql && 
      rm -rf /var/cache/apk/*
# 如需安装swoole,取消以下注释     
#RUN 
#    cd /tmp 
#    && pecl download $PHP_EXT_SWOOLE 
#    && mkdir -p /tmp/$PHP_EXT_SWOOLE 
#    && tar -xf ${PHP_EXT_SWOOLE}.tgz -C /tmp/$PHP_EXT_SWOOLE --strip-components=1 
#    && docker-php-ext-configure /tmp/$PHP_EXT_SWOOLE --enable-async-redis --enable-openssl --enable-sockets=/usr/local/include/php/ext/sockets 
#    && docker-php-ext-install /tmp/$PHP_EXT_SWOOLE 
#    && rm -rf /tmp/${PHP_EXT_SWOOLE}*

WORKDIR /www

# 放入自己需要的代码
#COPY  . /www
# 安装composer依赖
#RUN composer install

# php-fpm使用以下配置
EXPOSE 9000
CMD ["php-fpm"]
# swoole 使用以下配置
EXPOSE 9501
# 启动swoole server
CMD ["php","src/server","start"]

## swoole可以不依赖nginx 所以我多带带贴出php-fpm的nginx

nginx-dockerfile:

from nginx:1.13.6-alpine
ENV TIME_ZONE Asiz/Shanghai
RUN sed -i "s/dl-cdn.alpinelinux.org/mirrors.ustc.edu.cn/g" /etc/apk/repositories && 
    apk update && 
    apk add --no-cache tzdata  &&  
   echo "${TIME_ZONE}" > /etc/timezone &&  
   ln -sf /usr/share/zoneinfo/${TIME_ZONE} /etc/localtime 
COPY default.conf /etc/nginx/conf.d
EXPOSE 80
STOPSIGNAL SIGTERM
CMD ["nginx", "-g", "daemon off;"]

nginx_php-fpm:default.conf:

server {
    listen       80;
    server_name  *.yourserver.com;
    location / {
          autoindex on; 
          if ($request_filename !~* /(index.php|assets|uploads|phpinfo.php)) 
            {   
               rewrite ^/(.*)$ /index.php/$1 last;                                                                                                 
            }                                                                                      
    }
    location ~ .php(/|$) {
        fastcgi_split_path_info ^(.+?.php)(/.*)$;
        fastcgi_pass php-fpm:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME /www$fastcgi_script_name;
        fastcgi_param PATH_INFO $fastcgi_path_info;
        include fastcgi_params;
    } 
}

compose:

* swoole的编排模板很容易写 我就不在这里贴出了

version: "2"
services:
  php-fpm:
    image: "php-fpm"
    restart: always
    #日志系统,可不写
    #logging:
    #  driver: fluentd
    #  options:
    #    fluentd-address: "logaddr:24224"
    #    tag: "docker/{{.Name}}/{{.ID}}/{{.ImageName}}"
  php-nginx:
    image: "php-nginx"
    depends_on:
    #这几个是转义字符 但是不知道为什么就显示出来了,使用的时候自己去掉一下
      - php-fpm
    ports:
      - "80:80"
    links:
      - php-fpm
    restart: always
    #日志系统,可不写
    #logging:
    #  driver: fluentd
    #  options:
    #    fluentd-address: "logaddr:24224"
    #    tag: "docker/{{.Name}}/{{.ID}}/{{.ImageName}}"
    

我所做的是对php及nginx进行解耦
如果集群内有多个php服务需要互相访问,
因为compose不允许两个服务互相link
所以需要创建一个network在network中借助nginx进行互相访问
但是目前只有v3版的compose支持本功能,很多旧集群都无法正常支持本功能,所以我就不贴出代码了
编辑完成后,即可通过80端口访问index.php了

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27105.html

相关文章

  • Working with Docker Hub

    摘要:到目前为止我们已经学习了如何使用命令行在主机上运行。是由公司维护的公共注册仓库。其中有两个结果,。第二个表示它来自于一位叫的用户的仓库。第一个结果没有显示列出仓库则意味着它是受信任的官方顶级名称空间存储库。将仓库名和镜像名分割开。 Working with Docker Hub 到目前为止我们已经学习了如何使用命令行在主机上运行Docker。你已经学习了如何下载镜像,如何从已经存在的镜...

    Charles 评论0 收藏0
  • [Docker 官方文档] 理解 Docker

    摘要:将一个轻量级的容器虚拟化平台和一组标准工作流程工具进行集成,来帮助你方便地管理和部署应用。主要包括哪些组件主要包括两个组件开源的容器虚拟化平台用于分享和管理容器的软件即服务平台。 【编者的话】本文来自 Docker 的官方文档,详细介绍了 Docker 的体系结构、重要概念、内部工作机理等内容,推荐不了解 Docker 内部原理的同学阅读。 什么是 Docker? Docker 是...

    cncoder 评论0 收藏0
  • 程序员笔记——如何编写优雅Dockerfile

    摘要:导读要从容器化开始,而容器又需要从开始,本文将介绍如何写出一个优雅的文件。只要记住以上三点就能写出不错的。执行完成项目的构建。 导读 Kubernetes要从容器化开始,而容器又需要从Dockerfile开始,本文将介绍如何写出一个优雅的Dockerfile文件。 文章主要内容包括: Docker容器 Dockerfile 使用多阶构建 感谢公司提供大量机器资源及时间让我们可以实践...

    曹金海 评论0 收藏0
  • 如何使用GitLab和Rancher构建CI/CD流水线 – Part 2

    摘要:第一部分的内容介绍了如何部署配置和确保在的运行。这一部分中,我们将介绍如何使用构建容器,以及如何使用容器配置项目。除此之外,我们还将涉及如何用建立容器并部署到上。 这是我们使用GitLab和Rancher构建CI/CD流水线系列教程的第二部分。第一部分的内容介绍了如何部署、配置和确保GitLab在Rancher的运行。这一部分中,我们将介绍如何使用GitLab CI Multi-Run...

    maybe_009 评论0 收藏0
  • 都9102年了,还不会Docker?10分钟带你从入门操作到实战上手

    摘要:联调测试,无需依赖他人。针对以上问题,有两种解决方法,一个是自己搭建私有服务,另一个是用云服务的镜像管理平台如阿里云的容器镜像服务。利用,先对阿里云的服务进行登录。推送后,就能在阿里云的仓库上看到这个镜像。 Docker简述 Docker是一种OS虚拟化技术,是一个开源的应用容器引擎。它可以让开发者将应用打包到一个可移植的容器中,并且该容器可以运行在几乎所有linux系统中(Windo...

    sf_wangchong 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<