Loading... ## 所必须的一些东西 1. 官方网站:[egg.js](https://eggjs.org/zh-cn/),使用版本:[Version 2.30.0](https://github.com/eggjs/egg/releases/tag/2.30.0) 2. 官方网站:[Docker](https://www.docker.com/),使用版本:[Docker version 20.10.10, build b485636](https://hub.docker.com/editions/community/docker-ce-server-centos) 3. 官方网站:[Nodejs](https://nodejs.org/en/),使用版本:[16.13.0 LTS](https://nodejs.org/en/download/) 4. Docker镜像:[node](https://hub.docker.com/_/node),使用版本:16.13.0-alpine <div class="tip inlineBlock error"> Docker镜像使用的node版本对应使用的node版本,最好使用-alpine版,会极大减少占用,16.13.0版本镜像大小为863MB, 16.13.0-alpine版镜像大小为105MB </div> <div class="tip inlineBlock share"> Alpine 操作系统是一个面向安全的轻型 Linux 发行版。它不同于通常 Linux 发行版,Alpine 采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。在保持瘦身的同时,Alpine 还提供了自己的包管理工具 apk,可以直接通过 apk 命令直接查询和安装各种软件。 ------ 资料来自百度 </div> ## 1. 快速初始化项目 ```bash # 1. 创建项目文件夹 mkdir egg_docker_demo # 2. 进入文件夹 cd egg_docker_demo # 3. 创建项目 npm init egg --type=simple # 4. 使用淘宝镜像安装项目依赖 npm i --registry=https://registry.npm.taobao.org # 5. 运行项目 npm run dev # 6. 访问http://localhost:7001,出现hi, egg则说明项目搭建完成 ``` ## 2. 部署到Docker <div class="tip inlineBlock error"> 请完成自己的项目后再部署,只是举例所以使用默认项目 </div> 默认的项目目录应该是如下图这样的  ### <span style='color:red'>1. 修改package.json(很重要!!)</span> ```json // 将scripts中start命令中的--daemon删去 // 原文件 "scripts": { "start": "egg-scripts start --daemon --title=egg-server-apiLovers", "stop": "egg-scripts stop --title=egg-server-apiLovers", // 配置文件中还有其他命令,这里省略 } // 修改后的 "scripts": { "start": "egg-scripts start --title=egg-server-apiLovers", "stop": "egg-scripts stop --title=egg-server-apiLovers", // 配置文件中还有其他命令,这里省略 } ``` <div class="tip inlineBlock error"> --daemon参数可以让项目在后台运行,但是docker环境中项目必须在前台运行,否则docker会认为容器中没有前台任务处于空闲状态而自动停止容易。 </div> ### 2. 编写Dockerfile文件 在项目根目录新建一个以Dockerfile命名的文件,内容如下 ```shell # FROM 用于拉取基础的镜像,必须是除注释的第一行 FROM node:16.13.0-alpine # RUN 在创建镜像时运行的命令,多个命令请使用&&\来换行,不要写过多的RUN,否则会增加镜像的大小 # apk是alpine的包管理命令,类似于yum和apt-get # 这行命令用于设置时区 RUN apk --update add tzdata &&\ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime &&\ echo "Asia/Shanghai" > /etc/timezone &&\ apk del tzdata # WORKDIR 用于指定工作路径,类似于cd命令,没有这个路径时会自动创建,同时后面的命令路径也会受到影响 # 相当于命令的执行路径是:/egg_docker_demo # 这里将项目路径设置在根目录下的egg_docker_demo WORKDIR /egg_docker_demo # COPY命令可以将本地的文件复制到docker镜像中 # 很重要!!! # 这里一定要先复制package.json一个文件进去,如果直接把所有源代码直接复制过去会多次执行npm i # 严重影响创建时间!!! # 含义是:将本地Dockerfile同级的package.json复制到/egg_docker_demo下 # 路径已经由WORKDIR切换,不需要再次添加/egg_docker_demo COPY package.json package.json # 使用淘宝镜像安装依赖 RUN npm i --registry=https://registry.npm.taobao.org # 将本地目录下的所有文件复制到/egg_docker_demo COPY . . # 指定容器使用的端口,也就是项目中用到的端口 # 7001为egg的默认端口 EXPOSE 7001 # 该命令是为了在启动容器时提供一个默认的命令执行选项。如果用户启动容器时指定了运行的命令 # 则会覆盖掉CMD指定的命令。 # 数组第0个是命令,之后的都是参数 CMD [ "npm", "start" ] ``` <div class="tip inlineBlock error"> 命令写 npm start,不要写npm dev否则报错,因为package.json中的dependencies中没有egg-bin,egg-bin是开发时的依赖,正式部署不会下载egg-bin </div> ### 3. 编写.dockerignore文件 这个文件类似于.gitignore,名称写法固定,不要写错了!!用于忽略某些文件或者文件夹,让它们不被复制过去 ```shell # 以下内容根据需要增加或删减,复制过去即可 logs/ node_modules/ run/ test/ typings/ .idea/ .DS_Store .autod.conf.js .eslintignore .eslintrc .gitignore package-lock.json npm-debug.log yarn-error.log yarn.lock coverage/ .nyc_output/ *.sw* *.un~ jsconfig.json ``` ### 4. 开始构建镜像 在项目的根目录运行cmd,然后输入命令 `docker build -t egg_docker_demo/egg-web-app .` - docker build 用于构建镜像的命令 - -t 指定标签,标签形式类似于 xxxx/xxxx - . 指从当前目录找Dockerfile进行构建 <div class="tip inlineBlock error"> 构建速度和电脑或服务器配置和网速有关,请耐心等待! </div> 出现Successfully之类的字眼则说明构建完成  ## 运行Docker中的egg项目 **命令:** `docker run -it -p 7001:7001 名称` - docker run 运行docker的命令 - -i 让容器的标准输出打开 - -t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上 - -p 为docker设置端口映射,第一个为服务器端口,第二个为容器端口 - 名称 为构建时的设置的名称 - -d 可以让容器以守护态运行 ## 完结~~~ 最后修改:2022 年 04 月 10 日 © 允许规范转载 赞 0 More haste, Less speed.