在Docker中部署Egg.js应用及Docker常用命令

前言
本文内容包括:linux服务器安装Docker、使用Docker部署node.js应用、更新、Docker里连接主机的mysql数据库,以及可能用到的Docker命令。

网上也有不少类似的文章,但有的过于简单甚至有误,不太适合新手。通过参看多篇文章,并基于使用Docker部署egg.js应用的实践经验整理出了本文。

1:Docker的前端应用场景是什么?

每个node.js应用需要放在一个独立的环境Docker容器内运行,相互隔离,互不影响。

2:Docker部署node.js应用的优点是什么?

使用Docker容器部署node.js快速方便,特别是应用较多时部署迁移等使用Docker会更方便。

3:为什么要使用Docker部署eggjs应用?

在同一台服务器上不能同时运行多个eggjs应用,除非停止另外一个eggjs应用。

4:使用Docker部署node.js应用,大体的流程是什么样的?

-> 服务器安装好Docker 
-> 本地应用根目录编写好`Dockfile`文件 
-> 将整个应用一起上传到服务器目录下 
-> 使用终端连接服务器执行命令安装Docker 
-> 部署成功。具体的操作请看下文。

服务器安装Docker

如果要使用Docker,需使用Centos 7.x版本。Docker对内核要求比较高,要在Centos6.5及更高的版本的64位系统里安装,网上说6.x使用Docker会有不稳定情况。本文安装docker ce版本。

1. 安装一些系统依赖:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

2. 添加软件源,这里使用阿里的源,更快更稳定:

sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

3. 更新 yum 软件源缓存,并安装 docker-ce:

sudo yum makecache fast
sudo yum install docker-ce

4. 启动docker-ce:

sudo systemctl enable docker
sudo systemctl start docker

5. 查看Docker版本:

docker -v

本人在Centos 7.2上安装的Docker版本为18.05.0-ce。

关于docker的使用等可查看 非官方docker中文版文档

部署node.js应用到服务器

1. egg.js应用需要修改根目录下的package.json(普通node.js应用可忽略这一步):将start这行里命令里的--daemon去掉,即启动eggjs使用egg-scripts start就好了。在Docker里eggjs应用要在前台运行。

2. 在本地应用的根目录下(package.json所在目录)新建一个名为Dockerfile的文件(无后缀),将以下内容复制到文件里,并将/usr/src/node-app/koa-server全部替换为你想设置的路径(该路径为docker容器里的路径,可自行设置):

# 设置基础镜像,如果本地没有该镜像,会从Docker.io服务器pull镜像
FROM node:8.6.0-alpine
# 设置时区
RUN apk --update add tzdata \
    && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
    && echo "Asia/Shanghai" > /etc/timezone \
    && apk del tzdata

# 创建app目录
RUN mkdir -p /usr/src/node-app/koa-server

# 设置工作目录
WORKDIR /usr/src/node-app/koa-server

# 拷贝package.json文件到工作目录
# !!重要:package.json需要单独添加。
# Docker在构建镜像的时候,是一层一层构建的,仅当这一层有变化时,重新构建对应的层。
# 如果package.json和源代码一起添加到镜像,则每次修改源码都需要重新安装npm模块,这样木有必要。
# 所以,正确的顺序是: 添加package.json;安装npm模块;添加源代码。
COPY package.json /usr/src/node-app/koa-server/package.json

# 安装npm依赖(使用淘宝的镜像源)
# 如果使用的境外服务器,无需使用淘宝的镜像源,即改为`RUN npm i`。
RUN npm i --registry=https://registry.npm.taobao.org

# 拷贝所有源代码到工作目录
COPY . /usr/src/node-app/koa-server

# 暴露容器端口
EXPOSE 9002

# 启动node应用
CMD npm start

上面的注释一目了然。整个过程简单描述就是:1.拉取docker镜像(并设置时区等);2.创建docker工作目录,并将package.json拷贝到docker里;3.安装npm依赖;4.将服务器上的应用拷贝到docker里;5.暴露docker容器的端口,然后启动node应用。

3. 使用ftp工具或git工具将整个应用上传到生产环境服务器,并使用终端连接到服务器,进入到服务器应用的目录下;(过程略)

4. 执行以下命令,安装docker镜像;

sudo docker build -t node/koa-server .

-t是对该镜像进行tag标识,标识的名字为node/koa-server,可以自定义这个名字。镜像的构建过程依赖于网速,整体还比较快。npm依赖可能会久一些,因为egg.js的依赖比较多。如果所有步骤执行完,会有success的提示,安装成功了。

