首页 » 网站推广 » php72fpmimage技巧_运用Docker 搞定PHP开拓情形

php72fpmimage技巧_运用Docker 搞定PHP开拓情形

访客 2024-11-17 0

扫一扫用手机浏览

文章目录 [+]

1、内容概要

1-1为什么要利用Docker?

1-2准备事情

php72fpmimage技巧_运用Docker 搞定PHP开拓情形

1-3利用Docker构建PHP环境的过程

php72fpmimage技巧_运用Docker 搞定PHP开拓情形
(图片来自网络侵删)

预览

编写Dockerfile文件

PHP

Nginx

MySQL

Redis

编写配置文件

编写docker-compose.yml

1-4利用办法

1 利用搭建好的环境

2利用Composer

把稳事变

2、为什么要利用Docker?

现在不管是windows,mac还是linux,docker都可以很好支持,包括Windows系统,在win10系统下Docker for Windows 实在还是挺不错的。

通过Docker命令行,我们可以做很多事情,拉取镜像,运行容器,容器内实行命令等,但是现在,我们要用更加大略粗暴的办法,编写好dockerfiles文件,然后通过docker-compose管理好这些文件,简化操作流程。

什么是Dockerfile?

Dockerfile是由一系列命令和参数构成的脚本,这些命令运用于拉取的根本镜像并终极创建一个新的镜像,通过Dockerfile我们可以创建一个你须要的镜像,里面是包含了你要安装的软件,相称于是提前定制好要安装的拓展,实行的命令等,然后一键实行,极大地简化操作流程。

按照本文来搭建环境,你须要:

首先理解一下Docker以及Docker的一些基本操作,还有docker-compose是什么。

然后须要安装 Docker 和 docker-compose,我将利用 docker-compose 来管理我的 dockerfiles。

把稳,编写 dockerfile 是活的,不是去世的,每个人写出来的 dockerfile 都会不一样,取决于你的需求。

Docker的官方文档非常清楚,虽然是英文,但是基本上什么都有:https://docs.docker.com/

4、利用Docker构建PHP环境的过程

4.1预览

首先,我们来看一下,我创建的这个dockerfile项目(项目名称MyFirstPHP),我大概分成了下面的目录

在这个项目里,我用到PHP,MySQL,Nginx,Redis;以及Composer,Phalcon拓展等。

总的来说,我们做这件事有三个流程:编写好各个软件的dockerfile;编写好配置文件;通过docker-compose处理所有的dockerfile,包括将配置配置文件扔进去 dockerfile 文件将构建的镜像中。

4.2编写Dockerfile文件

4.2.1 PHP

以下是PHP的Dockerfile

FROM php:7.2-fpm MAINTAINER goozp \"大众gzp@goozp.com\"大众 ​ # 设置时区 ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone ​ # 更新安装依赖包和PHP核心拓展 RUN apt-get update && apt-get install -y \ git \ libfreetype6-dev \ libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd \ && docker-php-ext-install zip \ && docker-php-ext-install pdo_mysql \ && docker-php-ext-install opcache \ && docker-php-ext-install mysqli \ && rm -r /var/lib/apt/lists/ ​ # 将预先下载好的拓展包从宿主机拷贝进去 COPY ./pkg/redis.tgz /home/redis.tgz COPY ./pkg/cphalcon.tar.gz /home/cphalcon.tar.gz ​ # 安装 PECL 拓展,这里我们安装的是Redis RUN pecl install /home/redis.tgz && echo \"大众extension=redis.so\公众 > /usr/local/etc/php/conf.d/redis.ini ​ # 安装第三方拓展,这里是 Phalcon 拓展 RUN cd /home \ && tar -zxvf cphalcon.tar.gz \ && mv cphalcon- phalcon \ && cd phalcon/build \ && ./install \ && echo \"大众extension=phalcon.so\"大众 > /usr/local/etc/php/conf.d/phalcon.ini ​ # 安装 Composer ENV COMPOSER_HOME /root/composer RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer ENV PATH $COMPOSER_HOME/vendor/bin:$PATH ​ RUN rm -f /home/redis.tgz \ rm -f /home/cphalcon.tar.gz ​ WORKDIR /data ​ # Write Permission RUN usermod -u 1000 www-data

第一行定义了根本镜像,这里我们用了PHP7.2的fpm版本,这里第二行定义了一个掩护者。

