Docker上开发nodejs

简介:


Docker介绍

Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub上进行维护。

Docker 项目的目标是实现轻量级的操作系统虚拟化解决方案。 Docker 的基础是 Linux 容器(LXC)等技术。

在 LXC 的基础上 Docker 进行了进一步的封装,让用户不需要去关心容器的管理,使得操作更为简便。用户操作 Docker 的容器就像操作一个快速轻量级的虚拟机一样简单。

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

Docker的优势

作为一种新兴的虚拟化方式,Docker 跟传统的虚拟化方式相比具有众多的优势。

首先,Docker 容器的启动可以在秒级实现,这相比传统的虚拟机方式要快得多。 其次,Docker 对系统资源的利用率很高,一台主机上可以同时运行数千个 Docker 容器。

容器除了运行其中应用外,基本不消耗额外的系统资源,使得应用的性能很高,同时系统的开销尽量小。传统虚拟机方式运行 10 个不同的应用就要起 10 个虚拟机,而Docker 只需要启动 10 个隔离的应用即可。

我理解的Docker

目前,我在使用docker的过程中基本上是本地开发好项目之后,生成dist文件目录,迁移到docker当中,相当于只在生产环境开发使用docker,原因主要有以下几点:

在开发环境使用docker感觉还是不是很舒服,每次修改都要重新build,以及run,比较麻烦,本地开发更加舒服;

docker实际上可以看做是一个封闭的盒子,想做一些查看和操作还是有点麻烦的的,交互性不是很好,感觉比较适合生产环境。

Docker hub介绍

目前 Docker 官方维护了一个公共仓库 Docker Hub,其中已经包括了超过 15,000 的镜像,大部分需求,都可以通过在 Docker Hub 中直接下载镜像来实现。

登陆

可以通过执行 docker login 命令来输入用户名、密码和邮箱来完成注册和登录。 注册成功后,本地用户目录的 .dockercfg 中将保存用户的认证信息。

 
  1. docker login --username=username --email=email@gmail.com 

下载

根据是否是官方提供,可将镜像资源分为两类。 一种是类似 centos 这样的基础镜像,被称为基础或根镜像。这些基础镜像是由 Docker 公司创建、验证、支持、提供。这样的镜像往往使用单个单词作为名字。 还有一种类型,比如 tianon/centos 镜像,它是由 Docker 的用户创建并维护的,往往带有用户名称前缀。可以通过前缀 user_name/ 来指定使用某个用户提供的镜像,比如 tianon 用户。

 
  1. docker pull apline 
  2.  
  3. // or 
  4.  
  5. docker pull mhart/alpine-node-auto  

提交

修改当前镜像之后需要提交修改后的镜像,修改一次镜像包括提交的过程如下:

先使用下载的镜像启动容器。

 
  1. docker run -t -i training/sinatra /bin/bash 
  2.  
  3. root@0b2616b0e5a8:/#  

注意:记住容器的 ID,稍后还会用到。在容器中添加 json package(一个 ruby gem)。

 
  1. root@0b2616b0e5a8:/# gem install json 

当结束后,我们使用 exit 来退出,现在我们的容器已经被我们改变了,使用 docker commit 命令来提交更新后的副本。

 
  1. docker commit -m "Added json gem" -a "Docker Newbee" 0b2616b0e5a8 ouruser/sinatra:v2 
  2.  
  3. 4f177bd27a9ff0f6dc2a830403925b5360bfe0b93d476f7fc3231110e7f71b1c  

其中,-m 来指定提交的说明信息,跟我们使用的版本控制工具一样;-a 可以指定更新的用户信息;之后是用来创建镜像的容器的 ID;最后指定目标镜像的仓库名和 tag 信息。创建成功后会返回这个镜像的 ID 信息。

使用 docker images 来查看新创建的镜像。

之后,可以使用新的镜像来启动容器

 
  1. $ docker run -t -i ouruser/sinatra:v2 /bin/bash 
  2.  
  3. root@78e82f680994:/#  

上传

