docker是一個開源的應用容器引擎,能夠爲咱們提供安全、可移植、可重複的自動化部署的方式。docker採用虛擬化的技術來虛擬化出應用程序的運行環境。如上圖同樣。docker就像一艘輪船。而輪船上面的每一個小箱子能夠當作咱們須要部署的一個個應用。使用docker能夠充分利用服務器的系統資源,簡化了自動化部署和運維的繁瑣流程,減小不少由於開發環境中和生產環境中的不一樣引起的異常問題。從而提升生產力。
docker三個核心概念以下:javascript
鏡像(images):一個只讀的模板,能夠理解爲應用程序的運行環境,包含了程序運行所依賴的環境和基本配置。至關於上圖中的每一個小箱子裏面裝的東西。html
倉庫(repository):一個用於存放鏡像文件的倉庫。能夠看作和gitlab同樣。java
容器(container):一個運行應用程序的虛擬容器,他和鏡像最大的區別在於容器的最上面那一層是可讀可寫的。 至關於上圖中的每一個小箱子裏。node
官網下載地址,點擊下載便可。git
打開終端 輸入docker
curl https://releases.rancher.com/install-docker/17.12.sh | sh
等待安裝完成。檢查是否安裝成功。
環境已經安裝完畢。如今來開始部署應用吧。
npm
如下操做必須已經安裝了NodeJS。若是沒有安裝請參照以前的教程傳送門
首先建立一個空文件夾。並建立如下文件:json
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裏面包含了構建整個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命令查看鏡像。
此時能夠看到images已經構造完成。如今開始啓動images,並測試。
#啓動鏡像 -d表示後臺執行,-p 9000:3000表示指定本地的9000端口隱射到容器內的3000端口,docker_demo爲鏡像名稱 docker run -d -p 9000:3000 docker_demo #查看容器 docker ps
此時瀏覽器打開http://localhost:9000/,若是如圖所示。表示容器運行正常。
若是此時本地沒法打開。可使用log命令查看日誌。根據日誌修改對應出現的對方。
鏡像已經存在了咱們本機硬盤,那咱們實際中要麼上傳到服務器呢?這裏一般有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:表示本身才能下載。
這樣咱們已經把images上傳到docke hub了,在咱們須要用到這個images的時候能夠直接經過docker pull命令下載使用了。
到此本教程結束。實際項目中部署可能會出現各類各樣的問題,咱們須要多查看log。根據log去作相應修改。後面我也會整理出有關docke在部署nodejs應用中的一些比較容易出錯的地方。
#查看當前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