为什么需要 Docker?

操作系统是自由的,你想用 Windows/Linux/Mac, 只要你用的习惯,能够高效率工作,无所谓什么系统。

然而问题就来了,大家的环境不一样。Unix 系系统基本无太大差别,Windows 就不一样了。

环境的差异会导致踩很多很多坑, 印象比较深刻的就是 sass 编译,在哪个还需要依赖 ruby 的年代,安装 gem 是不顺畅的,windows 格式编码格式不是 utf-8, 导致 sass 文件中有中文编译报错等等。

还有一些诸如文件监听,在 Windows 下需要 fallback,靠轮循监听变化。

在经过一系列的折腾之后,我们就尝试使用 Docker 来解决开发环境统一的问题。

构建一个通用的 Linux 镜像,里面包含了前端开发的基本环境,包括 python,nodejs 等等... 前端只要给定源码文件就行了。就这样暂时统一了开发环境,虽然最后我们统一使用 Unix 系统。

Docker 还有哪些场景

前后端不分离的项目

你作为一个前端,你是如何与 PHP 后端参与开发的?你需要搭建 PHP 环境吗?

我不搭建 PHP 开发环境,FTP 直接上传,就是这么简单粗暴,Docker 什么的,能吃吗 ∂?

如果你是这种开发模式,不是说 low,而是说效率低下。每次修改都要上传,盲人改代码。

所以你需要 Docker,配置好环境,一键启动,一键关闭,各开发人员相互独立,代码通过 git 同步,指向同一个数据库,修改代码立即见效,

单页面应用

前后端分离的情况下,单页面渲染一般使用nginx, Docker 同样配置 nginx,做静态页渲染和去除难看的#号(通过 404 重定向只 index.html, 把 404 的控制权,交还给前端)

这样你的路由http://example.com/#/home变成了http://example.com/home

甚至你可以作反向代理,消除跨域

http://example.com/api > http://api.server.com

服务端渲染

那么你更需要 Docker, 因为你需要 Node 环境,你需要负载均衡,你需要反向代理等等...

Node 后端

既然是后端,数据库你要吧?nginx 你要吧,Node 你要安装吧?

A 同事项目依赖了 postgres@9.6, 结果你项目依赖 postgres@10.1. 难道你叫他卸载了重新装一个?

如何应用 Docker

首先你得安装Docker 和 Docker Compose, 使用 Docker Compose来配置镜像.

配置最简单的 Node 环境

一个简单的项目结构如下

├── docker-compose.yml
└── index.js
// index.js
const http = require('http');const server = http.createServer((req, res) => {res.setHeader('Content-Type', 'text/html');res.setHeader('X-Foo', 'bar');res.writeHead(200, { 'Content-Type': 'text/plain' });res.end('ok');
});server.listen(3000);
# docker-compose.ymlversion: "3"
services:web:image: node:8-alpineuser: nodeworking_dir: /home/node/appenvironment:- PORT=3000volumes:- ./:/home/node/app # 将本地目录映射到容器内command: ["node", "index.js"] # 运行命令ports:- 3000:3000 # 本地端口:容器端口

运行命令启动

$ docker-compose up
Starting example_web_1 ... done
Attaching to example_web_1

现在 NodeJs 应用已经跑起来了,试着访问 http://localhost:3000

Node 的依赖包怎么办?

现在我们给项目添加依赖Koa,用 Koa 来搭建服务器.

这我们需要把node_modulespackage.json打包进镜像

而官方的 node 镜像node:8-alpine是不安装依赖的,需要我们自定义一个镜像

创建一个 Dockerfile

# Dockerfile
FROM node:8-alpine# 设置工作目录
WORKDIR /home/node/app# 把package.json复制进镜像中
COPY ./package.json /home/node/app/package.json# 在镜像中安装依赖
RUN yarn --production

修改 docker-compose.yml

# docker-compose.ymlversion: "3"
services:web:build:context: .dockerfile: ./Dockerfileuser: nodeworking_dir: /home/node/appenvironment:- PORT=3000volumes:- ./index.js:/home/node/app/index.js # 将本地目录映射到容器内command: ["node", "index.js"] # 运行命令ports:- 3000:3000 # 本地端口:容器端口

此时项目目录

├── Dockerfile
├── docker-compose.yml
├── index.js
├── package.json
└── yarn.lock

运行命令

