亚洲国产日韩欧美一区二区三区,精品亚洲国产成人av在线,国产99视频精品免视看7,99国产精品久久久久久久成人热,欧美日韩亚洲国产综合乱

目錄
Docker 如何布置PHP開發(fā)環(huán)境,docker布置php開發(fā)
首頁 php教程 php手冊(cè) Docker 如何布置PHP開發(fā)環(huán)境,docker布置php開發(fā)

Docker 如何布置PHP開發(fā)環(huán)境,docker布置php開發(fā)

Jul 06, 2016 pm 02:24 PM
docker 開發(fā)環(huán)境 黑松露

Docker 如何布置PHP開發(fā)環(huán)境,docker布置php開發(fā)

環(huán)境部署一直是一個(gè)很大的問題,無論是開發(fā)環(huán)境還是生產(chǎn)環(huán)境,但是 Docker 將開發(fā)環(huán)境和生產(chǎn)環(huán)境以輕量級(jí)方式打包,提供了一致的環(huán)境。極大的提升了開發(fā)部署一致性。當(dāng)然,實(shí)際情況并沒有這么簡(jiǎn)單,因?yàn)樯a(chǎn)環(huán)境和開發(fā)環(huán)境的配置是完全不同的,比如日志等的問題都需要單獨(dú)配置,但是至少比以前更加簡(jiǎn)單方便了,這里以 PHP 開發(fā)作為例子講解 Docker 如何布置開發(fā)環(huán)境。

一般來說,一個(gè) PHP 項(xiàng)目會(huì)需要以下工具:

  1. Web 服務(wù)器: Nginx/Tengine
  2. Web 程序: PHP-FPM
  3. 數(shù)據(jù)庫: MySQL/PostgreSQL
  4. 緩存服務(wù): Redis/Memcache

這是最簡(jiǎn)單的架構(gòu)方式,在 Docker 發(fā)展早期,Docker 被大量的濫用,比如,一個(gè)鏡像內(nèi)啟動(dòng)多服務(wù),日志收集依舊是按照 Syslog 或者別的老方式,鏡像容量非常龐大,基礎(chǔ)鏡像就能達(dá)到 80M,這和 Docker 當(dāng)初提出的思想完全南轅北轍了,而 Alpine Linux 發(fā)行版作為一個(gè)輕量級(jí) Linux 環(huán)境,就非常適合作為 Docker 基礎(chǔ)鏡像,Docker 官方也推薦使用 Alpine 而不是 Debian 作為基礎(chǔ)鏡像,未來大量的現(xiàn)有官方鏡像也將會(huì)遷移到 Alpine 上。本文所有鏡像都將以 Alpine 作為基礎(chǔ)鏡像。

Nginx/Tengine

這部分筆者已經(jīng)在另一篇文章 Docker 容器的 Nginx 實(shí)踐中講解了 Tengine 的 Docker 實(shí)踐,并且給出了 Dockerfile,由于比較偏好 Tengine,而且官方已經(jīng)給出了 Nginx 的 alpine 鏡像,所以這里就用 Tengine。筆者已經(jīng)將鏡像上傳到官方 DockerHub,可以通過

docker pull chasontang/tengine:2.1.2_f

獲取鏡像,具體請(qǐng)看 Dockerfile。

PHP-FPM

Docker 官方已經(jīng)提供了 PHP 的 7.0.7-fpm-alpine 鏡像,Dockerfile 如下:

FROM alpine:3.4

# persistent / runtime deps
ENV PHPIZE_DEPS \
    autoconf \
    file \
    g++ \
    gcc \
    libc-dev \
    make \
    pkgconf \
    re2c
RUN apk add --no-cache --virtual .persistent-deps \
    ca-certificates \
    curl

# ensure www-data user exists
RUN set -x \
  && addgroup -g 82 -S www-data \
  && adduser -u 82 -D -S -G www-data www-data
# 82 is the standard uid/gid for "www-data" in Alpine
# http://git.alpinelinux.org/cgit/aports/tree/main/apache2/apache2.pre-install?h=v3.3.2
# http://git.alpinelinux.org/cgit/aports/tree/main/lighttpd/lighttpd.pre-install?h=v3.3.2
# http://git.alpinelinux.org/cgit/aports/tree/main/nginx-initscripts/nginx-initscripts.pre-install?h=v3.3.2