用户可以通过 docker push 命令,把自己创建的镜像上传到仓库中来共享。例如,用户在 Docker Hub 上完成注册后,可以推送自己的镜像到仓库中。

 
  1. $ docker push ouruser/sinatra 
  2.  
  3. The push refers to a repository [ouruser/sinatra] (len: 1) 
  4.  
  5. Sending image list 
  6.  
  7. Pushing repository ouruser/sinatra (3 tags)  

修改镜像的标签

用 docker tag 命令来修改镜像的标签。

 
  1. $ sudo docker tag 5db5f8471261 ouruser/sinatra:devel 
  2.  
  3. $ sudo docker images ouruser/sinatra 
  4.  
  5. REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE 
  6.  
  7. ouruser/sinatra latest 5db5f8471261 11 hours ago 446.7 MB 
  8.  
  9. ouruser/sinatra devel 5db5f8471261 11 hours ago 446.7 MB 
  10.  
  11. ouruser/sinatra v2 5db5f8471261 11 hours ago 446.7 MB  

利用 Dockerfile 来创建镜像

使用 docker commit 来扩展一个镜像比较简单,但是不方便在一个团队中分享。我们可以使用 docker build 来创建一个新的镜像。为此,首先需要创建一个 Dockerfile,包含一些如何创建镜像的指令。

Dockerfile 中每一条指令都创建镜像的一层,例如:

 
  1. # Dockerfile.alpine 
  2.  
  3. FROM mhart/alpine-node:latest 
  4.  
  5. MAINTAINER zhanfang "fzhanxd@gmail.com" 
  6.  
  7. # If you have native dependencies, you'll need extra tools 
  8.  
  9. # RUN apk add --no-cache make gcc g++ python 
  10.  
  11. Create app directory 
  12.  
  13. RUN mkdir -p /usr/src/app 
  14.  
  15. WORKDIR /usr/src/app 
  16.  
  17. # If your project depends on many package, you can use cnpm instead of npm 
  18.  
  19. # RUN npm install cnpm -g --registry=https://registry.npm.taobao.org 
  20.  
  21. # Install app dependencies 
  22.  
  23. COPY package.json /usr/src/app/ 
  24.  
  25. RUN npm install --registry=https://registry.npm.taobao.org 
  26.  
  27. # Bundle app source 
  28.  
  29. COPY . /usr/src/app 
  30.  
  31. # Expose port 
  32.  
  33. EXPOSE 3000 
  34.  
  35. CMD [ "npm""start" ]  

编写完成 Dockerfile 后可以使用 docker build 来生成镜像。

 
  1. docker build -t alpine-koa2-startkit . 

其中 -t 标记来添加 tag,指定新的镜像的用户信息。 “.” 是 Dockerfile 所在的路径(当前目录),也可以替换为一个具体的 Dockerfile 的路径。

Dockfile 中的指令被一条一条的执行。每一步都创建了一个新的容器,在容器中执行指令并提交修改(就跟之前介绍过的 docker commit 一样)。当所有的指令都执行完毕之后,返回了最终的镜像 id。所有的中间步骤所产生的容器都被删除和清理了。

注意一个镜像不能超过 127 层

完成一次镜像的下载、修改和上传

以alpine-node-auto镜像为基础

1. 下载基础镜像

 
  1. docker pull mhart/alpine-node-auto 

2. 编写dockerfile

 
  1. # Dockerfile.alpine 
  2.  
  3. FROM mhart/alpine-node:latest 
  4.  
  5. MAINTAINER zhanfang "fzhanxd@gmail.com" 
  6.  
  7. # If you have native dependencies, you'll need extra tools 
  8.  
  9. # RUN apk add --no-cache make gcc g++ python 
  10.  
  11. Create app directory 
  12.  
  13. RUN mkdir -p /usr/src/app 
  14.  
  15. WORKDIR /usr/src/app 
  16.  
  17. # If your project depends on many package, you can use cnpm instead of npm 
  18.  
  19. # RUN npm install cnpm -g --registry=https://registry.npm.taobao.org 
  20.  
  21. # Install app dependencies 
  22.  
  23. COPY package.json /usr/src/app/ 
  24.  
  25. RUN npm install --registry=https://registry.npm.taobao.org 
  26.  
  27. # Bundle app source 
  28.  
  29. COPY . /usr/src/app 
  30.  
  31. # Expose port 
  32.  
  33. EXPOSE 3000 
  34.  
  35. CMD [ "npm""start" ]  

