阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

如何将nodeclub构建成Docker镜像

177次阅读
没有评论

共计 4907 个字符,预计需要花费 13 分钟才能阅读完成。

14 年毕业后开始接触 node,今天就想跟大家聊聊怎么把 nodeclub 项目源码构建成一个镜像。话说 Docker 是今年刚接触的,还在入门中,下面我简单介绍下 Docker、Dockerfile 的语法以及如何把 nodeclub 源码构建成镜像。

1. 什么是 docker?

 Docker allows you to package an application with all of its dependencies into a standardized unit for software development.

Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app)。几乎没有性能开销,可以很容易地在机器和数据中心中运行。最重要的是,他们不依赖于任何语言、框架包括系统。

Docker 的目标是实现轻量级的操作系统虚拟化解决方案。Docker 的基础是 Linux 容器(LXC)等技术。在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

下面的图片比较了 Docker 和传统虚拟化方式的不同之处,可见容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,而传统方式则是在硬件层面实现。

如何将 nodeclub 构建成 Docker 镜像

2.Dockerfile 简单入门

Docker can build images automatically by reading the instructions from a Dockerfile. A Dockerfile is a text document that contains all the commands you would normally execute manually in order to build a Docker image. By calling docker build from your terminal, you can have Docker build your image step by step, executing the instructions successively.

Docker 通过读取 Dockerfile 文件中的指令自动构建镜像。Dcokerfile 是一个文本文件,它包含了构建镜像所需要执行的全部命令。执行 docker build 命令,Docker 就会按照文档执行并最终创建一个镜像。

Dockerfile 支持支持的语法命令如下:

INSTRUCTION argument

指令不区分大小写。但是,命名约定为全部大写。

Dockerfile 都必须以 FROM 命令开始。FROM 命令会指定镜像基于哪个基础镜像创建,接下来的命令也会基于这个基础镜像(译者注:CentOS 和 Ubuntu 有些命令可是不一样的)。FROM 命令可以多次使用,表示会创建多个镜像。具体语法如下:

FROM <image name>

例如:

FROM google/nodejs

上面的指令告诉我们,新的镜像将基于 google 的 Node.js 的镜像来构建。

继 FROM 命令,DockefFile 还提供了一些其它的命令以实现自动化。在 Dockerfile 文件中这些命令的顺序就是它们被执行的顺序。

下面我们就了解下这些有趣的 Dockerfile 命令吧。

1.MAINTAINER:设置该镜像的作者。语法如下:

MAINTAINER <author name>

2.RUN:在 shell 或者 exec 的环境下执行的命令。RUN 指令会在新创建的镜像上添加新的层面,接下来提交的结果用在 Dockerfile 的下一条指令中。语法如下:

RUN <command>

3.ADD:复制文件指令。它有两个参数 <source> 和 <destination>。destination 是容器内的路径。source 可以是 URL 或者是启动配置上下文中的一个文件。语法如下:

ADD <src> <destination>

4.CMD:提供了容器默认的执行命令。Dockerfile 只允许使用一次 CMD 指令。使用多个 CMD 会抵消之前所有的指令,只有最后一个指令生效。CMD 有三种形式:

CMD [“executable”,”param1″,”param2″]
CMD [“param1″,”param2”]
CMD command param1 param2

5.EXPOSE:指定容器在运行时监听的端口。语法如下:

EXPOSE <port>;

6.ENTRYPOINT:配置给容器一个可执行的命令,这意味着在每次使用镜像创建容器时一个特定的应用程序可以被设置为默认程序。同时也意味着该镜像每次被调用时仅能运行指定的应用。类似于 CMD,Docker 只允许一个 ENTRYPOINT,多个 ENTRYPOINT 会抵消之前所有的指令,只执行最后的 ENTRYPOINT 指令。语法如下:

ENTRYPOINT [“executable”, “param1″,”param2”]
ENTRYPOINT command param1 param2

7.WORKDIR:指定 RUN、CMD 与 ENTRYPOINT 命令的工作目录。语法如下:

WORKDIR /path/to/workdir

8.ENV:设置环境变量。它们使用键值对,增加运行程序的灵活性。语法如下:

ENV <key> <value>

9.USER:镜像运行时,设置一个 UID。语法如下:

USER <uid>

10.VOLUME:授权访问从容器内到主机上的目录。语法如下:

VOLUME [“/data”]

3. 把 nodeclub 构建成一个镜像

先把我写的 Dockerfile 贴出来:

# Dockerfile to create a nodeclub image
FROM google/nodejs
MAINTAINER Carrotzpc
# Add files to the image
RUN mkdir -p /opt/nodejs
ADD . /opt/nodejs
WORKDIR /opt/nodejs
# Install the dependencies modules
RUN npm install
# Run make build
RUN make build
# Expose environment variables
ENV MONGO_CARROT_ADDR **LinkMe**
ENV MONGO_CARROT_PORT **LinkMe**
ENV MONGO_CARROT_DATABASE admin
ENV MONGO_CARROT_USER **ChangeMe**
ENV MONGO_CARROT_PASS **ChangeMe**
# Expose the container port
EXPOSE 5000
ENTRYPOINT [“node”, “app.js”]