接下来定义了时区,在每一个dockerfile都定义了这一句,紧张是为了使所有的容器的韶光都与宿主机同步,实在我们可以在docker-composer.yml文件中这么定义:

services: php-fpm: volumes: - /etc/localtime:/etc/localtime:ro

但是在非linux系统,比如Windows中运行时,我们不能取到/etc/localtime,为了更大兼容所有平台,我把韶光同步写到dockerfile中。

接下来安装一些拓展,实在安装拓展的过程类似于我们徒手在linux中安装PHP拓展,值得一提的是composer。
我将Composer直接安装在了php-fpm的镜像中,实在官方也供应了Composer的镜像,拉取composer镜像实行也可以达到目的,由于我们利用composer只是为了实行composer命令来管理我们的包,如果composer单独是一个容器的话,我们在不用时,还可以将容器关掉;但是在这里,我直接将composer装进php-fpm镜像中,紧张是我的项目安装了一些PHP拓展,在编写composer.json文件时,我定义了extension的依赖,这样composer实行时会检说情况是否安装了这些依赖,所有如果我直接用composer镜像的话,还须要把我用的拓展安装到镜像里,就麻烦多了,以是我直接在php镜像中就把这个事做了,实在没什么差异,取决于你怎么用。

4.2.2 Nginx

下面是 Nginx 的 dockerfile:

FROM nginx:1.12 ​ # set timezome ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

这个就大略多了,我只设置了一个韶光。
由于我不须要安装其它的东西,可以直策应用官方的镜像。

当然,我们须要修正配置文件,只要事先写好配置文件就行,末了在 docker-compose.yml 文件中,将配置文件扔进去,这个下面会讲,包括PHP的配置文件,MySQL的配置文件,都是一样的。

4.2.4 Redis

下面是 Redis 的,也直策应用官方镜像:

FROM redis:3.2 ​ # set timezome ENV TZ=Asia/Shanghai RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

4.3 编写配置文件

如何处理配置文件呢,我将配置文件进行归类,PHP的配置文件放在PHP目录下,Nginx的配置放在Nginx目录下,至于要不要再新建一个子文件夹就看情形了,比如conf.d文件夹。

下面以Nginx配置文件为例,首先nginx目录是这样的:

nginx/ conf.d/ default.conf zphal.conf Dockerfile nginx.conf

除了nginx.conf外,还有一个子文件夹conf.d用来存放所有的域名配置文件,在linux下搭建过php环境的该当都比较熟习。
这些配置文件便是我们到时候要传进去容器中的文件,我们并不会在宿主机利用这些文件。

以是须要把稳的最主要一点便是,配置文件中涌现的路径是容器底细况的路径,而不是宿主机的路径,每一个容器内都有一个运行环境,都是一台微型小系统,这些路径都是容器内的路径。
我们可以通过挂载与容器内通讯来同步文件,在命令行启动容器也须要挂载文件路径,而现在挂载这一步我们也用docker-compose来办理。

下面是一个配置文件示例:

server { listen 80 default; index index.html index.htm; server_name localhost docker; ​ root /data/www; index index.php index.html index.htm; location / { try_files $uri $uri/ /index.html; } ​ location ~ \.php { include fastcgi_params; fastcgi_pass php-fpm:9000; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME /data/www/$fastcgi_script_name; } }

而root /data/www中,/data/www路径,是到时候nginx容器的路径,而不是当前在操作的宿主机的路径,以是到时候我们要挂载web程序放的位置到这个路径。

4.4 编写docker-compose.yml

在php,nginx等目录的同级,我们创建一个 docker-compose.yml,我们在实行 docker-compose 干系命令时,会自动找到这个文件,并根据里面的内容来实行。

接上面 nginx 的例子,我们先谈挂载,由于这是最主要的一步。
在 docker-compose.yml 中,nginx 的部分:

nginx: build: ./nginx depends_on: - php-fpm links: - php-fpm:php-fpm volumes: - ../app:/data/www:rw - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ../logs/nginx:/var/log/nginx ports: - \"大众80:80\"大众 - \"大众8080:8080\"大众 - \公众443:443\"大众 restart: always command: nginx -g 'daemon off;'

