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

Jadual Kandungan
Docker 如何布置PHP開發(fā)環(huán)境,docker布置php開發(fā)
Rumah php教程 php手冊 Docker 如何布置PHP開發(fā)環(huán)境,docker布置php開發(fā)

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

Jul 06, 2016 pm 02:24 PM
docker persekitaran pembangunan truffle hitam

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

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

一般來說,一個 PHP 項目會需要以下工具:

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

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

Nginx/Tengine

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

docker pull chasontang/tengine:2.1.2_f

獲取鏡像,具體請看 Dockerfile。

PHP-FPM

Docker 官方已經提供了 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 最小依賴,同時添加 www-data 作為 php-fpm 的運行用戶,將 php 的配置文件指定到 /usr/local/etc/php,然后就是下載 php-src,編譯安裝,這里可以參考筆者之前寫的 php 編譯安裝文章。參數(shù)都中規(guī)中矩。安裝目錄被指定到 /usr/local,然后使用 scanelf 獲得所依賴的運行庫列表,并且將其他安裝包刪除。將 docker-php-ext-configure、docker-php-ext-enable、docker-php-ext-install 復制到容器中,這三個文件用于后續(xù)安裝擴展。然后將 php-fpm.conf 復制到配置目錄,將 error_log 和 access_log 指定到終端標準輸出,daemonize = no 表示不以服務進程運行。EXPOSE 9000 端口用于和其他容器通信,然后就是 CMD ["php-fpm"] 運行 php-fpm。而且工作目錄被指定到 /var/www/html。

docker-compose

已經搞定了基礎鏡像,我們就可以使用基礎鏡像來配置容器,但是通過手工 docker 命令啟動容器會非常麻煩。但是萬幸的是官方已經提供了 docker-compose 命令來編排容器,只需要寫一個 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

