参考
http://coinxu.github.io/blog/docker/usage/1-docker-in-frontend.html
https://juejin.cn/post/6932808129189150734
从0到1搭建舒适的docker前端开发环境

Dockerfile

  1. #设置构建的基础镜像
  2. FROM node:14.18.1
  3. #创建一个名为vue-docker的文件夹
  4. RUN mkdir -p /vue-docker
  5. #进入到这个目录中(当我们打开镜像终端的时候会自动进入这个目录中去)
  6. WORKDIR /vue-docker
  7. #拷贝当前目录下所有东西到vue-docker目录中
  8. COPY . .
  9. #设置npm下载依赖来源为淘宝源
  10. RUN npm config set registry https://registry.npm.taobao.org
  11. #安装项目依赖
  12. RUN npm i
  13. #在启动镜像时执行启动项目的命令
  14. CMD npm run serve
  15. #暴露端口用于外部访问
  16. EXPOSE 8080

构建镜像

docker build -t vue-docker .

启动

-d: 后台运行
-p: 映射容器内的 8080 端口到主机的 8080 端口
-i: 交互式操作
-t: 终端
-v: 文件映射,将主机本地的文件映射到容器中,这样我们本地修改文件内容,可以动态看到页面的变化了
vue-docker: 这是指用 vue-docker 镜像为基础来启动容器

windows:

-v 老命令
docker run -d -p 8080:8080 -v D:\docker\vue-docker\src:/vue-docker/src vue-docker
—mount 新命令
docker run -d -P —name vue-docker1 —mount type=bind,source=D:\docker\vue-docker\src,target=/vue-docker/src vue-docker
image.png
image.png

mac :

docker run -d -p 8080:8080 -v ~/FE/vue-docker/src:/vue-docker/src vue-docker
image.png

本地浏览

启动时已经把docker 8080端口映射到本地的8080端口,故直接在浏览器访问
image.png

本地开发

直接修改本地映射的文件,会同步到docker
测试发现,mac端修改后会触发docker的热更新,但是window端不会触发
解决(待验证):

Docker for Windows relies on SMB/CIFS support in Linux, and since propagating filesystem notifications is not supported our options are limited. Docker for Windows 依赖于Linux对SMB/CIFS的支持,但是由于文件系统的通知冒泡不支持,我们的能力受限。 一般来说,到这个地方就算走到 bad ending ,大家可以洗洗睡了,然而,却有脑洞颇大的同学给出了一个python包,提出了一个hack方案。感谢作者。 python包:docker-windows-volume-watcher,这个东西的原理就是它运行在Windows里,观测到文件的变化后,先读取文件的权限,再重写权限值为读取的这个值(等于没变),容器里的Linux就能检测到这个重写权限的变化,认为是文件变了,实现了通知容器这个文件变了的效果。

通过vscode-remote链接到docker容器,直接修改容器内文件
image.png

使用docker-compose

搭配nginx 反向代理vue-docker,多个容器配合才能对外服务。
比如常见的LAMP服务,包含OS(linux)+backend(php)+database(mysql)+Apache

docker-compose.yml

  1. version: "3" # 指定版本(不同的版本存在语法差异,这边使用最新的版本)
  2. services: # 服务名称
  3. nginx: # 用户自定义的服务名称
  4. image: nginx # 使用的nginx最新的镜像
  5. volumes:
  6. - ~/FE/vue-docker/default.conf:/etc/nginx/conf.d/default.conf # 拷贝default.conf目录到容器里的
  7. ports:
  8. - "80:80" # 暴露端口用于外部访问
  9. vue-docker: # 用户自定义的服务名称
  10. image: vue-docker #直接使用上面已构建好的镜像
  11. #也可以直接根据dockerfile构建镜像
  12. #build: # 构建相关的配置 也可以直接使用image:xxx去构建
  13. # context: .
  14. working_dir: /vue-docker # 进入工作的目录中
  15. command: npm run serve # 在启动镜像时执行启动项目的命令
  16. volumes: # 指定映射的路径(可指定多个)
  17. #- ./x'x'x:/xxx
  18. - ~/FE/vue-docker/src:/vue-docker/src
  19. ports: # 暴露端口用于外部访问(可指定多个)
  20. - 8080:8080
  21. # - 8080:8081

default.conf

项目根目录创建nginx配置default.conf

  1. server {
  2. listen 80;
  3. server_name localhost;
  4. location / {
  5. proxy_pass http://vue-docker:8080; # 这里的vue-docker就是docker-compose中自定义的services名
  6. }
  7. error_page 500 502 503 504 /50x.html;
  8. location = /50x.html {
  9. root /usr/share/nginx/html;
  10. }
  11. }

启动

docker-compose -p front-dev up —force-recreate
因为中间几次配置有问题,生成过容器,所以 —force-recreate, 不加-d 可以看到启动过程
image.png
成功
image.png

访问失败

访问nginx代理80端口
image.png
同时还发现另外一个问题,就是热更新也失效了
原因是vue-cli3 生成的项目,新版的webpack-dev-server增加了安全验证,默认检查hostname,如果hostname不是配置内的,将中断访问。

vue.config.js

解决办法就是,在根目录下创建文件vue.config.js,然后填入如下内容

  1. module.exports = {
  2. devServer: {
  3. disableHostCheck: true,
  4. }
  5. }

重新构建并启动

因为在yml文件中,直接使用构建好的vue-docker镜像启动容器,所以修改后镜像并没有变,所以要么重新构建镜像,或者直接在yml文件中直接使用build构建镜像并生成容器

  1. version: "3" # 指定版本(不同的版本存在语法差异,这边使用最新的版本)
  2. services: # 服务名称
  3. nginx: # 用户自定义的服务名称
  4. image: nginx # 使用的nginx最新的镜像
  5. volumes:
  6. - ~/FE/vue-docker/default.conf:/etc/nginx/conf.d/default.conf # 拷贝default.conf目录到容器里的
  7. ports:
  8. - "80:80" # 暴露端口用于外部访问
  9. vue-docker: # 用户自定义的服务名称
  10. #image: vue-docker #直接使用上面已构建好的镜像
  11. #也可以直接根据dockerfile构建镜像
  12. build: # 构建相关的配置 也可以直接使用image:xxx去构建
  13. context: .
  14. working_dir: /vue-docker # 进入工作的目录中
  15. command: npm run serve # 在启动镜像时执行启动项目的命令
  16. volumes: # 指定映射的路径(可指定多个)
  17. #- ./x'x'x:/xxx
  18. - ~/FE/vue-docker/src:/vue-docker/src
  19. ports: # 暴露端口用于外部访问(可指定多个)
  20. - 8080:8080
  21. # - 8080:8081

docker-compose -p front-dev up
image.png

重新访问—成功

image.png
image.png