这么简单的几行命令,就可以构建出一个 nodeclub 镜像。下面我重点聊一下环境变量 ENV,nodeclub 的源码我用的是 node + mongo(无 Redis)的版本,mongo 配置信息通过环境变量传递,这就需要我们简单修改一下 nodeclub 的配置文件,我在配置文件中增加了以下代码(不过直接在配置文件里边这样写不太好),用来获取 mongo 数据库连接字符串:

// Get mongodb connec string from env
function _getMongoUrl(){
  var db_addr = process.env.MONGO_CARROT_ADDR;
  var db_port = process.env.MONGO_CARROT_PORT;
  var db_user = process.env.MONGO_CARROT_USER;
  var db_pass = process.env.MONGO_CARROT_PASS;
  var db_database =  process.env.MONGO_CARROT_DATABASE;
  var db_url  = ‘mongodb://’;
  if (db_user && db_pass) {
    db_url += (db_user + ‘:’ + db_pass + ‘@’);
  }
  db_url += (db_addr? db_addr: ‘localhost’);
  db_url += ‘:’ + (db_port? db_port: 27017);
  db_url += ‘/’ + (db_database? db_database: ‘admin’);
  console.log(‘Connect to MongoStore Use this url:’ + db_url);
  return db_url;
}

到这里我们完成了源码的修改,其中 Dockerfile 是放在源代码根目录的。现在可以开始构建 nodeclub 镜像了,Windows 安装 Docker 比较蛋疼,我本地没有安装 Docker 环境,我用的是 TenxCloud 时速云的本地客户端 tce,安装配置都比较简单,这里就不说了,大家可以参考官方文档。

在命令行中输入 tce login 填写用户名、密码后完成登录,然后进入到源代码根目录,执行 tce push nodeclub 命令,tce 会自动将 Dockerfile 及引用的本地文件打包成 zip,并上传到 TenxCloud,由 TenxCloud 的容器引擎构建 Docker 镜像,我们可以看到 Docker 构建镜像的相关日志:

如何将 nodeclub 构建成 Docker 镜像

完成构建后打开时速云网站,进入 镜像市场 > 我的镜像 就可以看到我们刚刚构建的镜像 nodeclub:

如何将 nodeclub 构建成 Docker 镜像

在镜像详情页可以上传镜像图标、修改镜像信息、服务接口等,我们把 Dockerfile 中的 ENV 增加到服务接口中,用于在部署镜像时填写 mongo 的相关配置信息:

如何将 nodeclub 构建成 Docker 镜像

万事具备,只欠一个 mongo 了,正好时速云有提供 mongo 的镜像,于是我部署了一个 mongo,然后在部署 nodeclub 时填写这个 mongo 的地址、端口等信息,��样就完成了 nodeclub 的部署:

如何将 nodeclub 构建成 Docker 镜像

还有一种方式就是把 mongo 也集成到我们的镜像中,这就涉及到了 mongo 的安装以及启动,我们留在下一次讨论。我把源代码上传到了 github,大家有兴趣的话可以自己构建试试:https://github.com/Carrotzpc/docker-nodeclub。示例网站:http://nodeclub-k9nmf.q1.tenxcloud.net:46141/。PS:由于部署镜像前 host 并不可知,所以我把源码改成了通过 req.headers.host 来获取host,这样激活邮件中的链接就可用了。

更多 Docker 相关教程见以下内容

Docker 安装应用(CentOS 6.5_x64) http://www.linuxidc.com/Linux/2014-07/104595.htm 

Ubuntu 14.04 安装 Docker  http://www.linuxidc.com/linux/2014-08/105656.htm 

Ubuntu 使用 VNC 运行基于 Docker 的桌面系统  http://www.linuxidc.com/Linux/2015-08/121170.htm

阿里云 CentOS 6.5 模板上安装 Docker http://www.linuxidc.com/Linux/2014-11/109107.htm 

Ubuntu 15.04 下安装 Docker  http://www.linuxidc.com/Linux/2015-07/120444.htm 

在 Ubuntu Trusty 14.04 (LTS) (64-bit)安装 Docker http://www.linuxidc.com/Linux/2014-10/108184.htm 

在 Ubuntu 15.04 上如何安装 Docker 及基本用法 http://www.linuxidc.com/Linux/2015-09/122885.htm

Docker 的详细介绍:请点这里
Docker 的下载地址:请点这里 

本文永久更新链接地址:http://www.linuxidc.com/Linux/2016-01/127341.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-21发表,共计4907字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中