ENV PHP_INI_DIR /usr/local/etc/php
RUN mkdir -p $PHP_INI_DIR/conf.d

##<autogenerated>##
ENV PHP_EXTRA_CONFIGURE_ARGS --enable-fpm --with-fpm-user=www-data --with-fpm-group=www-data
##</autogenerated>##

ENV GPG_KEYS 1A4E8B7277C42E53DBA9C7B9BCAA30EA9C0D5763

ENV PHP_VERSION 7.0.7
ENV PHP_FILENAME php-7.0.7.tar.xz
ENV PHP_SHA256 9cc64a7459242c79c10e79d74feaf5bae3541f604966ceb600c3d2e8f5fe4794

RUN set -xe \
  && apk add --no-cache --virtual .build-deps \
    $PHPIZE_DEPS \
    curl-dev \
    gnupg \
    libedit-dev \
    libxml2-dev \
    openssl-dev \
    sqlite-dev \
  && curl -fSL "http://php.net/get/$PHP_FILENAME/from/this/mirror" -o "$PHP_FILENAME" \
  && echo "$PHP_SHA256 *$PHP_FILENAME" | sha256sum -c - \
  && curl -fSL "http://php.net/get/$PHP_FILENAME.asc/from/this/mirror" -o "$PHP_FILENAME.asc" \
  && export GNUPGHOME="$(mktemp -d)" \
  && for key in $GPG_KEYS; do \
    gpg --keyserver ha.pool.sks-keyservers.net --recv-keys "$key"; \
  done \
  && gpg --batch --verify "$PHP_FILENAME.asc" "$PHP_FILENAME" \
  && rm -r "$GNUPGHOME" "$PHP_FILENAME.asc" \
  && mkdir -p /usr/src \
  && tar -Jxf "$PHP_FILENAME" -C /usr/src \
  && mv "/usr/src/php-$PHP_VERSION" /usr/src/php \
  && rm "$PHP_FILENAME" \
  && cd /usr/src/php \
  && ./configure \
    --with-config-file-path="$PHP_INI_DIR" \
    --with-config-file-scan-dir="$PHP_INI_DIR/conf.d" \
    $PHP_EXTRA_CONFIGURE_ARGS \
    --disable-cgi \
# --enable-mysqlnd is included here because it's harder to compile after the fact than extensions are (since it's a plugin for several extensions, not an extension in itself)
    --enable-mysqlnd \
# --enable-mbstring is included here because otherwise there's no way to get pecl to use it properly (see https://github.com/docker-library/php/issues/195)
    --enable-mbstring \
    --with-curl \
    --with-libedit \
    --with-openssl \
    --with-zlib \
  && make -j"$(getconf _NPROCESSORS_ONLN)" \
  && make install \
  && { find /usr/local/bin /usr/local/sbin -type f -perm +0111 -exec strip --strip-all '{}' + || true; } \
  && make clean \
  && runDeps="$( \
    scanelf --needed --nobanner --recursive /usr/local \
      | awk '{ gsub(/,/, "\nso:", $2); print "so:" $2 }' \
      | sort -u \
      | xargs -r apk info --installed \
      | sort -u \
  )" \
  && apk add --no-cache --virtual .php-rundeps $runDeps \
  && apk del .build-deps

COPY docker-php-ext-* /usr/local/bin/

##<autogenerated>##
WORKDIR /var/www/html

RUN set -ex \
  && cd /usr/local/etc \
  && if [ -d php-fpm.d ]; then \
    # for some reason, upstream's php-fpm.conf.default has "include=NONE/etc/php-fpm.d/*.conf"
    sed 's!=NONE/!=!g' php-fpm.conf.default | tee php-fpm.conf > /dev/null; \
    cp php-fpm.d/www.conf.default php-fpm.d/www.conf; \
  else \
    # PHP 5.x don't use "include=" by default, so we'll create our own simple config that mimics PHP 7+ for consistency
    mkdir php-fpm.d; \
    cp php-fpm.conf.default php-fpm.d/www.conf; \
    { \
      echo '[global]'; \
      echo 'include=etc/php-fpm.d/*.conf'; \
    } | tee php-fpm.conf; \
  fi \
  && { \
    echo '[global]'; \
    echo 'error_log = /proc/self/fd/2'; \
    echo; \
    echo '[www]'; \
    echo '; if we send this to /proc/self/fd/1, it never appears'; \
    echo 'access.log = /proc/self/fd/2'; \
    echo; \
    echo 'clear_env = no'; \
    echo; \
    echo '; Ensure worker stdout and stderr are sent to the main error log.'; \
    echo 'catch_workers_output = yes'; \
  } | tee php-fpm.d/docker.conf \
  && { \
    echo '[global]'; \
    echo 'daemonize = no'; \
    echo; \
    echo '[www]'; \
    echo 'listen = [::]:9000'; \
  } | tee php-fpm.d/zz-docker.conf

