dcoker入門,使用docker部署NodeJs應用


docker簡介

enter image description here
  docker是一個開源的應用容器引擎,可以為我們提供安全、可移植、可重復的自動化部署的方式。docker采用虛擬化的技術來虛擬化出應用程序的運行環境。如上圖一樣。docker就像一艘輪船。而輪船上面的每個小箱子可以看成我們需要部署的一個個應用。使用docker可以充分利用服務器的系統資源,簡化了自動化部署和運維的繁瑣流程,減少很多因為開發環境中和生產環境中的不同引發的異常問題。從而提高生產力。
  docker三個核心概念如下:

  • 鏡像(images):一個只讀的模板,可以理解為應用程序的運行環境,包含了程序運行所依賴的環境和基本配置。相當於上圖中的每個小箱子里面裝的東西。

  • 倉庫(repository):一個用於存放鏡像文件的倉庫。可以看做和gitlab一樣。

  • 容器(container):一個運行應用程序的虛擬容器,他和鏡像最大的區別在於容器的最上面那一層是可讀可寫的。 相當於上圖中的每個小箱子里。

docker安裝

mac

  官網下載地址,點擊下載即可。

liunx

打開終端 輸入

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

等待安裝完成。檢查是否安裝成功。
enter image description here
環境已經安裝完畢。現在來開始部署應用吧。
  

docker實戰

准備工作

初始化一個NodeJs程序

以下操作必須已經安裝了NodeJS。如果沒有安裝請參照之前的教程傳送門
首先創建一個空文件夾。並創建以下文件:

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

然后在server.js寫入

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

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

app.listen(3000);

在package.json中寫入

{
 "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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM