在 Docker 中佈署網頁應用程式已成為現代開發流程的標準實務。本文將逐步引導讀者如何在 Docker 環境下設定 NGINX 並且 PHP 進行整合,涵蓋從基礎設定到進階應用的完整流程。首先,我們會使用 Docker Compose 簡化多容器應用程式的管理,接著說明如何組態 NGINX 以提供靜態和動態內容,並探討如何將 NGINX 設定為反向代理以連線主機上的應用程式。最後,我們將介紹如何使用 Ansible 自動化 NGINX 的組態管理,以提升佈署和維護效率。透過本文的實務案例與技術分析,讀者將能夠掌握在 Docker 中佈署和管理 NGINX 與 PHP 整合環境的關鍵技巧。

這篇文章將會探討如何使用 Docker 佈署 NGINX 並且 PHP 整合,從而建構一個高效能且易於管理的網頁應用程式環境。我們將會逐步說明如何安裝 Docker,使用 Docker Compose 協調多個容器,設定 NGINX 以提供靜態和動態內容,並探討如何將 NGINX 作為反向代理以連線主機上的應用程式。此外,我們也將會介紹如何使用 Ansible 自動化 NGINX 的組態管理,以提升佈署和維護效率。透過這些實務案例和技術分析,讀者將能夠全面掌握 Docker 中 NGINX 與 PHP 整合的關鍵技巧。

佈署NGINX於雲端架構

在前一節中,我們探討了雲端架構的基本概念。現在,讓我們從理論轉向實踐,逐步安裝並組態Docker來啟動我們的第一個容器。Docker不僅僅是一個工具,更是一種正規化轉移——一個新時代,讓軟體可以被封裝和隔離,確保在各種環境中保持一致性。在這一節結束時,Docker將不僅僅是一個概念;它將成為你工具箱的一部分,從佈署NGINX容器開始。

安裝Docker

幸運的是,Docker團隊提供了一個簡化安裝流程的指令碼。這個指令碼與多種Linux發行版相容,包括Red Hat Enterprise Linux(RHEL)、CentOS、Fedora、Debian、Ubuntu及其衍生版本。

要安裝Docker,你需要以root許可權執行這個指令碼。開啟終端機並輸入以下命令:

curl -s https://get.docker.com | bash

這個單一命令將使用特定於你Linux發行版的套件管理器來本地安裝Docker。這意味著更新Docker與更新系統上的其他套件一樣簡單。

啟動第一個Docker容器

操作Docker容器有多種方式。例如,你可以使用一個簡單的命令來啟動容器:

docker run -d nginx

這個命令從Docker Hub提取NGINX映像並以分離模式啟動新容器。然而,這個容器執行的是預設設定,尚未針對特定用途進行組態。

要自定義容器,你可以傳遞額外的引數。例如,要將容器的埠80對映到主機的埠80,允許網路流量到達容器,你可以執行以下命令:

docker run -d nginx -p 80:80

第一個命令啟動了帶有預設組態的NGINX容器。第二個命令執行相同的容器,但現在它透過主機機器的埠80可存取。但如果你需要更高階和完整的組態呢?這就是Docker Compose登場的時候了,它提供了一種簡單的方法來管理多容器Docker應用程式。

使用 Docker Compose 簡化流程

在執行第一個Docker容器後,我們清楚地看到直接從命令列管理容器的引數會變得繁瑣。Docker Compose透過允許我們使用YAML檔案來定義和執行多容器Docker應用程式來簡化這個過程。

讓我們建立一個與前一節中執行的一樣的設定——將埠80暴露給主機機器的一個NGINX容器:

  1. 首先,建立 /root/nginx 目錄,並在該目錄中儲存一個名為 docker-compose.yml 的檔案,內容如下:
version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"

完成 Docker Compose 設定

  1. 現在,將 Docker Compose 檔案儲存後,在同一目錄下執行以下命令:
