之前在《Docker 初學者需要了解的幾個知識點》幾篇文章里,我們梳理了 Docker 的核心概念(如鏡像、容器、網絡等),但在實際搭建 ThinkPHP 容器環境時,又遇到了一些更具體的術語和配置場景。這些內容和實操結合緊密,能幫我們更深入理解 Docker 在開發中的應用,所以在這里補充說明,方便后續遇到類似問題時查閱。
1、數據持久化:卷(Volume)與綁定掛載(Bind Mount)
- 問題:容器刪除后,內部數據會丟失(如代碼、數據庫文件),需要將數據 “持久化” 到主機。
- 兩種方式:
- 綁定掛載(Bind Mount):直接將主機的目錄 / 文件映射到容器內(如你之前用的?
-v $(pwd):/app
,把主機當前目錄映射到容器的?/app
)。- 優點:簡單直接,適合開發時實時同步代碼(修改主機代碼,容器內立即生效)。
- 注意:權限可能沖突(容器內用戶與主機用戶 ID 不同時,可能導致文件無法讀寫)。
- 卷(Volume):由 Docker 管理的主機目錄(默認在?
var/lib/docker/volumes/
),通過?docker volume create
?創建,再用?-v 卷名:/容器內路徑
?掛載。- 優點:Docker 自動管理權限,適合存儲數據庫數據(如 MySQL 的數據文件),避免手動處理主機目錄權限。
- 綁定掛載(Bind Mount):直接將主機的目錄 / 文件映射到容器內(如你之前用的?
- 總結:開發代碼用 “綁定掛載”(方便實時修改),數據庫等重要數據用 “卷”(安全持久)。
2、?網絡(Network)
- 定義:Docker 網絡用于容器之間、容器與主機之間的通信。
- 核心場景:
- 當你的環境需要多個容器(如 ThinkPHP 應用容器 + MySQL 數據庫容器),它們需要通過網絡互相訪問(如 PHP 容器連接 MySQL 容器)。
- 容器內的服務(如 PHP 內置服務器)需要暴露端口給主機訪問(如用?
-p 8000:80
,將容器的 80 端口映射到主機的 8000 端口,主機通過?localhost:8000
?訪問)。
- 常用網絡類型:
- 橋接網絡(Bridge):默認網絡模式,同一橋接網絡內的容器可以通過容器名互相訪問(如?
mysql
?容器名可直接作為主機名被 PHP 容器訪問)。 - 主機網絡(Host):容器直接使用主機的網絡(端口無需映射,但隔離性差)。
- 橋接網絡(Bridge):默認網絡模式,同一橋接網絡內的容器可以通過容器名互相訪問(如?
3、Docker Compose
- 定義:一個用于定義和運行多容器 Docker 應用的工具(通過?
docker-compose.yml
?配置文件管理多個服務)。 - 必要性:搭建 ThinkPHP 完整環境可能需要多個容器(如?
php
、mysql
、nginx
),單獨用?docker run
?啟動每個容器會很繁瑣,且需要手動管理網絡和掛載。 - 作用:
- 用一個配置文件(
docker-compose.yml
)定義所有服務(容器)的參數(鏡像、端口、掛載、網絡等)。 - 通過?
docker-compose up
?一鍵啟動所有服務,docker-compose down
?一鍵停止并清理,簡化多容器管理。
- 用一個配置文件(
4、Dockerfile
- 定義:一個文本文件,包含了構建自定義鏡像的一系列指令(如基于哪個基礎鏡像、安裝依賴、配置環境等)。
- 用途:官方?
php
?鏡像可能缺少 ThinkPHP 所需的擴展(如?gd
、pdo_mysql
),這時可以通過 Dockerfile 構建一個包含這些擴展的自定義?php
?鏡像。 - 示例(構建 ThinkPHP 所需的 PHP 鏡像):
# 基于官方 PHP 鏡像(帶內置服務器的版本) FROM php:8.1-cli # 安裝 pdo_mysql 擴展(ThinkPHP 連接 MySQL 必需) RUN docker-php-ext-install pdo_mysql # 設置工作目錄 WORKDIR /app
然后用?docker build -t my-php:8.1 .
?構建鏡像。
5、容器生命周期管理
- 掌握容器的基本操作,是日常開發的基礎:
docker run
:創建并啟動容器(如?docker run -p 8000:80 my-php:8.1 php think run
?啟動 ThinkPHP 內置服務器)。docker ps
:查看運行中的容器(-a
?查看所有容器,包括已停止的)。docker stop <容器ID/名稱>
:停止容器。docker rm <容器ID/名稱>
:刪除容器(-f
?強制刪除運行中的容器)。docker logs <容器ID/名稱>
:查看容器日志(調試時常用,如查看 PHP 報錯)。docker exec -it <容器ID/名稱> bash
:進入容器內部(如進入 PHP 容器調試代碼、安裝臨時工具)。
6、環境變量(Environment Variables)
- 容器啟動時可以通過?
-e
?參數設置環境變量(如數據庫地址、賬號密碼),避免硬編碼到配置文件中。 - 舉例:啟動 MySQL 容器時指定 root 密碼:
bash
docker run -e MYSQL_ROOT_PASSWORD=123456 -e MYSQL_DATABASE=tp_db mysql:8.0
- ThinkPHP 中可以通過環境變量讀取配置(如?
getenv('DB_HOST')
),方便在開發 / 生產環境切換配置。
總結
這些概念是 Docker 應用的基礎,結合 ThinkPHP 開發場景:
- 用?Dockerfile?構建帶必要擴展的 PHP 鏡像;
- 用?綁定掛載?同步主機代碼到容器,實時開發;
- 用?卷?持久化 MySQL 數據;
- 用?Docker Compose?管理 PHP + MySQL + Nginx 多容器;
- 用?網絡?實現容器間通信(如 PHP 連接 MySQL);
- 用?生命周期命令?調試和管理容器。
理解這些后,你可以更靈活地搭建、擴展和維護開發環境。