EXPOSE 9000
CMD ["php-fpm"]
##</autogenerated>##

首先,鏡像繼承自 alpine:3.4 鏡像,使用 apk 命令安裝 php 最小依賴,同時(shí)添加 www-data 作為 php-fpm 的運(yùn)行用戶,將 php 的配置文件指定到 /usr/local/etc/php,然后就是下載 php-src,編譯安裝,這里可以參考筆者之前寫的 php 編譯安裝文章。參數(shù)都中規(guī)中矩。安裝目錄被指定到 /usr/local,然后使用 scanelf 獲得所依賴的運(yùn)行庫列表,并且將其他安裝包刪除。將 docker-php-ext-configure、docker-php-ext-enable、docker-php-ext-install 復(fù)制到容器中,這三個(gè)文件用于后續(xù)安裝擴(kuò)展。然后將 php-fpm.conf 復(fù)制到配置目錄,將 error_log 和 access_log 指定到終端標(biāo)準(zhǔn)輸出,daemonize = no 表示不以服務(wù)進(jìn)程運(yùn)行。EXPOSE 9000 端口用于和其他容器通信,然后就是 CMD ["php-fpm"] 運(yùn)行 php-fpm。而且工作目錄被指定到 /var/www/html。

docker-compose

已經(jīng)搞定了基礎(chǔ)鏡像,我們就可以使用基礎(chǔ)鏡像來配置容器,但是通過手工 docker 命令啟動(dòng)容器會(huì)非常麻煩。但是萬幸的是官方已經(jīng)提供了 docker-compose 命令來編排容器,只需要寫一個(gè) docker-compose.yaml 文件就行,具體可以參考官方文檔。

version: '2'
services:
 php-fpm:
  image: php:7.0.7-fpm-alpine
  volumes:
   - "./src:/var/www/html"
  restart: always

 tengine:
  depends_on:
   - php-fpm
  links:
   - php-fpm
  image: chasontang/tengine:2.1.2_f
  volumes:
   - "./nginx.vh.default.conf:/etc/nginx/conf.d/default.conf"
  ports:
   - "80:80"
  restart: always

非常容易理解,這里定義了兩個(gè)服務(wù),php-fpm 依賴 php:7.0.7-fpm-alpine 鏡像,并且將 src 文件夾映射為 /var/www/html 文件夾,tengine 服務(wù)依賴 php-fpm 服務(wù),并且 link php-fpm 服務(wù),這樣就能通過網(wǎng)絡(luò)與 php-fpm 容器通信,tengine 服務(wù)基于 chasontang/tengine:2.1.2_f 鏡像,并將 nginx.vh.default.conf 文件映射為 /etc/nginx/conf.d/default.conf 文件。然后來看 nginx.vh.default.conf