有一个 volumes 参数,这里便是我们要挂载的目录的干系配置,第一条我们将../app挂载到/data/www之中,也是我们配置文件中定义的默认监听的root,而app目录是我们宿主机中的一个目录,通过这样挂载我们可以直接将我们的项目文件放到app中,docker会帮你传输到容器内的/data/www目录下。

其它的参数:

l build 定义了你的 dockerfile 在哪里,如果没有写 dockerfile 可以不用 build,可以用 images参数定义官方镜像,比如image:mysql:5.7;

l depends_on表示将依赖其它镜像,比如nginx依赖php-fpm,没有它我nginx没法玩;

l links定义连接,比如要连接到php-fpm容器,便是php-fpm:php-fpm,后面是别名;

l ports表示端口映射,80:80表示将80端口映射到宿主机的80端口

l restart重启,restart: always表示将自动重启

l command是自动实行的命令

参数很多,更多的可以参考官方文档。

下面是一个完全的 docker-compose.yml 文件:

version: '3.2' services: php-fpm: build: ./php/ ports: - \"大众9000:9000\"大众 links: - mysql-db:mysql-db - redis-db:redis-db volumes: - ../app:/data/www:rw - ./php/php-dev.ini:/usr/local/etc/php/php.ini:ro - ./php/php-fpm.conf:/usr/local/etc/php-fpm.conf:ro - ../logs/php-fpm:/var/log/php-fpm:rw restart: always command: php-fpm ​ nginx: build: ./nginx depends_on: - php-fpm links: - php-fpm:php-fpm volumes: - ../app:/data/www:rw - ./nginx/conf.d:/etc/nginx/conf.d:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - ../logs/nginx:/var/log/nginx ports: - \"大众80:80\公众 - \公众8080:8080\"大众 - \"大众443:443\"大众 restart: always command: nginx -g 'daemon off;' ​ mysql-db: build: ./mysql ports: - \"大众3306:3306\"大众 volumes: - ../data/mysql:/var/lib/mysql:rw - ../logs/mysql:/var/lib/mysql-logs:rw - ./mysql/conf.d:/etc/mysql/conf.d:ro environment: MYSQL_ROOT_PASSWORD: 123456 MYSQL_DATABASE: zphaldb MYSQL_USER: zphal MYSQL_PASSWORD: zphal123 restart: always command: \"大众--character-set-server=utf8\公众 ​ redis-db: build: ./redis ports: - \"大众6379:6379\"大众 volumes: - ../data/redis:/data restart: always5、利用办法

我们怎么用呢?

5.1 利用搭建好的环境

1、首先,进入项目dockerfiles的目录下,这里是files目录:

cd zPhal-dockerfiles/files ​ wget https://pecl.php.net/get/redis-3.1.6.tgz -O php/pkg/redis.tgz wget https://codeload.github.com/phalcon/cphalcon/tar.gz/v3.3.1 -O php/pkg/cphalcon.tar.gz

然后下载我们会用到的PHP拓展包。

2、实行命令:

docker-compose up

docker会自动通过编写好的docker-compose.yml内容构建镜像,并且启动容器。

如果没问题,下次启动时可以以守护模式启用,所有容器将后台运行:

docker-compose up -d

关闭容器

可以这样关闭容器并删除做事:

docker-compose down

利用 docker-compose 基本上就这么大略,用 stop,start 等这些命令来操纵容器做事。
而更多的事情是在于编写 dockerfile 和 docker-compose.yml 文件。

5.2 利用 Composer

当我们要利用composer时怎么做呢? 我们已经在php-fpm里安装了composer。

用 docker-compose 进行操作:

docker-compose run --rm -w /data/www/zPhal php-fpm composer update

-w /data/www/zPhal为在php-fpm的事情区域,zPhal项目也是挂载在里面,所有我们可以直接在容器里运行composer。

或者进入宿主机app目录下用docker命令:

cd zPhal-dockerfiles/app ​docker run -it --rm -v `pwd`:/data/www/ -w /data/www/zPhal files_php-fpm composer update6、把稳事变

l 把稳挂载路径

l 构建失落败时,把稳容器内是否报错

l 加速镜像。
如果过程下载镜像很慢,可以利用海内的加速镜像做事,比如阿里云,Daocloud。

IT技能研习社,专注互联网技能研究与分享,喜好的朋友可以点击【关注】;把履历通报给有梦想的人;

标签:

相关文章