# 前端为什么要用 docker ?

# 背景

前后端分离的趋势已成为主流范式,前端工程复杂度叠加增长,新、老项目部署依赖的环境和 Node.js 版本会存在差异,生产环境下构建混淆后的脚本、静态资源文件依赖环境部署服务进行访问,前端工程未能形成"单体工件"部署,Docker 的出现大大简化了部署流程,为 CI/CD、DevOps 带来了无限可能。

# 为什么需要 Docker

官方介绍(中文版):https://www.docker.com/why-docker Docker 是世界领先的软件容器平台。 开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题。 运维人员利用 Docker 可以在隔离容器中并行运行和管理应用,获得更好的计算密度。 企业利用 Docker 可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为 Linux 和 Windows Server 应用发布新功能。

# 环境不一致

开发环境、测试环境(sit1、sit2、sit3),灰度环境、生产环境等等... 多环境下,有些新、老工程项目依赖的 Node.js 版本又不相同,虽然手工去配置和搭建环境也能达到目的,但是人工难免会出错,容易出现跟预期不一致的情况。 前端项目里的描述文件 package.json 依赖 npm / yarn 安装依赖模块,npm / yarn 版本不一致也会导致跟预期不一致的情况。

# 应用隔离

Docker 的特点文件系统隔离、网络环境隔离、进程隔离等等,利用这些特点能很好的解决不同版本不同依赖的项目实现隔离。比如一个老旧的工程依赖 node:6 的版本,有些新开发的工程使用的技术比较新依赖 node:12,当在同一台机器上部署两个应用各种的依赖软件都安装在同一个服务器上,可能就会造成各种冲突/无法兼容,这可能调试就非常麻烦了。

# Docker 是如何解决的

# 构建镜像解决环境不一致

TIP

镜像官方介绍 Docker 容器映像(镜像)是一个轻量级的,独立的,可执行的软件软件包,其中包含运行应用程序所需的一切:代码,运行时,系统工具,系统库和设置。 容器映像(镜像)在运行时成为容器,对于 Docker 容器,映像在容器 Docker Engine 上运行时成为容器。不论基础架构如何,容器化软件都可用于基于 Linux 和 Windows 的应用程序,始终运行相同。容器将软件与其环境隔离开来,并确保尽管开发和登台之间存在差异,但软件仍可以均匀运行。

在前端工程我们可以将我们的想要的环境构建(打包)成一个镜像,然后我们可以推送(发布)到网上去。想要用这个环境的时候,在网上拉取一份就好了,拉取回来 Docker 运行时写时复制生成一个容器,我们的工程运行在各种环境都配好了的容器里。

cgroup 和 namespace 这两项技术来实现应用隔离

在 Linux 内核中,提供了 cgroups 功能,来达成资源的区隔化。它同时也提供了名称空间(namespace)区隔化的功能,使应用程序看到的操作系统环境被区隔成独立区间,包括进程树,网络,用户 id,以及挂载的文件系统。 Docker 提供了友好的方式实现隔离,在构建镜像时,根据我们配置的依赖环境(通过 Dockerfile 配置)构建,运行镜像时就能实现应用隔离(网络隔离,Docker 也提供了其他网络模式)。

最后更新: 3/25/2021, 3:45:57 PM