利用Docker来统一前端的开发环境

656 阅读4分钟

思路:

通过 Dockerfile 构建出镜像,然后通过镜像来创建容器,程序就跑在容器中

Dockerfile: 类似于“package.json”
 |
 V
Image: 类似于“Win7纯净版.rar”
 |
 V
Container: 一个完整操作系统

方式一:利用VScode插件

1.1 安装docker

网上都有,可自查

1.2 拉取所需环境的镜像

// 拉取node镜像,版本是需要的16.13.0
(1) docker pull node:16.13.0

// 查询镜像列表,看node镜像是否拉取成功
(2) docker images 
node   16.13.0   bbdd5360e7c6   8 months ago    850MB

// 根据镜像创建并运行容器
(3) docker run -it --name my_container bbdd5360e7c6 /bin/bash

// 查看node和git的版本
node -v
git --version 
exit

// 查看容器列表
(4)docker container ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS                          PORTS     NAMES
306ca930a1f2   bbdd5360e7c6   "docker-entrypoint.s…"   2 minutes ago   Exited (0) About a minute ago             my_container

// 启动容器
(5)  docker container start 306ca930a1f2

// 查看是否启动成功(可省)
(6)  docker container ps -a             
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS     NAMES
306ca930a1f2   bbdd5360e7c6   "docker-entrypoint.s…"   3 minutes ago   Up 9 seconds             my_container

// 执行容器的交互伪终端,进入到/bin/bash目录里
(7) docker exec -it 306ca930a1f2 /bin/bash

// 在为终端中ls,然后切到root目录下,克隆一下项目代码,(如果是自己想要重新写一个项目的话,就在这个目录下直接构建项目)
(8) cd root
(9) git clone http:.....

1.3 在VScode里安装 Remote-Containers插件

安装成功后,左下角会多了一个图标,点击:

Remote-Containers插件安装成功

然后点击Attach to Running Container...

AttachtoRunningContainer..

接下来会出现正在运行的容器:

选择正在运行的容器

如果没有运行的容器,那就自己重新启动。

docker container start 容器名称或者容器ID

选择运行的容器之后,选择想要打开的项目,终端切到”bash“。

切到项目所在的目录,执行”npm install”或者“yarn install”,然后“npm start” 或者 “yarn start”即可。

方式二:使用Dockefile方式构建镜像,进而创建容器

前提也是安装好Docker。

2.1 创一个文件夹demo

里面放置刚克隆下来的web代码(或者新创建的web项目),并在web项目文件夹下,创建一个Dockefile文件,而且必须是这个文件名,不然创建镜像的时候,docker找不到Dockefile文件,就无法创建镜像了。

所以现在的文件目录是:

- demo
    |
    ---- web  // 前端代码
          |
          ---- Dockerfile

2.2 编写Dockerfile

# First step: Build with Node.js 
# [FROM node为第一阶段,主要是实现前端包的安装及项目打包 ]
FROM node:16.13.0 AS Builder
# Docker container 工作目录
WORKDIR /app

COPY package.json yarn.lock /app/

# 将此指令提前,通常都能利用前一次build 的结果,
# 因此能极大节省重新 build image 所需要的时间。
RUN yarn install

# 将当前项目文件夹内的所有文件及子文件全部copy 到 /app 文件夹中
COPY . /app
RUN yarn build 

# Secend step: Deliver the dist folder with Nginx 
# [FROM nginx为第二阶段,--from=Builder 表示把第一阶段构建完成的dist目录及我们之前添加的nginx.conf拷贝到nginx对应的目录中]
FROM nginx:stable-alpine
COPY --from=Builder /app/build /usr/share/nginx/html
# COPY --from=Builder /app/nginx.conf /etc/nginx/conf.d/default.conf

# 启动nginx容器
CMD ["nginx", "-g", "daemon off;"]
# 容器内的进程将发布端口 80
EXPOSE 80
  • 在web项目文件夹下创建一个build文件夹,因为yarn build会产生一个build文件夹(当不知道穿件什么文件夹的时候,可以自行build一下,看看会出现什么文件夹);
  • 启动nginx时,主进程其实是sh,而容器是因为sh这个主进程产生的,当该条命令执行完毕之后,sh作为主进程会退出,容器自然也会退出,因此导致nginx启动不了。所以需要使用CMD ["nginx", "-g", "daemon off;"] 启动;

2.3 创建镜像

打开终端,切到demo/web文件夹下,开始创建镜像

docker build --no-cache  -t test/message:v1.1.0 .    
  • --no-cache 怕有缓存
  • -t 用来指定image镜像的名称,后面还可以加冒号指定标签,如果不指定默认就是latest
  • . 表示Dockerfile文件所在路径,.就表示当前路径

2.4 使用新的镜像运行容器

docker run -d --name nginx-web -p 8080:80 docker.io/test/message:v1.1.0

如果Dockerfile文件里没有有加CMD,就直接运行容器

docker container run -p 8080:80 -it dosec-web:v1 /bin/bash
  • -p: 参数是将容器的80端口映射为本机的8080端口
  • -it: 参数是将容器的shell容器映射为当前的shell,在本机容器中执行的命令都会发送到容器当中执行
  • dosec-web:v1: image的名称
  • /bin/bash: 容器启动后执行的第一个命令,这里是启动了bash容器以便执行脚本
  • --rm: 在容器终止运行后自动删除容器文件

然后再浏览器中访问 http://localhost:8080即可。(如果是公司项目的话,可能调接口的时候,会调用项目配置的生产环境中的ip和port)

PS: 初学Docker,如果有错的地方,勿喷,留言即可,一起学习 方式2 仅供参考