非常容易理解,這里定義了兩個服務,php-fpm 依賴 php:7.0.7-fpm-alpine 鏡像,并且將 src 文件夾映射為 /var/www/html 文件夾,tengine 服務依賴 php-fpm 服務,并且 link php-fpm 服務,這樣就能通過網絡與 php-fpm 容器通信,tengine 服務基于 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 鏡像實際上使用兩個配置文件,一個是 /etc/nginx/nginx.conf,還有就是 /etc/nginx/conf.d/ 目錄下的所有文件,因為 /etc/nginx/nginx.conf 中使用 include /etc/nginx/conf.d/*.conf; 包含了這個目錄,也就是說,可以不需要去管 nginx 其他配置,只需要用自己的 nginx 虛擬主機配置替代默認的虛擬主機配置,或者說增加虛擬主機配置就行了。

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

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

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

Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn

Alat AI Hot

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

.NET Core Quick Start Tutorial 1. Permulaan: Bercakap Tentang .NET Core .NET Core Quick Start Tutorial 1. Permulaan: Bercakap Tentang .NET Core May 07, 2025 pm 04:54 PM

1. Asal .Netcore Apabila bercakap tentang .Netcore, kita tidak boleh menyebutkan pendahulunya .NET. Java berada di pusat perhatian pada masa itu, dan Microsoft juga menyukai Java. Mesin maya Java di platform Windows telah dibangunkan oleh Microsoft berdasarkan piawaian JVM. Ia dikatakan sebagai mesin maya Java prestasi terbaik pada masa itu. Walau bagaimanapun, Microsoft mempunyai abacus kecil sendiri, cuba membungkus Java dengan platform Windows dan menambah beberapa ciri khusus Windows. Ketidakpuasan Sun dengan ini membawa kepada pecahan hubungan antara kedua -dua pihak, dan Microsoft kemudian melancarkan .NET. .NET telah meminjam banyak ciri Java sejak penubuhannya dan secara beransur -ansur melepasi Java dalam ciri bahasa dan pembangunan bentuk. Java dalam versi 1.6

Apakah persekitaran pembangunan silang platform di C? Apakah persekitaran pembangunan silang platform di C? Apr 28, 2025 pm 09:24 PM

Pembangunan silang platform di C adalah disyorkan untuk menggunakan VisualStudiocode, Clion dan Qtcreator. 1. VisualStudiocode adalah ringan dan fleksibel, sesuai untuk pembangunan pelbagai platform, tetapi konfigurasi awal lebih rumit. 2. Clion mengintegrasikan CMake, sesuai untuk projek lintas platform, tetapi lesen mahal. 3.QTCreator menyokong pembangunan silang platform, dengan perpustakaan QT terbina dalam, tetapi lengkung pembelajaran adalah curam.

Bagaimana untuk membangunkan aplikasi web Python yang lengkap? Bagaimana untuk membangunkan aplikasi web Python yang lengkap? May 23, 2025 pm 10:39 PM

Untuk membangunkan aplikasi Web Python yang lengkap, ikuti langkah -langkah berikut: 1. Pilih rangka kerja yang sesuai, seperti Django atau Flask. 2. Mengintegrasikan pangkalan data dan menggunakan ORM seperti SQLalChemy. 3. Reka bentuk front-end dan gunakan Vue atau React. 4. Lakukan ujian, gunakan pytest atau unittest. 5. Menyebarkan aplikasi, gunakan Docker dan platform seperti Heroku atau AWS. Melalui langkah -langkah ini, aplikasi web yang kuat dan cekap boleh dibina.

Docker vs Kubernet: Perbezaan dan Sinergi Utama Docker vs Kubernet: Perbezaan dan Sinergi Utama May 01, 2025 am 12:09 AM

Docker dan Kubernet adalah pemimpin dalam kontena dan orkestra. Docker memberi tumpuan kepada pengurusan kitaran hayat kontena dan sesuai untuk projek kecil; Kubernet adalah baik pada orkestra kontena dan sesuai untuk persekitaran pengeluaran berskala besar. Gabungan kedua -duanya dapat meningkatkan kecekapan pembangunan dan penempatan.

Apakah kompilasi silang di C? Apakah kompilasi silang di C? Apr 28, 2025 pm 08:21 PM

Kompilasi silang di C merujuk untuk menyusun fail atau perpustakaan yang boleh dilaksanakan yang boleh dijalankan pada platform lain pada satu platform. 1) Kompilasi silang memerlukan penggunaan kompilasi silang khas, seperti varian GCC atau Clang. 2) Menyediakan persekitaran silang silang boleh menggunakan Docker untuk menguruskan alat untuk meningkatkan kebolehulangan dan mudah alih. 3) Apabila disusun silang, perhatikan pilihan pengoptimuman kod, seperti -o2, -o3 atau -OS, untuk mengimbangi prestasi dan saiz fail.

Cara melihat maklumat proses di dalam bekas Docker Cara melihat maklumat proses di dalam bekas Docker May 19, 2025 pm 09:06 PM

Terdapat tiga cara untuk melihat maklumat proses di dalam bekas Docker: 1. Gunakan arahan DockerTop untuk menyenaraikan semua proses dalam bekas dan paparan PID, pengguna, arahan dan maklumat lain; 2. Gunakan DockerExec untuk memasukkan bekas, dan kemudian gunakan PS atau Perintah Top untuk melihat maklumat proses terperinci; 3. Gunakan arahan Dockerstats untuk memaparkan penggunaan sumber kontena dalam masa nyata, dan menggabungkan Dockertop untuk memahami sepenuhnya prestasi bekas.

Cara Menggunakan Aplikasi PyTorch di Ubuntu Cara Menggunakan Aplikasi PyTorch di Ubuntu May 29, 2025 pm 11:18 PM

Menggunakan aplikasi pytorch di Ubuntu boleh dilakukan dengan mengikuti langkah -langkah: 1. Pasang Python dan Pip terlebih dahulu, pastikan Python dan PIP sudah dipasang pada sistem anda. Anda boleh memasangnya menggunakan arahan berikut: SudoaptDateSudoaptinstallpython3python3-pip2. Buat persekitaran maya (pilihan) untuk mengasingkan persekitaran projek anda, disarankan untuk mewujudkan persekitaran maya: python3-mvenvmyenvsourcemyenv/bin/activateT

Penalaan prestasi Jenkins Deployment di Debian Penalaan prestasi Jenkins Deployment di Debian May 28, 2025 pm 04:51 PM

Menggunakan dan menala Jenkins pada Debian adalah proses yang melibatkan pelbagai langkah, termasuk pemasangan, konfigurasi, pengurusan pemalam, dan pengoptimuman prestasi. Berikut adalah panduan terperinci untuk membantu anda mencapai penggunaan Jenkins yang cekap. Memasang Jenkins terlebih dahulu, pastikan sistem anda mempunyai persekitaran Java yang dipasang. Jenkins memerlukan persekitaran runtime Java (JRE) untuk berjalan dengan betul. sudoaptpdatesudoaptinstallopenjdk-11-jdk Sahkan bahawa pemasangan Java berjaya: java-versi seterusnya, tambah j

See all articles