经过 Docker 部署 nodejs -- egg 项目

经常使用的 docker 命令

  • 安装 docker 环境
  • docker --help 查看 docker 命令提示
  • docker ps -a 查看全部运行的容器
  • docker images 查看全部的
  • 配置 Dockerfile 文件
  • 查看容器运行日志:docker logs -f [containerId]

Docker 打包 egg 镜像
  • 在项目根目录新建 Dockerfile 文件,编辑内容以下
# 设置基础镜像,若是本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:10.13.0

# 配置环境变量
ENV NODE_ENV production

# 这个是容器中的文件目录
RUN mkdir -p /usr/src/app 
# 设置工做目录
WORKDIR /usr/src/app 
# 拷贝package.json文件到工做目录
# !!重要:package.json须要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,从新构建对应的层。
# 若是package.json和源代码一块儿添加到镜像,则每次修改源码都须要从新安装npm模块,这样木有必要。
# 因此,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/app/package.json 
# 安装npm依赖(使用淘宝的镜像源)
# 若是使用的境外服务器,无需使用淘宝的镜像源,即改成`RUN npm i`。
RUN npm i --production --registry=https://registry.npm.taobao.org 
# 拷贝全部源代码到工做目
COPY . /usr/src/app 
# 暴露容器端口
EXPOSE 9000

CMD npm start 
复制代码
  • 在 egg 项目的 package.json 文件中,在 start 启动项中,--daemon 是后台启动。若是使用 docker 容器,须要去除 --daemon .
  • 进入项目根目录,执行镜像打包命令: docker build -t image_name ./
  • 打包完成之后执行容器启动命令: docker run -itd --net=host --name container_name -p 8000:8000 image_name
  • -t 这个参数很重要,它表明不会进入到容器内部去执行命令,若是去掉它,会在容器内部执行启动 Dockerfile CMD 中的命令。
  • 执行完毕后,能够经过 docker ps 命令去查看,会显示正在运行的容器,若是发现容器没有正常启动,能够执行 docker logs -f containerID 命令,查看容器内的执行日志。

可能出现的问题


  1. 容器没法正常启动:出现这种状况,首先检查你的容器打包命令是否正确,docker ps -a 命令查看你打包的全部容器. 容器打包命令中的 -itd 中的 -d 至关于在容器内部执行了 Dockerfile 文件中的 CMD 命令,咱们知道在 nodejs 中执行命令后控制台会有日志输出,能够经过 docker logs -f containerID 检查日志输出。
  2. 容器正常启动,可是容器中的程序没法正常链接本地宿主机中的数据库等本地服务,首先要搞清楚服务端口号,在容器运行命令中加上对应的端口映射,好比 docker run -itd --net=host --name container_name -p 8000:8000 -p 9999:9999 image_name . --net=host 参数很是重要,这告诉容器和宿主机共享网络。这个时候,在容器内部能够经过你映射的端口号去正常访问本地服务。
  3. 若是前面两个步骤执行完之后,仍是没法正常启动和访问服务,建议去 egg.js github 仓库中去查询相关问题的解决方案 egg.js issue
相关文章
相关标签/搜索