由于本地项目比较多,且对于环境要求各不相同,导致电脑上要装多个环境才能满足项目的运行。以我常用的 PHP 开发为例,需要 PHP 7.1 、PHP 7.3、PHP 8.1 、PHP 8.3,在这些项目中 compose 如何寻找到正确的 PHP 版本来安装依赖也是一个比较难以解决的问题。

为了不再受此困扰,我决定用容器来解决我面临的问题。开发环境容器化还有一个考虑就是容器本身对 CI/CD 比较友好,我们在测试和线上环境已经开始转向容器化部署,如果本地也进行容器化,编写好的 Dockfile 可以复用到后面的部署流程。

我的方案是为每个项目编写一个 docker-compose.yml 当我开始进入某个项目的开发工作时。只要打开对应的项目通过 docker-compose.yml 启动容器就可以启动对应项目的开发环境进行开发了。

容器化给我带来了哪些好处:

  1. 纯净的物理机:我不需要在物理机上安装各种各样的环境
  2. 低负载开发: 只有运行开发的相关环境,其他不相关的服务都不会在后台运行
  3. 部署和开发一致: 由于都是 Docker 部署,不会因为环境问题导致本地开发没问题线上出错的情况
  4. 专注于开发本身 :免去了多种环境下互相兼容下的管理工作,专注于开发本身。

在容器话的过程中,我也遇到了一些问题,在这里记录一下,供诸君参考。

一些问题

首先遇到的问题就是依赖缓存的问题,比如一个 GO 的项目,因为 GO 的环境是在容器里,这样每次启动项目都要重新下载一次依赖,浪费时间也没有必要,于是我就将 mod 依赖下载目录通过挂载卷映射到我本机上。

如此依赖就解决了每次启动容器,都要重新安装依赖的问题,这样做还有一个额外的好处就是我其他的 GO 项目也也可以把 mod 依赖下载路径映射到相同的位置,这样就能实现下载依赖的复用,也能避免过多的磁盘占用。

如果你是前端项目使用 pnpm 管理工具,也可以参考上述思路解决 npm 包的依赖复用问题。

遇到的另一个问题就是 Windows 环境下,文件读写性能不足的问题。Windows 用户在开发环境容器化是需要注意一下,如果你的项目运行需要大量的文件读取,会导致项目启动异常慢,这个是 Windows 下面使用容器的硬伤,目前无解。LinuxMacOS 并不会出现此类问题。

工具推荐

如果你用 Visual Studio Code 进行开发,可以安装一个 Docker 的扩展,通过设置 Docker: Compose DownDocker: Compose Up 两个快捷键实现快速的启动和停止项目。

image.png

总结

经过一段时间的使用,容器化对我的帮助很大,我可以忽略项目在本机的环境的管理工作,无论开发哪个项目只需要在对应项目启动 docker-compose.yml 就可以投入对应项目的开发工作。

它给我带来了更纯净的本机环境,更低的系统资源占用。且不用我去面对繁琐的版本管理(编程语言)和依赖管理。让我更专注与开发工作本身。

以上是我对于开发环境容器话的一些尝试,希望可以对你产生一些启发,如果你有不同的见解欢迎一起交流。