5. 执行以下命令,使用刚创建好的镜像来启动一个容器;

普通node.js应用

sudo docker run -d --name koa-server -p 9002:9002 node/koa-server

-d为后台运行容器。如果普通node.js应用使用以上命令,容器使用9002端口,与Dockerfile里面的一致。

eggjs应用

sudo docker run -d --net=host --name koa-server node/koa-server

eggjs应用需要执行以上命令,即增加了--net=host,该参数表示使用host网络模式与主机共享网络来连接mysql数据库;(暂时使用这种模式成功了,后续研究其他更好方案)。

6. 执行以下命令查看容器是否启动成功;

docker ps

以上命令是查看运行中的容器。如果刚才启动成功,则会显示出来。

curl -i localhost:9002

也可以通过curl命令或者到浏览器里输入应用的访问地址,来查看能否访问应用,如果可以则安装成功。

docker logs containerId

如果刚才执行docker ps没有看到刚刚启动的容器,说明启动失败,使用该命令来查看启动的具体情况。

7. docker容器里eggjs连接mysql:

只需要根据情况修改数据库相关信息即可,在host网络模式下,容器里eggjs的mysql配置文件里的host仍可设置为localhost

更新docker里的node.js应用:

1. 通过查看容器列表,找到需要停止的容器ID;

docker ps

2. 停止容器;

sudo docker stop containerId

3. 删除容器;

sudo docker rm containerId

4. 删除镜像;

# 正常情况可以删除
sudo docker rmi imageId
# 提示无法删除情况下,强制删除
sudo docker rmi -f imageId

5. 将本地应用代码更新到服务器目录下。

6. 按照上面的步骤重新构建镜像和启动容器。

重点总结

  1. 使用Centos 7.x版本安装docker。
  2. --daemon要去掉,让eggjs应用直接前台运行。
  3. Dockerfile里先拷贝package.json,安装npm依赖后,再拷贝应用的代码。
  4. 使用境外服务器则不需要使用淘宝的npm镜像源。

可能出现的问题

  1. npm安装失败:可能是镜像源的问题,需要删除镜像重新构建镜像。
  2. 镜像无法删除:需要先停止和删除容器。

其他常用命令

镜像相关:

查看镜像构建工程

sudo docker history node/koa-server

比如上面我们构建node/koa-server这个镜像后,可以通过这个命令来查看该镜像的构建过程,来发现问题。

查看所有镜像列表

docker images

删除镜像

sudo docker rmi imageId

sudo docker rmi -f imageId

先查看镜像列表,找到要删除的镜像ID,然后使用该命令删除。-f为强制删除。

容器相关:

查看所有容器列表

docker ps

查看某个容器的信息

docker logs containerId

先查看容器列表,找到要查看容器的ID,然后使用该命令查看。

拷贝主机的文件到容器的目录下

docker cp src/. mycontainer:/target

src为要拷贝的目录名,mycontainer为容器的id,target为目标目录名。

进入某个容器的环境

sudo docker exec -it containerId /bin/bash
或
sudo docker exec -it containerId /bin/sh

先查看容器列表,找到要查看容器的ID,然后使用该命令查看。/bin/sh可在执行docker ps后看到。退出容器可以执行exit;

转载来源 # Reno
https://beautycss.net/2018/06/06/deploy-eggjs-app-with-docker/

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,723评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,080评论 2 379
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,604评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,440评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,431评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,499评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,893评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,541评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,751评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,547评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,619评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,320评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,890评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,896评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,137评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,796评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,335评论 2 342

推荐阅读更多精彩内容

  • Docker — 云时代的程序分发方式 要说最近一年云计算业界有什么大事件?Google Compute Engi...
    ahohoho阅读 15,505评论 15 147
  • 一 、什么是 Docker Docker 最初是 dotCloud 公司创始人 Solomon Hykes 在法国...
    Blazzer阅读 3,128评论 0 13
  • 好吧!我也记不得是十几岁,看我奶奶做了一次风萝卜,当时很好奇如何把团萝卜切成长长的萝卜条的。记得那是一个温暖...
    林加176阅读 2,141评论 0 0
  • (1) 十八岁那年跟我一起上课迟到的少年去了很远的地方,如今一年都见不到几次。 有人说,人啊越长大就越是一个不断失...
    陈等大人阅读 457评论 2 6