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,將在下文示例中進行說明。
本文所有**已開源至在docker-compose.yml中配置相關服務節點,同時在每個服務節點中配置相關的映象、網路、環境、磁碟對映等元資訊,也可指定具體dockerfile檔案構建映象使用。github
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...