一步步學會用docker部署應用(nodejs版)

2021-09-12 19:28:54 字數 4867 閱讀 3187

docker是一種虛擬化技術,可以在核心層隔離資源。因此對於上層應用而言,採用docker技術可以達到類似於虛擬機器的沙盒環境。這大大簡化了應用部署,讓運維人員無需陷入無止境繁瑣的依賴環境及系統配置中;另一方面,容器技術也可以充分利用硬體資源,做到資源共享。

本文將採用docker技術部署乙個簡單的nodejs應用,它包括乙個簡單的前置閘道器nginx、redis伺服器以及業務伺服器。同時使用dockerfile配置特定映象,採用docker-compose進行容器編排,解決依賴、網路等問題。

安裝docker及docker-compose,可參考 install docker compose

docker compose 技術可以檢視官方文件 docker compose

即可,映象源位址可替換,隨後重啟docker服務即可。

linux系統通過修改 /etc/docker/daemon.josn檔案,一樣可以替換源。

源切換完畢之後,就可以嘗試簡單的容器操作。

首先,執行乙個簡單的容器:

docker run -it node:8-slim node
run命令,根據某個版本的node映象執行容器,同時執行 「node」命令,進入node命令列互動模式。

docker run -d node:8-slim node
docker exec -it hashcode bash
hashcode可以通過

docker ps -l
找到對應容器的hashcode

對於映象的tag,則根據業務需求進行判斷是否需要完整版的系統。如nodejs映象,僅僅需要node基礎環境而不需要其他的系統預裝命令,因此選擇了 node:-slim 版本。

docker run -it node:8-slim bash

root@ff05391b4cf8:/# echo helloworld > /home/text

root@ff05391b4cf8:/# exit

docker commit ff05391b4cf8 node-hello

然後執行該映象即可。

另一種映象定製可以通過dockerfile的形式完成。dockerfile是容器執行的配置檔案,每次執行命令都會生成乙個映象,直到所有環境都已設定完畢。

dockerfile檔案中可以執行命令定製化映象,如 「from、copy、add、env、expose、run、cmd」等,具體dockerfile的配置可參考相關文件。

dockerfile完成後,進行構建映象:

docker build -t node:custom:v1 .
映象構建成功後即可執行容器。

關於docker-compose,將在下文示例中進行說明。

本文所有**已開源至

github

在docker-compose.yml中配置相關服務節點,同時在每個服務節點中配置相關的映象、網路、環境、磁碟對映等元資訊,也可指定具體dockerfile檔案構建映象使用。

version: '3'

services:

nginx:

image: nginx:latest

ports:

- 80:80

restart: always

volumes:

- ./nginx/conf.d:/etc/nginx/conf.d

- /tmp/logs:/var/log/nginx

redis-server:

image: redis:latest

ports:

- 6479:6379

restart: always

build: ./

volumes:

restart: always

ports:

- 8090:8090

command: node server/server.js

depends_on:

- redis-server

links:

- redis-server:rd

首先搭建乙個單節點快取服務,採用官方提供的redis最新版映象,無需構建。

version: '3'

services:

redis-server:

image: redis:latest

ports:

- 6479:6379

restart: always

關於version具體資訊,可參考compose and docker compatibility matrix找到對應docker引擎匹配的版本格式。

在services下,建立了乙個名為redis-server的服務,它採用最新的redis官方映象,並通過宿主機的6479埠向外提供服務。並設定自動重啟功能。

此時,在宿主機上可以通過6479埠使用該快取服務。

使用node.js的koa、koa-router可快速搭建web伺服器。在本節中,建立乙個8090埠的伺服器,同時提供兩個功能:1. 簡單查詢單個key的快取 2. 流水線查詢多個key的快取

docker-compose.yml

services:

build: ./

volumes:

restart: always

ports:

- 8090:8090

command: node server/server.js

depends_on:

- redis-server

links:

- redis-server:rd

dockerfile

from node:8-slim

run npm i --registry=

env node_env dev

expose 8090

指定的dockerfile則做了初始化npm的操作。

web-server sourcecode

const koa = require('koa');

const router = require('koa-router');

const redis = require('redis');

const = require('util');

let router = new router();

let redisclient = createredisclient();

function createredisclient() );

client.on('reconnecting', (err)=>ms and attempt $`);

});client.on('error', function (err) );

client.on('ready', function() :$/$`);

});return client;

}function execreturnpromise(cmd, args) else

});});

}function batchreturnpromise() );

}router.get('/', async (ctx, next) => ;

});router.get('/batch', async (ctx, next) =>

let ret = await batch.exec();

ctx.body = ;

}); .use(router.routes())

.use(router.allowedmethods())

.listen(8090);

需要注意的是,在web服務所在的容器中,通過別名rd訪問快取服務。

此時,執行命令docker-compose up後,即可通過 batch 訪問這兩個快取服務。

目前可以通過宿主機的8090埠訪問服務,為了此後web服務的可擴充套件性,需要在前端加入**層。例項中使用nginx進行**:

services:

nginx:

image: nginx:latest

ports:

- 80:80

restart: always

volumes:

- ./nginx/conf.d:/etc/nginx/conf.d

- /tmp/logs:/var/log/nginx

採用最新版的nginx官方映象,向宿主機暴露80埠,通過在本地配置nginx的抓髮規則檔案,對映至容器的nginx配置目錄下實現快速高效的測試。

預設單節點下,直接執行

docker-compose up -d
即可執行服務。

如果服務節點需要擴充套件,可通過

擴充套件為3個web伺服器,同時nginx**規則需要修改:

}server }

即第一部分為 docker-compose.yml所在目錄名稱,如果在根目錄則為應用名稱;

第二部分為擴充套件的服務名;

第三部分為擴充套件序號

通過設定nginx的配置的log_format中upstream_addr變數,可觀察到負載均衡已生效。

http
docker官方文件

docker-compose.yml 配置檔案編寫詳解

dockerfile實踐

一步步學會用docker部署應用(nodejs版)

docker是一種虛擬化技術,可以在核心層隔離資源。因此對於上層應用而言,採用docker技術可以達到類似於虛擬機器的沙盒環境。這大大簡化了應用部署,讓運維人員無需陷入無止境繁瑣的依賴環境及系統配置中 另一方面,容器技術也可以充分利用硬體資源,做到資源共享。本文將採用docker技術部署乙個簡單的n...

一步步學會用docker部署應用(nodejs版)

docker是一種虛擬化技術,可以在核心層隔離資源。因此對於上層應用而言,採用docker技術可以達到類似於虛擬機器的沙盒環境。這大大簡化了應用部署,讓運維人員無需陷入無止境繁瑣的依賴環境及系統配置中 另一方面,容器技術也可以充分利用硬體資源,做到資源共享。本文將採用docker技術部署乙個簡單的n...

一步步學會用docker部署應用(nodejs版)

docker是一種虛擬化技術,可以在核心層隔離資源。因此對於上層應用而言,採用docker技術可以達到類似於虛擬機器的沙盒環境。這大大簡化了應用部署,讓運維人員無需陷入無止境繁瑣的依賴環境及系統配置中 另一方面,容器技術也可以充分利用硬體資源,做到資源共享。本文將採用docker技術部署乙個簡單的n...