docker compose up
  1. 您剛剛使用 Docker Compose 啟動了第一個容器。要停止此容器,只需使用快捷鍵 Ctrl + C(^C)。或者,您可以以分離模式啟動容器(up -d)並使用 down 命令停止它:
docker compose up -d
docker compose down

使用 Docker Compose 在 Docker 中執行 NGINX 變得只是在檔案中定義所需狀態的一件事,比獨立命令更易於管理和閱讀。在下一節中,我們將探討如何進一步組態 Docker 中的 NGINX ,使其符合我們的具體需求。

在 Docker 中設定 NGINX

熟悉 Docker Compose 後,我們將提升我們對 Docker 的使用。在這一節中,我們將透過新增自定義組態和網站內容來改進 NGINX 容器。

讓我們回顧一下之前建立的 docker-compose.yml 檔案。這個檔案已經指定了 NGINX 服務並將容器的埠80對映到主機機器上的埠80 ,使網頁伺服器從主機可存取。

接下來,我們希望 NGINX 容器能夠使用主機機上的實際組態檔案和內容來提供網站。為此,我們將使用 Docker 槽卷。槽卷是 Docker 容器生成和使用資料的首選機制。以下是如何修改 docker-compose.yml 檔案來掛載槽卷:

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html

在此設定中 ,./config/nginx.conf 是主機機上自定義 NGINX 組態檔案的路徑 。 /etc/nginx/nginx.conf 是 NGINX 容器期望找到組態檔案的路徑 。 第二個槽卷 ./html 是主機機上包含網站內容的目錄 ,掛載到 Docker 容器中的 /usr/share/nginx/html/ 。這種方法確保你可以直接在主機機上編輯 NGINX 組態或網站內容 ,而這些更改將反映在容器中。

根據GitHub中的專案程式碼範例

# docker-compose.yml

version: '3'
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html
      - ./nginx.conf:/etc/nginx/conf.d/default.conf

# nginx.conf

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}
小段落標題

此圖示展示瞭如何透過 YAML 組態檔案與 Docker Compose 啟動 NGINX:Web Server Deployment

Nginx 組態檔案解說

server {
    listen       80;
    server_name  localhost;

    location / {
        root   /usr/share/nginx/html;
        index  index.html index.htm;
    }

    error_page   500 502 503 504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }
}

內容解密:

  • server { ... }:這是 Nginx 中用於定義伺服器區塊的主要結構。
  • listen 80;:告訴 Nginx 在哪個埠監聽請求。
  • server_name localhost;:定義伺服器名稱。
  • location / { ... }:處理所有進入網站根目錄(/)的請求。
  • root /usr/share/nginx/html;:指定 HTML 檔案所在目錄。
  • index index.html index.htm;:當使用者存取根目錄時顯示哪些檔案。
  • error_page ...:當遇到特定錯誤時顯示自定義錯誤頁面。

槽卷解說:

  • volumes::用於掛載主機上的目錄到 Docker Container 中。
  • - ./config/nginx.conf:/etc/nginx/nginx.conf:掛載 Nginx 組態檔案。
  • - ./html:/usr/share/nginx/html:掛載 HTML 內容目錄。

案例分析

假設玄貓需要佈署一套靜態網站資源: 首先需要準備HTML資源放在 html/資料夾底下:

<html>
<head>
<title>黑貓</title>
</head>
<body>
<h1>Hello, BlackCat</h1>
<p>歡迎使用 Docker 技術</p>
</body>
</html>

接著會把上面提供 Nginx 組態檔案放在 config/ 資料夾底下:

server {
listen       80;
server_name localhost;

location / {
root   /usr/share/nginx/html;
index   index.html index.htm;
}

error_page   500 502 503 /50x.html;
location = /50x.html {
root   /usr/share/nginx/html;
}
}

最後執行 docker compose up 指令即可完成整體佈署作業!

最佳化建議

  1. 安全性:確保主機上的敏感資料不被意外掛載到 container 中。
  2. 效能:避免掛載過大目錄影響啟動速度。
  3. 可維護性:合理規劃目錄結構確保程式碼易於管理與維護。