$ docker-compose up
Building web
Step 1/5 : FROM node:8-alpine---> 86b71ddd55fa
Step 2/5 : WORKDIR /home/node/app---> Using cache---> 2347fe6d8f3c
Step 3/5 : COPY ./package.json /home/node/app/package.json---> Using cache---> 1e0026f493f5
Step 4/5 : RUN yarn --production---> Using cache---> 549284f78c1c
Step 5/5 : RUN ls ./node_modules---> Using cache---> 350adf90cfa8
Successfully built 350adf90cfa8
Successfully tagged example_web:latest
Recreating example_web_1 ... done
Attaching to example_web_1

服务已运行起来了,访问 3000 试试看吧

如何用 Nginx 反向代理,消除跨域问题

首先得有一个 nginx.conf 配置

# nginx.conf
user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;tcp_nopush on;gzip on;# 定义上游服务器upstream api {ip_hash;# 这里服务器使用 koaserver# 其实原理是Docker改写了host, koaserver指向nodejs那个容器的IPserver koaserver:3000 weight=1;keepalive 300;}server {listen 80;server_name localhost;charset utf-8;root   /usr/share/nginx/html;# 代理以 api 为前缀的请求location ~^/api {proxy_pass http://api;proxy_set_header X-Forwarded-Proto $scheme;proxy_set_header Host $http_host;proxy_set_header X-Real-IP $remote_addr;}error_page 500 502 503 504 /50x.html;location = /50x.html {root /usr/share/nginx/html;}}}
version: "3"
services:nginx_proxy:image: nginx:1.13.8-alpinerestart: alwaysworking_dir: /home/staticvolumes:- ./index.html:/usr/share/nginx/html/index.html- ./nginx.conf:/etc/nginx/nginx.conf # 映射 ginx 配置文件ports:- 3000:80 # 绑定容器的80端口到本的1080端口links:- web:koaserver # 给它取个别名,叫做 koaserverweb:build:context: .dockerfile: ./Dockerfileuser: nodeworking_dir: /home/node/appenvironment:- PORT=3000volumes:- ./index.js:/home/node/app/index.js # 将本地目录映射到容器内command: ["node", "index.js"] # 运行命令
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><meta http-equiv="X-UA-Compatible" content="ie=edge"><title>Document</title>
</head>
<body>hello html
</body>
</html>

此时项目目录

├── Dockerfile
├── docker-compose.yml
├── index.html
├── index.js
├── nginx.conf
├── package.json
└── yarn.lock

运行命令

$ docker-compose up
Creating network "example_default" with the default driver
Pulling nginx_proxy (nginx:1.13.8-alpine)...
1.13.8-alpine: Pulling from library/nginx
550fe1bea624: Already exists
d421ba34525b: Already exists
fdcbcb327323: Already exists
bfbcec2fc4d5: Already exists
Digest: sha256:c8ff0187cc75e1f5002c7ca9841cb191d33c4080f38140b9d6f07902ababbe66
Status: Downloaded newer image for nginx:1.13.8-alpine
Creating example_web_1 ... done
Creating example_nginx_proxy_1 ... done
Attaching to example_web_1, example_nginx_proxy_1

访问 localhost:3000, 返回 hello html
访问 localhost:3000/api, 返回 hello koa

解决了跨域,但同时也存在问题,代理之后,应用程序无法获取 IP,需要从 header 的X-Real-IP
字段获取

最佳部署姿势是怎么样的?

其他还有很多案例需要使用 Docker,特别是开发后端的应用。后端应用依赖 数据库(MySQL, Postgres, Redis...)、服务器(Nginx/Apache),开发语言(如 PHP)。

如果我是一名开发者,接手别人的项目,项目需要安装 PHP, 需要安装 MySQL, Apache, redis, mongo... 最好能提供一个docker-compose.yml,否则我不保证我打不死你

回到 Node 部署,最佳的姿势:

把编译过后的代码(例如 Typescript>JS)+依赖+配置打包进镜像

然后 push 镜像,最后在服务端部署。其余的配置,尽量都通过docker-compose.yml的环境变量去设置

做到只需要一个配置文件,就能把完整的项目搭建起来

总结

Docker 到底解决了我们哪些问题?

  • 容器化作隔离.。无论你怎么作,都是和宿主环境隔离的
  • 统一环境。不会再出现 "为什么我的电脑上就可以,在你的电脑上就不行" 的玄学 BUG
  • 易部署。一键安装是种怎样的体验?
  • 集群分布式解决方案。前端页面仔需要知道这个?

