docker简介



  docker是一个开源的应用容器引擎,可以为我们提供安全、可移植、可重复的自动化部署的方式。docker采用虚拟化的技术来虚拟化出应用程序的运行环境。如上图一样。docker就像一艘轮船。而轮船上面的每个小箱子可以看成我们需要部署的一个个应用。使用docker可以充分利用服务器的系统资源,简化了自动化部署和运维的繁琐流程,减少很多因为开发环境中和生产环境中的不同引发的异常问题。从而提高生产力。

  docker三个核心概念如下:

  • 镜像(images):一个只读的模板,可以理解为应用程序的运行环境,包含了程序运行所依赖的环境和基本配置。相当于上图中的每个小箱子里面装的东西。

  • 仓库(repository):一个用于存放镜像文件的仓库。可以看做和gitlab一样。

  • 容器(container):一个运行应用程序的虚拟容器,他和镜像最大的区别在于容器的最上面那一层是可读可写的。 相当于上图中的每个小箱子里。

docker安装

mac

  官网下载地址,点击下载即可。

liunx

打开终端 输入

  1. curl https://releases.rancher.com/install-docker/17.12.sh | sh

等待安装完成。检查是否安装成功。



环境已经安装完毕。现在来开始部署应用吧。

  

docker实战

准备工作

初始化一个NodeJs程序

以下操作必须已经安装了NodeJS。如果没有安装请参照之前的教程传送门

首先创建一个空文件夹。并创建以下文件:

  • server.js
  • package.json
  • Dockerfile
  • .dockerignore
  1. mkdir docker_demo
  2. cd docker_demo
  3. touch server.js
  4. touch package.json
  5. touch Dockerfile
  6. touch .dockerignore

然后在server.js写入

  1. const Koa = require('koa');
  2. const app = new Koa();
  3. app.use(async ctx => {
  4. ctx.body = 'Hello docker';
  5. });
  6. app.listen(3000);

在package.json中写入

  1. {
  2. "name": "docker_demo",
  3. "version": "0.1.0",
  4. "private": true,
  5. "scripts": {
  6. "start": "node server.js"
  7. },
  8. "dependencies": {
  9. "koa": "^2.5.0"
  10. }
  11. }

测试程序。控制台输入

  1. npm start

浏览器打开本地测试,如果如图所示。表示demo创建成功。请继续往下。

创建dockerfile文件

  Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令。Docker通过docker build执行Dockerfile中的一系列命令自动构建image.

在.dockerignore文件里面写入代码。表示过滤该类型的文件。类似git的.gitignore

  1. # Logs
  2. logs
  3. *.log
  4. npm-debug.log*
  5. # Runtime data
  6. pids
  7. *.pid
  8. *.seed
  9. # Directory for instrumented libs generated by jscoverage/JSCover
  10. lib-cov
  11. # Coverage directory used by tools like istanbul
  12. coverage
  13. # nyc test coverage
  14. .nyc_output
  15. # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
  16. .grunt
  17. # node-waf configuration
  18. .lock-wscript
  19. # Compiled binary addons (http://nodejs.org/api/addons.html)
  20. build/Release
  21. # Dependency directories
  22. node_modules
  23. jspm_packages
  24. # Optional npm cache directory
  25. .npm
  26. # Optional REPL history
  27. .node_repl_history
  28. .idea
  29. .node_modules
  30. node_modules
  31. .vscode

  在Dockerfile文件中写入以下代码:

  1. #制定node镜像的版本
  2. FROM node:8.9-alpine
  3. #声明作者
  4. MAINTAINER robin
  5. #移动当前目录下面的文件到app目录下
  6. ADD . /app/
  7. #进入到app目录下面,类似cd
  8. WORKDIR /app
  9. #安装依赖
  10. RUN npm install
  11. #对外暴露的端口
  12. EXPOSE 3000
  13. #程序启动脚本
  14. CMD ["npm", "start"]

构建镜像

使用build命令构造镜像,注意后面那个.不能少。

  1. docker build -t docker_demo .
  1. robin:docker_demo robin$ docker build -t docker_demo .
  2. Sending build context to Docker daemon 39.94kB
  3. Step 1/7 : FROM node:8.9-alpine
  4. ---> 406f227b21f5
  5. Step 2/7 : MAINTAINER robin
  6. ---> Using cache
  7. ---> 78d6cdbcfee2
  8. Step 3/7 : ADD . /app/
  9. ---> 2cb30678612d
  10. Step 4/7 : WORKDIR /app
  11. Removing intermediate container e51377081039
  12. ---> c2b7d0f37d2d
  13. Step 5/7 : RUN npm install
  14. ---> Running in da0c3946ca8d
  15. npm notice created a lockfile as package-lock.json. You should commit this file.
  16. added 38 packages in 3.323s
  17. Removing intermediate container da0c3946ca8d
  18. ---> eecee87f10e2
  19. Step 6/7 : EXPOSE 3000
  20. ---> Running in f3973cc168a4
  21. Removing intermediate container f3973cc168a4
  22. ---> 2671a4c6deb4
  23. Step 7/7 : CMD ["npm", "start"]
  24. ---> Running in dec529f754aa
  25. Removing intermediate container dec529f754aa
  26. ---> 6ec73793d353
  27. Successfully built 6ec73793d353
  28. Successfully tagged docker_demo:latest

