使用容器進行 PHP 開發
先決條件
完成 將 PHP 應用程式容器化。
概述
在本節中,您將學習如何為容器化應用程式設定開發環境。這包括
- 新增本地資料庫並持久化資料
- 新增 phpMyAdmin 以與資料庫互動
- 配置 Compose 在您編輯和儲存程式碼時自動更新正在執行的 Compose 服務
- 建立一個包含開發依賴項的開發容器
新增本地資料庫並持久化資料
您可以使用容器設定本地服務,例如資料庫。要為示例應用程式執行此操作,您需要執行以下操作:
- 更新
Dockerfile
以安裝連線到資料庫的擴充套件 - 更新
compose.yaml
檔案以新增資料庫服務和卷以持久化資料
更新 Dockerfile 以安裝擴充套件
要安裝 PHP 擴充套件,您需要更新 Dockerfile
。在 IDE 或文字編輯器中開啟您的 Dockerfile,然後更新其內容。以下 Dockerfile
包含一行新的程式碼,用於安裝 pdo
和 pdo_mysql
擴充套件。所有註釋均已刪除。
# syntax=docker/dockerfile:1
FROM composer:lts as deps
WORKDIR /app
RUN --mount=type=bind,source=composer.json,target=composer.json \
--mount=type=bind,source=composer.lock,target=composer.lock \
--mount=type=cache,target=/tmp/cache \
composer install --no-dev --no-interaction
FROM php:8.2-apache as final
RUN docker-php-ext-install pdo pdo_mysql
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY --from=deps app/vendor/ /var/www/html/vendor
COPY ./src /var/www/html
USER www-data
有關安裝 PHP 擴充套件的更多詳細資訊,請參閱 PHP 官方 Docker 映象。
更新 compose.yaml 檔案以新增資料庫並持久化資料
在 IDE 或文字編輯器中開啟 compose.yaml
檔案。您會注意到它已經包含 PostgreSQL 資料庫和卷的註釋說明。對於此應用程式,您將使用 MariaDB。有關 MariaDB 的更多詳細資訊,請參閱 MariaDB 官方 Docker 映象。
在 IDE 或文字編輯器中開啟 src/database.php
檔案。您會注意到它透過讀取環境變數來連線到資料庫。
在 compose.yaml
檔案中,您需要更新以下內容:
- 取消註釋並更新 MariaDB 的資料庫說明。
- 向伺服器服務新增一個秘密,以傳入資料庫密碼。
- 向伺服器服務新增資料庫連線環境變數。
- 取消註釋卷說明以持久化資料。
以下是更新後的 compose.yaml
檔案。所有註釋均已刪除。
services:
server:
build:
context: .
ports:
- 9000:80
depends_on:
db:
condition: service_healthy
secrets:
- db-password
environment:
- PASSWORD_FILE_PATH=/run/secrets/db-password
- DB_HOST=db
- DB_NAME=example
- DB_USER=root
db:
image: mariadb
restart: always
user: root
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD_FILE=/run/secrets/db-password
- MARIADB_DATABASE=example
expose:
- 3306
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--su-mysql",
"--connect",
"--innodb_initialized",
]
interval: 10s
timeout: 5s
retries: 5
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
注意要了解有關 Compose 檔案中指令的更多資訊,請參閱Compose 檔案參考。
在您使用 Compose 執行應用程式之前,請注意此 Compose 檔案使用 secrets
並指定了一個 password.txt
檔案來儲存資料庫密碼。您必須建立此檔案,因為它未包含在原始碼倉庫中。
在 docker-php-sample
目錄中,建立一個名為 db
的新目錄,並在該目錄中建立一個名為 password.txt
的檔案。在 IDE 或文字編輯器中開啟 password.txt
並新增以下密碼。密碼必須在一行上,檔案中沒有額外的行。
example
儲存並關閉 `password.txt` 檔案。
現在您的 docker-php-sample
目錄中應該包含以下內容。
├── docker-php-sample/
│ ├── .git/
│ ├── db/
│ │ └── password.txt
│ ├── src/
│ ├── tests/
│ ├── .dockerignore
│ ├── .gitignore
│ ├── compose.yaml
│ ├── composer.json
│ ├── composer.lock
│ ├── Dockerfile
│ ├── README.Docker.md
│ └── README.md
執行以下命令以啟動您的應用程式。
$ docker compose up --build
開啟瀏覽器,在 https://:9000/database.php 檢視應用程式。您應該會看到一個簡單的 Web 應用程式,其中包含文字和一個每次重新整理都會遞增的計數器。
在終端中按 ctrl+c
停止您的應用程式。
驗證資料庫中的資料是否持久化
在終端中,執行 docker compose rm
以刪除您的容器,然後執行 docker compose up
以再次執行您的應用程式。
$ docker compose rm
$ docker compose up --build
在瀏覽器中重新整理 https://:9000/database.php 並驗證之前的計數仍然存在。如果沒有卷,資料庫資料在您刪除容器後將不會持久化。
在終端中按 ctrl+c
停止您的應用程式。
新增 phpMyAdmin 以與資料庫互動
您可以透過更新 compose.yaml
檔案輕鬆地將服務新增到您的應用程式堆疊。
更新您的 compose.yaml
以新增一個用於 phpMyAdmin 的新服務。有關更多詳細資訊,請參閱 phpMyAdmin 官方 Docker 映象。以下是更新後的 compose.yaml
檔案。
services:
server:
build:
context: .
ports:
- 9000:80
depends_on:
db:
condition: service_healthy
secrets:
- db-password
environment:
- PASSWORD_FILE_PATH=/run/secrets/db-password
- DB_HOST=db
- DB_NAME=example
- DB_USER=root
db:
image: mariadb
restart: always
user: root
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD_FILE=/run/secrets/db-password
- MARIADB_DATABASE=example
expose:
- 3306
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--su-mysql",
"--connect",
"--innodb_initialized",
]
interval: 10s
timeout: 5s
retries: 5
phpmyadmin:
image: phpmyadmin
ports:
- 8080:80
depends_on:
- db
environment:
- PMA_HOST=db
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
在終端中,執行 docker compose up
以再次執行您的應用程式。
$ docker compose up --build
在瀏覽器中開啟 https://:8080 以訪問 phpMyAdmin。使用使用者名稱 root
和密碼 example
登入。現在您可以透過 phpMyAdmin 與資料庫進行互動。
在終端中按 ctrl+c
停止您的應用程式。
自動更新服務
使用 Compose Watch 在您編輯和儲存程式碼時自動更新正在執行的 Compose 服務。有關 Compose Watch 的更多詳細資訊,請參閱使用 Compose Watch。
在 IDE 或文字編輯器中開啟 `compose.yaml` 檔案,然後新增 Compose Watch 指令。以下是更新後的 `compose.yaml` 檔案。
services:
server:
build:
context: .
ports:
- 9000:80
depends_on:
db:
condition: service_healthy
secrets:
- db-password
environment:
- PASSWORD_FILE_PATH=/run/secrets/db-password
- DB_HOST=db
- DB_NAME=example
- DB_USER=root
develop:
watch:
- action: sync
path: ./src
target: /var/www/html
db:
image: mariadb
restart: always
user: root
secrets:
- db-password
volumes:
- db-data:/var/lib/mysql
environment:
- MARIADB_ROOT_PASSWORD_FILE=/run/secrets/db-password
- MARIADB_DATABASE=example
expose:
- 3306
healthcheck:
test:
[
"CMD",
"/usr/local/bin/healthcheck.sh",
"--su-mysql",
"--connect",
"--innodb_initialized",
]
interval: 10s
timeout: 5s
retries: 5
phpmyadmin:
image: phpmyadmin
ports:
- 8080:80
depends_on:
- db
environment:
- PMA_HOST=db
volumes:
db-data:
secrets:
db-password:
file: db/password.txt
執行以下命令,使用 Compose Watch 執行您的應用程式。
$ docker compose watch
開啟瀏覽器並驗證應用程式是否在 https://:9000/hello.php 執行。
您對本地機器上應用程式原始檔的任何更改現在將立即反映在執行中的容器中。
在 IDE 或文字編輯器中開啟 hello.php
,並將字串 Hello, world!
更新為 Hello, Docker!
。
儲存對 hello.php
的更改,然後等待幾秒鐘,直到應用程式同步。重新整理瀏覽器中的 https://:9000/hello.php 並驗證更新後的文字是否出現。
在終端中按 ctrl+c
停止 Compose Watch。在終端中執行 docker compose down
以停止應用程式。
建立開發容器
此時,當您執行容器化應用程式時,Composer 不會安裝開發依賴項。雖然這個小映象適用於生產環境,但它缺乏您在開發時可能需要的工具和依賴項,並且不包含 tests
目錄。您可以使用多階段構建在同一個 Dockerfile 中為開發和生產構建階段。有關更多詳細資訊,請參閱 多階段構建。
在 Dockerfile
中,您需要更新以下內容:
- 將
deps
階段拆分為兩個階段。一個用於生產環境(prod-deps
),另一個用於安裝開發依賴項(dev-deps
)。 - 建立一個通用的
base
階段。 - 為開發建立一個新的
development
階段。 - 更新
final
階段以從新的prod-deps
階段複製依賴項。
以下是更改前後的 Dockerfile
。
# syntax=docker/dockerfile:1
FROM composer:lts as deps
WORKDIR /app
RUN --mount=type=bind,source=composer.json,target=composer.json \
--mount=type=bind,source=composer.lock,target=composer.lock \
--mount=type=cache,target=/tmp/cache \
composer install --no-dev --no-interaction
FROM php:8.2-apache as final
RUN docker-php-ext-install pdo pdo_mysql
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY --from=deps app/vendor/ /var/www/html/vendor
COPY ./src /var/www/html
USER www-data
# syntax=docker/dockerfile:1
FROM composer:lts as prod-deps
WORKDIR /app
RUN --mount=type=bind,source=./composer.json,target=composer.json \
--mount=type=bind,source=./composer.lock,target=composer.lock \
--mount=type=cache,target=/tmp/cache \
composer install --no-dev --no-interaction
FROM composer:lts as dev-deps
WORKDIR /app
RUN --mount=type=bind,source=./composer.json,target=composer.json \
--mount=type=bind,source=./composer.lock,target=composer.lock \
--mount=type=cache,target=/tmp/cache \
composer install --no-interaction
FROM php:8.2-apache as base
RUN docker-php-ext-install pdo pdo_mysql
COPY ./src /var/www/html
FROM base as development
COPY ./tests /var/www/html/tests
RUN mv "$PHP_INI_DIR/php.ini-development" "$PHP_INI_DIR/php.ini"
COPY --from=dev-deps app/vendor/ /var/www/html/vendor
FROM base as final
RUN mv "$PHP_INI_DIR/php.ini-production" "$PHP_INI_DIR/php.ini"
COPY --from=prod-deps app/vendor/ /var/www/html/vendor
USER www-data
透過新增指定開發階段的指令來更新您的 compose.yaml
檔案。
以下是 compose.yaml
檔案的更新部分。
services:
server:
build:
context: .
target: development
# ...
您的容器化應用程式現在將安裝開發依賴項。
執行以下命令以啟動您的應用程式。
$ docker compose up --build
開啟瀏覽器,在 https://:9000/hello.php 檢視應用程式。您應該仍然看到簡單的“Hello, Docker!”應用程式。
在終端中按 ctrl+c
停止您的應用程式。
雖然應用程式看起來相同,但您現在可以使用開發依賴項了。繼續下一節,瞭解如何使用 Docker 執行測試。
摘要
在本節中,您瞭解瞭如何設定 Compose 檔案以新增本地資料庫和持久化資料。您還學習瞭如何使用 Compose Watch 在您更新程式碼時自動同步應用程式。最後,您學習瞭如何建立包含開發所需依賴項的開發容器。
相關資訊
後續步驟
在下一節中,您將學習如何使用 Docker 執行單元測試。