使用 Docker 打造超溜的前端环境相关推荐

  1. 用Docker打造多版本PHP运行环境

    2019独角兽企业重金招聘Python工程师标准>>> 背景 随着Docker的不断成熟,越来越多的站长以及运维人员选择Docker构建程序运行环境,另外由于国内的云服务厂商通常在新 ...

  2. 35 | 前端安全:如何打造一个可信的前端环境?

    前端的安全性一直是我们在考虑安全问题时,没有办法绕过的关键问题.今天,我就来和你聊一聊如何保护前端的安全性. 我们先来看一个攻击事件.2017 年,12306 网站被曝出有"买下铺" ...

  3. 基于 Docker 打造前端持续集成开发环境

    知乎: https://zhuanlan.zhihu.com/p/37961402 本文将以一个标准的 Vue 项目为例,完全抛弃传统的前端项目开发部署方式,基于 Docker 容器技术打造一个精简的 ...

  4. jeecgboot 前端环境搭建_94.精读Serverless 给前端带来了什么

    1. 引言 Serverless 是一种 "无服务器架构",让用户无需关心程序运行环境.资源及数量,只要将精力 Focus 到业务逻辑上的技术. 现在公司已经实现 DevOps 化 ...

  5. Docker 使用超详细 (精通级)

    博主目前在蚂蚁集团-体验技术部,AntV/S2 是博主所在团队的开源项目--多维交叉分析表格,欢迎使用,感谢到 S2 github 仓库点赞 star,有任何关于前端面试.就业.技术问题都可给在文章后 ...

  6. nginx nodejs环境配置_基于docker的nodejs、php开发环境,包含多种组合安装

    dnnmmp 基于docker的nodejs.php开发环境 (docker,nodejs,php,nginx,mongo,mysql,redis) Dnnmmp包含以下组合 dnm(Docker + ...

  7. Docker——使用docker工具管理软件/组件的运行,镜像、容器、数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境

    Docker--使用docker工具管理软件/组件的运行,镜像.容器.数据卷的基本概念,常用指令,使用docker搭建Java微服务运行环境 一.docker的安装和卸载 1.卸载 2.安装 3. 导 ...

  8. 打造超完美主页?20个主页设计技能你不容错过

    维基百科将主页定义为网站的初始页或主要网页.我想,"初始"和"主要"这两个词已经传达了足够的分量.然而现实情况却往往差强人意,设计师想破脑袋也难以理解为何什么用 ...

  9. Docker02 狂神Docker视频学习笔记 :【狂神说Java 哔哩哔哩】Docker最新超详细版教程通俗易懂

    目录 0. 视频源 0. 学习网址 基础篇 1. Docker概述 1.1 Docker为什么出现? 1.2 Docker历史 1.3 Docker能干什么 2. Docker安装 2.1 Docke ...

最新文章

  1. 推荐一款最好的服务器备份软件
  2. 分享 | 来看看阿里、华为、字节的PM是怎么工作的......
  3. java 控制语句、数组、方法
  4. PID算法搞不懂?看这篇文章就够了。
  5. 动图:程序员才懂的这些!
  6. mysql order by 固定_MySQL 强制操作以及order by 使用
  7. JavaScript:get和post的区别
  8. ES6深入浅出-1 新版变量声明:let 和 const-1.视频 概述
  9. java tiles类似_java – 更好地替代Apache Tiles
  10. dubbo接口调试工具
  11. 【原创】2021-2000上市公司重污染企业数据、上市公司重污染行业数据(常用变量均包括,可直接用)
  12. 【bzoj2563】阿狸和桃子的游戏
  13. OpenWrt-路由器上的linux
  14. 【opencv 450 Image Processing】Periodic Noise Removing Filter周期性去噪滤波器
  15. 【MySQL】DDL(Data Definition Language)数据定义语言之操作数据库
  16. H264/AVC 视频编解码一些基本知识
  17. 如何利用 xUnit 框架对测试用例进行维护?
  18. 乱谈诸葛亮的团队建设
  19. Office安装英语语言包
  20. 打脸!2018年深度学习发展速度被严重高估

热门文章

  1. 车道线检测的学习笔记
  2. cuda10.2安装包 和 cudnn安装包下载
  3. 深度学习之浅谈全连接层
  4. leetcode971. Flip Binary Tree To Match Preorder Traversal
  5. leetcode934.ShortestBridge
  6. Spring Boot 9-FreeMarker模板引擎
  7. ubuntu遇到的 the system is runing low-graphics mode 问题
  8. Phthon学习---错误处理、调试和测试
  9. Windows YII2安装
  10. 在CNN网络中1*1卷积的作用