等待镜像构造完成。然后使用 images命令查看镜像。



此时可以看到images已经构造完成。现在开始启动images,并测试。

  1. #启动镜像 -d表示后台执行,-p 9000:3000表示指定本地的9000端口隐射到容器内的3000端口,docker_demo为镜像名称
  2. docker run -d -p 9000:3000 docker_demo
  3. #查看容器
  4. docker ps



此时浏览器打开http://localhost:9000/,如果如图所示。表示容器运行正常。



  如果此时本地无法打开。可以使用log命令查看日志。根据日志修改对应出现的对方。

绑定docke hub

  镜像已经存在了我们本机硬盘,那我们实际中要么上传到服务器呢?这里通常有2个方法。一直是自己搭建镜像仓库比如(harbor),还有就是官方的docke hub,类似gitlab。我们这里先以docke hub为列。harbor放在下篇博客。首先需要注册docke hub账号,官网注册地址。然后登陆。

  1. robin:docker_demo robin$ docker login
  2. Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
  3. Username:xxxxxx
  4. Password:
  5. Login Succeeded
  6. robin:docker_demo robin$

登陆成功之后。需要给当前images。添加tag,并push

  1. #格式docker tag 标签名 用户名/标签名
  2. docker tag docker_demo robin365/docker_demo
  3. #格式docker push 用户名/标签名
  4. docker push robin365/docker_demo

  完成之后,可以登陆docke hub查看刚刚push的镜像。我们可以设置这个镜像是否公开。Public:所有人都可以下载。Private:表示自己才能下载。

  这样我们已经把images上传到docke hub了,在我们需要用到这个images的时候可以直接通过docker pull命令下载使用了。

  到此本教程结束。实际项目中部署可能会出现各种各样的问题,我们需要多查看log。根据log去做相应修改。后面我也会整理出有关docke在部署nodejs应用中的一些比较容易出错的地方。

dockerc 常用命令

  1. #查看当前docker版本
  2. docker -v
  3. #查看当前本地所有镜像
  4. docker images
  5. #构造镜像,用法docker build -t 镜像名称 .
  6. docker build -t docker_demo .
  7. #用于容器与主机之间的数据拷贝。用法docker cp 主机文件地址 容器内地址。12d7f14v45cv为容器id。
  8. docker cp /www/runoob 12d7f14v45cv:/www/
  9. #创建一个新的容器并运行,-d为后台执行,-p 9000:3000前面为主机端口,后面是容器端口。docker_demo镜像名
  10. docker run -d -p 9000:3000 docker_demo
  11. #启动已被停止的容器
  12. docker start docker_demo
  13. #关闭已被启动的容器
  14. docker stop docker_demo
  15. #重新启动容器
  16. docker restart docker_demo
  17. #杀掉一个运行中的容器。
  18. docker kill -s KILL docker_demo
  19. #删除一个或多少容器。-f :通过SIGKILL信号强制删除一个运行中的容器-l :移除容器间的网络连接,而非容器本身-v :-v 删除与容器关联的卷
  20. docker rm -f docker_demodocker_demo1
  21. #在运行的容器中执行命令。104e28f2f072容器id
  22. sudo docker exec -it 104e28f2f072 /bin/bash
  23. #列出容器。 -a:所有容器包含没有运行的
  24. docker ps
  25. #获取容器获取容器的日志 104e28f2f072容器id,-t:显示时间戳
  26. docker logs -f -t 104e28f2f072
  27. #登陆镜像仓库
  28. docker login
  29. #获取镜像
  30. docker pull
  31. #上传镜像
  32. docker push
  33. #查看指定镜像的创建历史。
  34. docker history docker_demo