3. 创建新的镜像

 
  1. docker build -t=zhanfang/alpine-koa2-startkit:v1" . 

打上 alpine-koa2-startkit:v1 的 tag

4. 运行一个容器实例

 
  1. docker run -t -i --name alpine-koa2-application zhanfang/alpine-koa2-startkit:v2 

5. 上传镜像(如果没有登录请登陆,使用login命令)

 
  1. docker push zhanfang/alpine-koa2-startkit 



作者:zhanfang

来源:51CTO

相关文章
|
2月前
|
存储 持续交付 Docker
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
38 0
|
3月前
|
分布式计算 Java Linux
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
Docker 是一套构建在 Linux 内核之上的高级工具,旨在帮助开发人员和运维人员更轻松地交付应用程序和依赖关系,实现跨系统和跨主机的部署。使用安全且轻量级的容器环境来实现这一目标。容器可以手动创建,也可以通过编写 Dockerfile 自动创建。开发人员和运维人员可以将应用程序及其依赖打包到容器中,实现应用程序的可移植性和环境一致性。
105 5
【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(Dockerfile使用手册)
|
8天前
|
JavaScript 前端开发 Docker
全栈开发实战:结合Python、Vue和Docker进行部署
【4月更文挑战第10天】本文介绍了如何使用Python、Vue.js和Docker进行全栈开发和部署。Python搭配Flask创建后端API,Vue.js构建前端界面,Docker负责应用的容器化部署。通过编写Dockerfile,将Python应用构建成Docker镜像并运行,前端部分使用Vue CLI创建项目并与后端交互。最后,通过Nginx和另一个Dockerfile部署前端应用。这种组合提升了开发效率,保证了应用的可维护性和扩展性,适合不同规模的企业使用。
|
21天前
|
缓存 自然语言处理 Docker
[Docker] DevContainer高效开发(第一篇):基于remote container开发
VS Code的Dev Containers简化了Python的容器化开发,将开发环境与应用一同打包在Docker中,消除环境配置问题。这种方式使得多语言、多版本开发变得整洁高效。
29 0
|
25天前
|
Web App开发 JavaScript 前端开发
js开发:请解释什么是Node.js,以及它的应用场景。
Node.js是基于V8的JavaScript运行时,用于服务器端编程。它的事件驱动、非阻塞I/O模型使其在高并发实时应用中表现出色,如Web服务器、实时聊天、API服务、微服务、工具和跨平台桌面应用(使用Electron)。适用于高性能和实时需求场景。
18 4
|
30天前
|
应用服务中间件 nginx Docker
简述 Docker 在 Python WEB 开发中的作用。
【2月更文挑战第27天】【2月更文挑战第95篇】简述 Docker 在 Python WEB 开发中的作用。
|
1月前
|
Shell Docker 容器
Docker的常用命令:加速你的容器化开发与部署
Docker的常用命令:加速你的容器化开发与部署
55 0
|
1月前
|
Web App开发 JavaScript 前端开发
深入浅出:Node.js 在后端开发中的应用与实践
【2月更文挑战第13天】本文旨在探讨Node.js这一流行的后端技术如何在现代Web开发中被应用以及它背后的核心优势。通过深入分析Node.js的非阻塞I/O模型、事件驱动机制和单线程特性,我们将揭示其在处理高并发场景下的高效性能。同时,结合实际开发案例,本文将展示如何利用Node.js构建高性能、可扩展的后端服务,以及在实际项目中遇到的挑战和解决方案。此外,我们还将讨论Node.js生态系统中的重要工具和库,如Express.js、Koa.js等,它们如何帮助开发者快速搭建和部署应用。通过本文的探讨,读者将获得对Node.js在后端开发中应用的深入理解,以及如何有效利用这一技术来提升开发效率
|
2月前
|
测试技术 持续交付 数据库
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
介绍 Docker 的基本概念和优势,以及在应用程序开发中的实际应用。
55 0
|
2月前
|
IDE 数据中心 Docker
使用PyCharm与Docker容器进行开发:从入门到精通
使用PyCharm与Docker容器进行开发:从入门到精通
294 0