隨著技術的發展及雲端服務越來越普遍化應用在各種不同領域中實務應用上, 未來必須考慮更多伺服要更新及擴充上的應用, 所以必須更加謹慎地選擇 DOCKER 處理方式及技術去處理未來可能出現之問題, 才能有效提升各項系統之運作表現! 當然也要注意相關安全措施及考量上面之最佳化建議內之事項, 可以更進一步提升整體系統運作安全性及效能!


以上便是玄貓針對此次技術內部深入分析報告與詳細說明! 期待大家有任何疑問皆可留言與玄貓討論! 如果有任何技術問題或其他相關想法皆歡迎分享與討論!

Docker 中的 NGINX 設定與 PHP 整合

在現代的網頁開發環境中,NGINX 與 PHP 的整合是非常常見的組合。透過 Docker 容器來管理這些服務,可以大大提升開發與佈署的效率。本文將探討如何在 Docker 中設定 NGINX,並且 PHP 進行整合,提供具體的實務案例及詳細的技術分析。

設定 NGINX 在 Docker 中

首先,我們需要在 Docker 中設定 NGINX。NGINX 是預先組態好的,因此我們可以跳過掛載 nginx.conf 檔案的步驟,直接使用預設設定。然而,我們需要掛載 html 目錄,因為這是 NGINX 預期找到要提供的網頁內容的位置。

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./html:/usr/share/nginx/html

內容解密:

這段 YAML 檔案定義了一個簡單的 Docker Compose 組態,其中包含一個名為 nginx 的服務。這個服務使用最新的 NGINX 映像,並將本地目錄中的 html 資料夾掛載到容器內的 /usr/share/nginx/html 目錄中。這樣,NGINX 就可以正確地提供這些靜態網頁內容。

增加 PHP 支援

接下來,我們將升級我們的 NGINX 伺服器以處理動態內容,例如 PHP。這種組合在網頁開發中非常常見,而 Docker Compose 使得這種組態變得更加簡單。

我們首先擴充套件現有的 docker-compose.yml 檔案以包含一個 PHP 服務,然後確保 NGINX 能夠透過 FastCGI 與 PHP 服務進行通訊。

docker-compose.yml

version: '3'
services:
  nginx:
    image: nginx:latest
    ports:
      - "80:80"
    volumes:
      - ./config/nginx.conf:/etc/nginx/nginx.conf
      - ./html:/usr/share/nginx/html
    depends_on:
      - php
  php:
    image: php:8.3-fpm
    volumes:
      - ./html:/usr/share/nginx/html

內容解密:

這段 YAML 檔案新增了一個名為 php 的服務,該服務使用官方的 PHP 映像並啟用了 FastCGI Process Manager (php-fpm)。我們也將 html 資料夾掛載到 PHP 容器中,以確保它能夠存取與 NGINX 一樣的網頁檔案。

組態 NGINX 與 PHP 的通訊

在啟動 Docker 輸容器之前,我們需要確保 NGINX 和 PHP 能夠通訊。讓我們編輯 nginx.conf 檔案以包含 FastCGI 引數:

nginx.conf

events {}

http {
    server {
        listen 80;
        server_name localhost;
        root /usr/share/nginx/html;
        index index.php index.html index.htm;

        location / {
            try_files $uri $uri/ =404;
        }

        location ~ \.php$ {
            try_files $uri =404;
            fastcgi_pass php:9000;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
            include fastcgi_params;
        }
    }
}

內容解密:

這段組態指示 NGINX 將請求轉發至執行於 PHP-FPM 服務中的 PHP 檔案。NGINX 使用 Docker 的內部 DNS 暴露名稱 php 操作 php-fpm 服務。如果在你的 docker-compose.yml 檔案中重新命名了服務,請記得更新 nginx.conf 檔案以比對新的服務名稱。

啟動並驗證組態