dcoker实战,使用docker部署NodeJs应用的更多相关文章

  1. 基于Docker部署nodejs应用

    基于Docker部署nodejs应用 背景 公司基于Vue.js的项目最近需要部署到云端,因此需要先行在公司内部Docker环境下验证相关技术,因而有本文之前提. 本文展示在Docker容器中,应用部 ...

  2. docker部署nodejs项目应用

    之前笔者弄了一套nestjs项目放在自己服务器上,并用pm2管理进程. 现在要把pm2停止,尝试一下用docker容器,那么首先要安装docker 一.安装docker 由于笔者服务器的系统是cent ...

  3. Docker部署nodejs应用并使用PM2作为守护进程

    环境:centos7.6 Docker version 18.06.0-ce mkdir /data cd /data 拉取最新keymetrics/pm2:latest-alpine镜像 docke ...

  4. docker(部署常见应用):docker部署nginx

    上回说到centos安装docker. 这次用实战,docker部署运行常见的应用. docker常用命令 参看:docker命令大全.这里不做赘述. docker部署nginx 1.docker h ...

  5. 一步步学会用docker部署应用(nodejs版)

    一步步学会用docker部署应用 docker是一种虚拟化技术,可以在内核层隔离资源.因此对于上层应用而言,采用docker技术可以达到类似于虚拟机的沙盒环境.这大大简化了应用部署,让运维人员无需陷入 ...

  6. Linux实战(20):非docker部署ELK

    部署环境: Elasticsearch:7.5.2 Kibana:7.5.2 Logstash:7.5.2 filebeat:7.5.2 redis:最新版 部署方式:rpm+二进制包 使用架构 软件 ...

  7. Docker部署lnmp 实战 (多注意配置文件,不管访问试试换个浏览器)

    Docker部署LNMP环境 关闭防火墙,设置自定义网络 systemctl stop firewalld systemctl disable firewalld setenforce 0 docke ...

  8. gitbook安装与使用,并使用docker部署

    本文简单介绍如何安装并使用gitbook,最后如何使用docker构建书籍镜像. 1. 前置条件 需要Nodejs环境,安装npm,国内用户再安装cnpm npm install -g cnpm -- ...

  9. 【Docker江湖】之docker部署与理解

    转载请注明出处:http://blog.csdn.net/gamer_gyt 博主微博:http://weibo.com/234654758 Github:https://github.com/thi ...

随机推荐

  1. 机器学习——kNN(2)示例:改进约会网站的配对效果

    =================================版权声明================================= 版权声明:原创文章 禁止转载  请通过右侧公告中的“联系邮 ...

  2. [拾 得]pipe和xargs的恩怨情仇

    Photo by Joshua Sortino on Unsplash   坚持知识分享,该文章由Alopex编著, 转载请注明源地址: http://www.cnblogs.com/alopex/  ...

  3. iOS enum 定义与使用

    枚举其实很重要,特别是在应用开发初期,服务器端数据格式需要更改得情况下,枚举和宏都能是程序简洁,并且改动小. 网上有个人写的言简意赅,适合初学 转自:http://blog.csdn.net/ysy4 ...

  4. Spring MVC 数据校验@Valid

    先看看几个关键词 @Valid @Pattern @NotNull @NotBlank @Size BindingResult 这些就是Spring MVC的数据校验的几个注解. 那怎么用呢?往下看 ...

  5. DNS入门

    引言 常见的计网协议通过IP地址来识别分布式应用的主机,然而IPV4(特别是IPV6)的地址太繁琐难以使用和记忆,因此提出了使用主机名称来识别,实质是:主机名称通过称为名称解析的过程转换为IP地址.其 ...

  6. 关于int main( int argc, char *argv[] )

    int main(int argc, char *argv[], char *env[]) 1. int argc 表示你在命令行下输入命令的时候,一共有多少个参数. 2. char *argv[] ...

  7. [PHP]PDO占位符预处理在 IN 和 LIKE 中用法

    两点注意项: 1. 占位符 (?) 必须被用在整个值的位置,不需要引号等其它字符. 2. 参数按数组元素顺序依次传递给占位符. <?php /** * PDO基于占位符的查询预处理 * * @l ...

  8. 《.NET 设计规范》第 4 章:类型设计规范

    第 4 章:类型设计规范 4.1 类型和命名空间 要用命名空间把类型组织成一个由相关的功能区所构成的层次结构中. 避免非常深的命名空间层次.因为用户需要经常回找,所以这样的层次浏览起来很困难. 避免有 ...

  9. https原理及实践

    转载请注明出处 安全知识 网络安全问题 数据机密性 在网络传输数据信息时,对数据的加密是至关重要的,否则所有传输的数据都是可以随时被第三方看到,完全没有机密性可言. 数据机密性解决问题思路 利用算法 ...

  10. iOS-电子书开发 笔记

    前言 刚接手电子书项目时,和安卓开发者pt Cai老师[aipiti Cai,一个我很敬佩很资深的开发工程师,设计领域:c++.Java.安卓.QT等]共同商议了一下,因为项目要做要同步,移动端[手机 ...