背景
事故发生在一个调优事件上。
- 前端:明明本地没问题,为什么上线就有问题了
- 后端:谁知道~ 肯定你代码有问题,不用狡辩了
- 前端:不可能,会不会是服务器有问题
- 后端: 你继续狡辩
前端看说不过,只能自己看看,默默用 docker 搭了和线上一样的环境把代码放进去,发现确实是环境问题,不支持这种写法,然后修复后发上线。
上面是一个小故事,实际开发场景,前端还是有很多机会可以使用 docker 容器化。
看完小故事,下面实现一个容器,基于 nginx 服务放置前端项目的静态资源
知识点
Docker - 入门到实践 ,感兴趣的同学可以看看这个,更加详细的介绍 docker 相关的知识
镜像和容器
接下来会提到以下两个概念:镜像,容器
- 镜像: 镜像是静态的,构建之后就不会改变;他是一个特殊的文件系统,准备了容器运行时所有的系统资源;可以把它看成一个类
- 容器:他是镜像运行后的实例,类似于把类实例化;容器的实质是进程,和宿主机的进程不一样,他运作于独立命名空间;容器内的进程运行于一个隔离宿主机的环境。
dockerfile
下面是制作镜像,制作镜像最常用的方式是使用 dockerfile 来制作镜像
docker build -t hello-world:v0.1 .
上面会在当前控制台的上下文中找到 dockerfile, 这个 . 其实是说当前控制台的上下文,根据里面的内容进行打包, 命名为 hello-world, tag 为 v0.1 的镜像
解释接下来会在 dockerfile 使用到的指令
- FROM: 用于指定镜像,例如 nginx, 如果不指定 tag,他就默认选择 laster;用法 FROM nginx
- COPY: 复制,用于在控制台上下文路径中复制资源到镜像里面,如果容器内不存在该路径会自动创建;用法 COPY package.json(宿主机目录或文件) /root/app(容器内目录)
FROM nginx
COPY dist/ /usr/share/nginx/html/dist/
COPY nginx.conf /etc/nginx/conf.d/default.conf
一个简单的 dockerfile 已经完成
server {
listen 80;
server_name localhost;
location /dist {
root /usr/share/nginx/html;
}
}
这是贴上去的 nginx 配置,这里不说 nginx 相关的
运行 docker 镜像
docker run -it --name=nginx -p 3000:80 hello-world:v0.1 sh
上面这句话是运行刚刚构建好的 hello-world:v0.1 镜像,命名为 nginx; 宿主机端口 3000 映射到容器 80 端口;使用命令 sh; -it 让容器的标准输入保持打开并分配一个伪终端;
然后在浏览器上输入 127.0.0.1:3000/dist/xxx.html 就可以看到了对应的静态资源类
总结
上面简单介绍了一个静态文件通过 dockerfile 打包 docker 镜像,然后运行镜像的一个 demo;通过这个例子,大致了解了 docker 的 镜像和容器,还有镜像是怎么生成的,容器是怎么运行的指令