有了上述的 docker-compose.ymlnginx.conf 組態後,我們可以執行以下命令來啟動 Docker 輸容器:

docker compose up

啟動後,建立一個包含 <?php phpinfo(); ?> 的 PHP 檔案來驗證 NGINX 和 PHP 是否正確通訊。這將顯示一個 PHP 資訊頁面,確認容器之間的通訊成功。

驗證範例

建立一個名為 info.php 的檔案:

<?php phpinfo(); ?>

存取該檔案時應該會顯示 PHP 資訊頁面。

NGINX 作為反向代理

除了處理靜態和動態內容外,NGINX 還可以作為反向代理來處理主機上的應用程式。Docker 提供了內建支援來進行容器到主機連線。

以下是一個樣本 NGINX 組態,用於與主機上執行的 Web 底層應用程式進行互動:

server {
    listen 80;

    location /hostapp {
        proxy_pass http://host.docker.internal:4000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

此圖示

@startuml
skinparam backgroundColor #FEFEFE
skinparam componentStyle rectangle

title Docker 佈署 NGINX 與 PHP 整合實務案例

package "Docker 架構" {
    actor "開發者" as dev

    package "Docker Engine" {
        component [Docker Daemon] as daemon
        component [Docker CLI] as cli
        component [REST API] as api
    }

    package "容器運行時" {
        component [containerd] as containerd
        component [runc] as runc
    }

    package "儲存" {
        database [Images] as images
        database [Volumes] as volumes
        database [Networks] as networks
    }

    cloud "Registry" as registry
}

dev --> cli : 命令操作
cli --> api : API 呼叫
api --> daemon : 處理請求
daemon --> containerd : 容器管理
containerd --> runc : 執行容器
daemon --> images : 映像檔管理
daemon --> registry : 拉取/推送
daemon --> volumes : 資料持久化
daemon --> networks : 網路配置

@enduml

內容解密:

此圖示展示了 NGINX 輸容器如何透過 host.docker.internal 與主機上的應用程式進行通訊。NGINX 接收到請求後轉發到主機上的指定埠(例如:4000),從而實作反向代理功能。

支援自動化組態管理工具 Ansible

在現代雲端基礎架構中,組態管理工具如 Ansible 是非常重要的一環。Ansible 能夠幫助我們精確地佈署和管理大量伺服器上的應用程式。以下是如何使用 Ansible 自動化組態管理 NGINX 的範例:

Ansible Playbook 範例

---
- name: Setup NGINX using Ansible
  hosts: webservers
  become: yes
  tasks:
    - name: Install NGINX
      apt:
        name: nginx
        state: present

    - name: Start and enable NGINX service
      systemd:
        name: nginx
        enabled: yes
        state: started

    - name: Deploy configuration file
      copy:
        src: /path/to/local/nginx.conf
        dest: /etc/nginx/nginx.conf

    - name: Restart NGINX service to apply changes
      systemd:
        name: nginx
        state: restarted

內容解密:

這個 Ansible Playbook 展示瞭如何在多台伺服器上安裝和組態 NGINX。Playbook 包括安裝、啟動和啟用 NGINX 服務、佈署組態檔案以及重啟服務以應用變更等步驟。

安裝及更新自動化

除了基本安裝和組態外,Ansible 擁有強大的功能來實作自動更新和維護。以下是如何使用 Ansible 自動更新 NGINX 的範例:

---
- name: Update and upgrade apt packages and install necessary packages on all servers
  hosts: all_servers
  become: yes
  tasks:
    - name: Update apt cache and upgrade packages to the latest version available.
      apt:
        update_cache: yes
        upgrade: dist

    - name: Install or upgrade specific packages.
      apt:
        name:
          - nginx
          - php-fpm # example package for PHP support if needed.
          - other_package_name # Add other packages if needed.

內容解密:

這個 Playbook 用於更新所有伺服器上的套件並安裝或升級特定套件(例如:NGINX 和 PHP-FPM)。透過這樣的自動化流程可以大大提升系統維護效率。