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
相關文章
相關標籤/搜索