dcoker入门,使用docker部署NodeJs应用

docker简介

enter image description here
  docker是一个开源的应用容器引擎,能够为咱们提供安全、可移植、可重复的自动化部署的方式。docker采用虚拟化的技术来虚拟化出应用程序的运行环境。如上图同样。docker就像一艘轮船。而轮船上面的每一个小箱子能够当作咱们须要部署的一个个应用。使用docker能够充分利用服务器的系统资源,简化了自动化部署和运维的繁琐流程,减小不少由于开发环境中和生产环境中的不一样引起的异常问题。从而提升生产力。
  docker三个核心概念以下:javascript

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

  • 仓库(repository):一个用于存放镜像文件的仓库。能够看作和gitlab同样。java

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

    docker安装

    mac

      官网下载地址,点击下载便可。git

liunx

打开终端 输入docker

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

等待安装完成。检查是否安装成功。
enter image description here
环境已经安装完毕。如今来开始部署应用吧。
  npm

docker实战

准备工做

初始化一个NodeJs程序

如下操做必须已经安装了NodeJS。若是没有安装请参照以前的教程传送门
首先建立一个空文件夹。并建立如下文件:json

  • server.js
  • package.json
  • Dockerfile
  • .dockerignore
mkdir docker_demo
cd docker_demo
touch server.js
touch package.json
touch Dockerfile
touch .dockerignore

而后在server.js写入ubuntu

const Koa = require('koa');
const app = new Koa();

app.use(async ctx => {
   ctx.body = 'Hello docker';
});

app.listen(3000);

在package.json中写入api

{
 "name": "docker_demo",
 "version": "0.1.0",
 "private": true,
 "scripts": {
   "start": "node server.js"
 },
 "dependencies": {
   "koa": "^2.5.0"
}
}

测试程序。控制台输入

npm start

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

建立dockerfile文件

  Dockerfile是由一系列命令和参数构成的脚本,一个Dockerfile里面包含了构建整个image的完整命令。Docker经过docker build执行Dockerfile中的一系列命令自动构建image.
在.dockerignore文件里面写入代码。表示过滤该类型的文件。相似git的.gitignore

# Logs
logs
*.log
npm-debug.log*

# Runtime data
pids
*.pid
*.seed

# Directory for instrumented libs generated by jscoverage/JSCover
lib-cov

# Coverage directory used by tools like istanbul
coverage

# nyc test coverage
.nyc_output

# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
.grunt

# node-waf configuration
.lock-wscript

# Compiled binary addons (http://nodejs.org/api/addons.html)
build/Release

# Dependency directories
node_modules
jspm_packages

# Optional npm cache directory
.npm

# Optional REPL history
.node_repl_history
.idea
.node_modules
node_modules
.vscode

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

#制定node镜像的版本
FROM node:8.9-alpine
#声明做者
MAINTAINER robin
#移动当前目录下面的文件到app目录下
ADD . /app/
#进入到app目录下面,相似cd
WORKDIR /app
#安装依赖
RUN npm install
#对外暴露的端口
EXPOSE 3000
#程序启动脚本
CMD ["npm", "start"]

构建镜像

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

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

等待镜像构造完成。而后使用 images命令查看镜像。
enter image description here
此时能够看到images已经构造完成。如今开始启动images,并测试。

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

enter image description here
此时浏览器打开http://localhost:9000/,若是如图所示。表示容器运行正常。
测试结果
  若是此时本地没法打开。可使用log命令查看日志。根据日志修改对应出现的对方。

绑定docke hub

  镜像已经存在了咱们本机硬盘,那咱们实际中要么上传到服务器呢?这里一般有2个方法。一直是本身搭建镜像仓库好比(harbor),还有就是官方的docke hub,相似gitlab。咱们这里先以docke hub为列。harbor放在下篇博客。首先须要注册docke hub帐号,官网注册地址。而后登录。

robin:docker_demo robin$ docker login
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.
Username:xxxxxx
Password: 
Login Succeeded
robin:docker_demo robin$

登录成功以后。须要给当前images。添加tag,并push

#格式docker tag 标签名 用户名/标签名
docker tag docker_demo robin365/docker_demo
#格式docker push 用户名/标签名
docker push robin365/docker_demo

  完成以后,能够登录docke hub查看刚刚push的镜像。咱们能够设置这个镜像是否公开。Public:全部人均可如下载。Private:表示本身才能下载。enter image description here
  这样咱们已经把images上传到docke hub了,在咱们须要用到这个images的时候能够直接经过docker pull命令下载使用了。
  到此本教程结束。实际项目中部署可能会出现各类各样的问题,咱们须要多查看log。根据log去作相应修改。后面我也会整理出有关docke在部署nodejs应用中的一些比较容易出错的地方。

dockerc 经常使用命令

#查看当前docker版本
docker -v
#查看当前本地全部镜像
docker images
#构造镜像,用法docker build -t 镜像名称 .
docker build -t docker_demo .
#用于容器与主机之间的数据拷贝。用法docker cp 主机文件地址 容器内地址。12d7f14v45cv为容器id。
docker cp /www/runoob 12d7f14v45cv:/www/
#建立一个新的容器并运行,-d为后台执行,-p 9000:3000前面为主机端口,后面是容器端口。docker_demo镜像名
docker run -d -p 9000:3000 docker_demo
#启动已被中止的容器
docker start docker_demo
#关闭已被启动的容器
docker stop docker_demo
#从新启动容器
docker restart docker_demo
#杀掉一个运行中的容器。
docker kill -s KILL docker_demo
#删除一个或多少容器。-f :经过SIGKILL信号强制删除一个运行中的容器-l :移除容器间的网络链接,而非容器自己-v :-v 删除与容器关联的卷
docker rm -f docker_demo、docker_demo1
#在运行的容器中执行命令。104e28f2f072容器id
sudo docker exec -it 104e28f2f072 /bin/bash 
#列出容器。 -a:全部容器包含没有运行的
docker ps 
#获取容器获取容器的日志 104e28f2f072容器id,-t:显示时间戳
docker logs -f -t 104e28f2f072 
#登录镜像仓库
docker login
#获取镜像
docker pull 
#上传镜像
docker push
#查看指定镜像的建立历史。
docker history docker_demo
相关文章
相关标签/搜索