server {
  listen    80;
  server_name localhost;

  #charset koi8-r;

  #access_log logs/host.access.log main;

  location / {
    root  html;
    index index.html index.htm;
  }

  #error_page 404       /404.html;

  # redirect server error pages to the static page /50x.html
  #
  error_page  500 502 503 504 /50x.html;
  location = /50x.html {
    root  html;
  }

  # proxy the PHP scripts to Apache listening on 127.0.0.1:80
  #
  #location ~ \.php$ {
  #  proxy_pass  http://127.0.0.1;
  #}

  location ~ [^/]\.php(/|$) {
    fastcgi_split_path_info ^(.+&#63;\.php)(/.*)$;
    fastcgi_pass php-fpm:9000;
    fastcgi_index index.php;
    fastcgi_param SCRIPT_FILENAME /var/www/html$fastcgi_script_name;
    fastcgi_param PATH_INFO $fastcgi_path_info;
    include fastcgi_params;
  }

  # deny access to .htaccess files, if Apache's document root
  # concurs with nginx's one
  #
  #location ~ /\.ht {
  #  deny all;
  #}
}

tengine 鏡像實(shí)際上使用兩個(gè)配置文件,一個(gè)是 /etc/nginx/nginx.conf,還有就是 /etc/nginx/conf.d/ 目錄下的所有文件,因?yàn)?/etc/nginx/nginx.conf 中使用 include /etc/nginx/conf.d/*.conf; 包含了這個(gè)目錄,也就是說,可以不需要去管 nginx 其他配置,只需要用自己的 nginx 虛擬主機(jī)配置替代默認(rèn)的虛擬主機(jī)配置,或者說增加虛擬主機(jī)配置就行了。

從上面可以看到,default.conf 文件定義了一個(gè) location 匹配包含 .php 的 URL,然后將其分割出 PATH_INFO 參數(shù),將這些變量傳遞給 php-fpm:9000 的 php-fpm 服務(wù)。

這里需要注意的是,由于 Nginx 和 PHP-FPM 不在同一臺(tái)主機(jī)上,所以 Nginx 只做靜態(tài)文件處理和路由轉(zhuǎn)發(fā),實(shí)際的 PHP 文件執(zhí)行時(shí)在 PHP-FPM 容器中發(fā)生的。所以 SCRIPT_FILENAME 變量必須要使用 PHP-FPM 容器中的目錄,所以這里使用硬編碼指定。當(dāng)然,也可以讓兩個(gè)容器共享同一個(gè)數(shù)據(jù)卷,但是筆者認(rèn)為,這只是為了方便容器編排,其他完全沒有好處。

很容易吧! 現(xiàn)在我們可以快速的啟動(dòng)、更新環(huán)境了,但還是有很多地方需要改進(jìn)。

本網(wǎng)站聲明
本文內(nèi)容由網(wǎng)友自願(yuàn)投稿,版權(quán)歸原作者所有。本站不承擔(dān)相應(yīng)的法律責(zé)任。如發(fā)現(xiàn)涉嫌抄襲或侵權(quán)的內(nèi)容,請(qǐng)聯(lián)絡(luò)admin@php.cn

熱AI工具

Undress AI Tool

Undress AI Tool

免費(fèi)脫衣圖片

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅(qū)動(dòng)的應(yīng)用程序,用於創(chuàng)建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費(fèi)的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費(fèi)的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強(qiáng)大的PHP整合開發(fā)環(huán)境

Dreamweaver CS6

Dreamweaver CS6

視覺化網(wǎng)頁開發(fā)工具

SublimeText3 Mac版

SublimeText3 Mac版

神級(jí)程式碼編輯軟體(SublimeText3)

.NET Core快速入門教程 1、開篇:說說.NET Core的那些事兒 .NET Core快速入門教程 1、開篇:說說.NET Core的那些事兒 May 07, 2025 pm 04:54 PM

一、.NETCore的起源談到.NETCore,就不能不提它的前身.NET。當(dāng)年Java風(fēng)頭正盛,微軟也對(duì)Java青睞有加,Windows平臺(tái)上的Java虛擬機(jī)就是微軟依據(jù)JVM標(biāo)準(zhǔn)開發(fā)的,據(jù)稱是當(dāng)時(shí)性能最佳的Java虛擬機(jī)。然而,微軟有自己的小算盤,試圖將Java與Windows平臺(tái)捆綁,增加一些Windows特有的功能。 Sun公司對(duì)此不滿,導(dǎo)致雙方關(guān)係破裂,微軟隨後推出了.NET。 .NET從誕生之初就借鑒了Java的許多特性,並在語言特性和窗體開發(fā)等方面逐漸超越了Java。 Java在1.6版

C  中的跨平臺(tái)開發(fā)環(huán)境有哪些? C 中的跨平臺(tái)開發(fā)環(huán)境有哪些? Apr 28, 2025 pm 09:24 PM

在C 中進(jìn)行跨平臺(tái)開發(fā),推薦使用VisualStudioCode、CLion和QtCreator。 1.VisualStudioCode搭配C/C 插件,輕量靈活,適合多平臺(tái)開發(fā),但初次配置較複雜。 2.CLion集成CMake,適合跨平臺(tái)項(xiàng)目,但許可證昂貴。 3.QtCreator支持跨平臺(tái)開發(fā),內(nèi)置Qt庫,但學(xué)習(xí)曲線陡峭。

怎樣開發(fā)一個(gè)完整的PythonWeb應(yīng)用程序? 怎樣開發(fā)一個(gè)完整的PythonWeb應(yīng)用程序? May 23, 2025 pm 10:39 PM

要開發(fā)一個(gè)完整的PythonWeb應(yīng)用程序,應(yīng)遵循以下步驟:1.選擇合適的框架,如Django或Flask。 2.集成數(shù)據(jù)庫,使用ORM如SQLAlchemy。 3.設(shè)計(jì)前端,使用Vue或React。 4.進(jìn)行測(cè)試,使用pytest或unittest。 5.部署應(yīng)用,使用Docker和平臺(tái)如Heroku或AWS。通過這些步驟,可以構(gòu)建出功能強(qiáng)大且高效的Web應(yīng)用。

Docker vs. Kubernetes:主要差異和協(xié)同作用 Docker vs. Kubernetes:主要差異和協(xié)同作用 May 01, 2025 am 12:09 AM

Docker和Kubernetes是容器化和編排的領(lǐng)軍者。 Docker專注於容器生命週期管理,適合小型項(xiàng)目;Kubernetes則擅長(zhǎng)容器編排,適用於大規(guī)模生產(chǎn)環(huán)境。兩者結(jié)合可提升開發(fā)和部署效率。

C  中的交叉編譯是什麼? C 中的交叉編譯是什麼? Apr 28, 2025 pm 08:21 PM

C 中的交叉編譯是指在一個(gè)平臺(tái)上編譯出可以在另一個(gè)平臺(tái)上運(yùn)行的可執(zhí)行文件或庫。 1)交叉編譯需要使用專門的交叉編譯器,如GCC或Clang的變體。 2)設(shè)置交叉編譯環(huán)境可以使用Docker來管理工具鏈,提高可重複性和可移植性。 3)交叉編譯時(shí)需注意代碼優(yōu)化選項(xiàng),如-O2、-O3或-Os,以平衡性能和文件大小。

查看Docker容器內(nèi)部進(jìn)程信息的方法 查看Docker容器內(nèi)部進(jìn)程信息的方法 May 19, 2025 pm 09:06 PM

查看Docker容器內(nèi)部進(jìn)程信息有三種方法:1.使用dockertop命令,可以列出容器內(nèi)所有進(jìn)程,顯示PID、用戶、命令等信息;2.使用dockerexec進(jìn)入容器內(nèi)部,再用ps或top命令查看詳細(xì)進(jìn)程信息;3.使用dockerstats命令,實(shí)時(shí)顯示容器資源使用情況,結(jié)合dockertop可全面了解容器性能。

如何在Ubuntu上部署PyTorch應(yīng)用 如何在Ubuntu上部署PyTorch應(yīng)用 May 29, 2025 pm 11:18 PM

在Ubuntu上部署PyTorch應(yīng)用可以通過以下步驟完成:1.安裝Python和pip首先,確保你的系統(tǒng)上已經(jīng)安裝了Python和pip。你可以使用以下命令來安裝它們:sudoaptupdatesudoaptinstallpython3python3-pip2.創(chuàng)建虛擬環(huán)境(可選)為了隔離你的項(xiàng)目環(huán)境,建議創(chuàng)建一個(gè)虛擬環(huán)境:python3-mvenvmyenvsourcemyenv/bin/activat

Debian上Jenkins部署性能調(diào)優(yōu) Debian上Jenkins部署性能調(diào)優(yōu) May 28, 2025 pm 04:51 PM

在Debian上部署和調(diào)優(yōu)Jenkins是一個(gè)涉及多個(gè)步驟的過程,包括安裝、配置、插件管理和性能優(yōu)化。以下是一個(gè)詳細(xì)的指南,幫助你實(shí)現(xiàn)高效的Jenkins部署。安裝Jenkins首先,確保你的系統(tǒng)已經(jīng)安裝了Java環(huán)境。 Jenkins需要Java運(yùn)行時(shí)環(huán)境(JRE)才能正常運(yùn)行。 sudoaptupdatesudoaptinstallopenjdk-11-jdk驗(yàn)證Java安裝成功:java-version接下來,添加J

See all articles