由于本地项目比较多,且对于环境要求各不相同,导致电脑上要装多个环境才能满足项目的运行。以我常用的 PHP 开发为例,需要 PHP 7.1 、PHP 7.3、PHP 8.1 、PHP 8.3,在这些项目中 compose 如何寻找到正确的 PHP 版本来安装依赖也是一个比较难以解决的问题。
为了不再受此困扰,我决定用容器来解决我面临的问题。开发环境容器化还有一个考虑就是容器本身对 CI/CD
比较友好,我们在测试和线上环境已经开始转向容器化部署,如果本地也进行容器化,编写好的 Dockfile
可以复用到后面的部署流程。
我的方案是为每个项目编写一个 docker-compose.yml
当我开始进入某个项目的开发工作时。只要打开对应的项目通过 docker-compose.yml
启动容器就可以启动对应项目的开发环境进行开发了。
容器化给我带来了哪些好处:
- 纯净的物理机:我不需要在物理机上安装各种各样的环境
- 低负载开发: 只有运行开发的相关环境,其他不相关的服务都不会在后台运行
- 部署和开发一致: 由于都是
Docker
部署,不会因为环境问题导致本地开发没问题线上出错的情况 - 专注于开发本身 :免去了多种环境下互相兼容下的管理工作,专注于开发本身。
在容器话的过程中,我也遇到了一些问题,在这里记录一下,供诸君参考。
一些问题
首先遇到的问题就是依赖缓存的问题,比如一个 GO 的项目,因为 GO 的环境是在容器里,这样每次启动项目都要重新下载一次依赖,浪费时间也没有必要,于是我就将 mod 依赖下载目录通过挂载卷映射到我本机上。
如此依赖就解决了每次启动容器,都要重新安装依赖的问题,这样做还有一个额外的好处就是我其他的 GO 项目也也可以把 mod 依赖下载路径映射到相同的位置,这样就能实现下载依赖的复用,也能避免过多的磁盘占用。
如果你是前端项目使用 pnpm
管理工具,也可以参考上述思路解决 npm
包的依赖复用问题。
遇到的另一个问题就是 Windows 环境下,文件读写性能不足的问题。Windows 用户在开发环境容器化是需要注意一下,如果你的项目运行需要大量的文件读取,会导致项目启动异常慢,这个是 Windows 下面使用容器的硬伤,目前无解。Linux
和 MacOS
并不会出现此类问题。
工具推荐
如果你用 Visual Studio Code
进行开发,可以安装一个 Docker
的扩展,通过设置 Docker: Compose Down
和 Docker: Compose Up
两个快捷键实现快速的启动和停止项目。
总结
经过一段时间的使用,容器化对我的帮助很大,我可以忽略项目在本机的环境的管理工作,无论开发哪个项目只需要在对应项目启动 docker-compose.yml
就可以投入对应项目的开发工作。
它给我带来了更纯净的本机环境,更低的系统资源占用。且不用我去面对繁琐的版本管理(编程语言)和依赖管理。让我更专注与开发工作本身。
以上是我对于开发环境容器话的一些尝试,希望可以对你产生一些启发,如果你有不同的见解欢迎一起交流。