之前在《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);
- 用 生命周期命令 调试和管理容器。
理解这些后,你可以更灵活地搭建、扩展和维护开发环境。