Docker 初学者需要了解的几个知识点 (五):建容器需要进一步了解的概念

之前在《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 的数据文件),避免手动处理主机目录权限。
  • 总结:开发代码用 "绑定挂载"(方便实时修改),数据库等重要数据用 "卷"(安全持久)。

2、 网络(Network)

  • 定义:Docker 网络用于容器之间、容器与主机之间的通信。
  • 核心场景
    • 当你的环境需要多个容器(如 ThinkPHP 应用容器 + MySQL 数据库容器),它们需要通过网络互相访问(如 PHP 容器连接 MySQL 容器)。
    • 容器内的服务(如 PHP 内置服务器)需要暴露端口给主机访问(如用 -p 8000:80,将容器的 80 端口映射到主机的 8000 端口,主机通过 localhost:8000 访问)。
  • 常用网络类型
    • 桥接网络(Bridge) :默认网络模式,同一桥接网络内的容器可以通过容器名互相访问(如 mysql 容器名可直接作为主机名被 PHP 容器访问)。
    • 主机网络(Host):容器直接使用主机的网络(端口无需映射,但隔离性差)。

3、Docker Compose

  • 定义 :一个用于定义和运行多容器 Docker 应用的工具(通过 docker-compose.yml 配置文件管理多个服务)。
  • 必要性 :搭建 ThinkPHP 完整环境可能需要多个容器(如 phpmysqlnginx),单独用 docker run 启动每个容器会很繁琐,且需要手动管理网络和挂载。
  • 作用
    • 用一个配置文件(docker-compose.yml)定义所有服务(容器)的参数(镜像、端口、挂载、网络等)。
    • 通过 docker-compose up 一键启动所有服务,docker-compose down 一键停止并清理,简化多容器管理。

4、Dockerfile

  • 定义:一个文本文件,包含了构建自定义镜像的一系列指令(如基于哪个基础镜像、安装依赖、配置环境等)。

  • 用途 :官方 php 镜像可能缺少 ThinkPHP 所需的扩展(如 gdpdo_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);
  • 生命周期命令 调试和管理容器。

理解这些后,你可以更灵活地搭建、扩展和维护开发环境。

相关推荐
自由鬼42 分钟前
如何处理Y2K38问题
java·运维·服务器·程序人生·安全·操作系统
焚膏油以继晷,恒兀兀以穷年42 分钟前
Docker设置容器时间
运维·docker·容器
Doris_LMS3 小时前
在Linux下安装nginx(保姆级别)
linux·运维·nginx·centos
北极糊的狐3 小时前
“我们无法设置移动热点”、网卡异常、电脑网络适配器没有2.4GHz 802.11n信道宽度和5.2GHz 802.11n信道宽度
运维·服务器
斯普信专业组4 小时前
Ceph、K8s、CSI、PVC、PV 深入详解
ceph·容器·kubernetes
obboda5 小时前
Linux基础复习:字符输入与输出
linux·运维·服务器
Aspartame~7 小时前
企业级WEB应用服务器TOMCAT
java·运维·服务器·tomcat
FED_AF8 小时前
Linux救援模式之应用篇
linux·运维
拾心218 小时前
【运维基础】Linux 进程调度管理
linux·运维·服务器
Blessed_Li8 小时前
【dify+milvus避坑指南】将向量库milvus集成给dify作为知识库
docker·ai·llm·milvus·dify