Docker入門(三):nodejs後端服務部署

冰冰biu發表於2024-07-10

本文主要內容是透過dockerfile建立映象,並透過kubernets(簡稱k8s)來啟動叢集服務。最後你會得到一個簡單的nodejs提供的api服務。

寫在前面

需要安裝的有node(如何安裝?),kubectl(如何安裝?)

一,建立nodejs應用

本文主要是用於實踐k8s,所以nodejs專案寫的非常簡單,除了package*.json之外只有簡單的app.js檔案
image
1,首先建立一個app.js檔案。程式碼如下,作用是用nodejs生成兩個api,一個get一個post,並監聽3000埠提供服務。

點選檢視程式碼
const Koa = require('koa');
const app = new Koa();
const Router = require('koa-router');
const router = new Router();

// GET /api/users
router.get('/api/users', async (ctx) => {
  ctx.body = [{ name: 'Alice' }, { name: 'Bob' }];
});

// POST /api/users
router.post('/api/users', async (ctx) => {
  const user = ctx.request.body;
  // 處理使用者資料...
  ctx.status = 201;
  ctx.body = { message: 'User created', user };
});

// 使用路由中介軟體
app.use(router.routes());
app.use(router.allowedMethods());

app.listen(3000);

如果是在本地,你可以使用node app.js輕鬆啟動,但可能報錯,提示koa和koa-router未安裝,這個時候你需要npm install koanpm install koa-router,然後你就有了package.jsonpackage-lock.json兩個檔案了。重新執行node後,在瀏覽器訪問localhost:300/api/users即可訪問得到資料返回。

以下為package.json程式碼供參考:

點選檢視程式碼
{
  "name": "my-koa-api",
  "version": "1.0.0",
  "description": "A simple Koa API",
  "private": true,
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "dependencies": {
    "koa": "^2.15.3",
    "koa-router": "^12.0.1"
  }
}

二,建立dockerfile

擁有了建議的nodejs專案之後,我們來建立dockerfile。
首先,在你的專案根目錄下建立名為Dockerfile的檔案,並複製以下程式碼(程式碼中有註釋)

點選檢視程式碼
# 1. 選擇 Node.js 官方映象作為基礎映象
FROM node:20.15.0

# 2. 設定工作目錄為 /app
WORKDIR /app

# 3. 將 package.json 和 package-lock.json 複製到工作目錄
COPY package*.json ./

# 4. 安裝專案依賴
RUN npm install

# 5. 將當前目錄下的所有檔案複製到工作目錄
COPY . .

# 6. 暴露 API 服務執行的埠,預設 Koa 監聽 3000 埠
EXPOSE 3000

# 7. 定義環境變數(如果有需要)
# ENV NODE_ENV production

# 8. 定義啟動命令,啟動 Koa 應用
CMD ["npm", "start"]

它的配置思路為:首先安裝node的20.15.0版本為基礎映象,然後設定工作目錄為app(等容器啟動之後進入可檢視當前目錄),複製package*.json就是兩個json檔案,隨後npm install安裝,接著複製當前目錄下的所有檔案到工作目錄,隨後暴露3000埠,最後啟動node。

映象構建
docker build -t my-koa-api .建立一個名為my-koa-api的映象

映象打標
docker tag my-koa-api xyb1205/my-koa-api:latest
其中my-koa-api是本地映象的名稱,xyb1205是docker hub上的使用者名稱,my-koa-api:latest是新建立的標籤

映象推送
docker push xyb1205/my-koa-api:latest

至此,hub上就有名為xyb120/my-koa-api的映象了
image

三,配置k8s,建立叢集

1,建立my-app-deployment.yaml配置檔案

點選檢視程式碼
apiVersion: apps/v1
kind: Deployment
metadata:
  name: my-app
spec:
  replicas: 3
  selector:
    matchLabels:
      app: my-app
  template:
    metadata:
      labels:
        app: my-app
    spec:
      containers:
      - name: my-app
        image: xyb1205/my-koa-api:latest
        ports:
        - containerPort: 3000

2,建立my-app-service.yaml檔案

service有好幾種型別,最常見的有ClusterIP,Nodeport,LoadBalancer,service預設型別為ClusterIP,ClusterIP和Nodeport一般都是提供叢集內部使用的,LoadBalancer可以供叢集外部使用。

點選檢視程式碼
apiVersion: v1
kind: Service
metadata:
  name: my-app-service
spec:
  type: LoadBalancer  # 設定 Service 型別為 LoadBalancer
  selector:
    app: my-app  # 選擇器,用於匹配 Pod 的標籤
  ports:
  - name: http  # 埠名稱
    protocol: TCP  # 協議型別
    port: 80  # Service 埠,叢集外部訪問使用此埠
    targetPort: 3000  # Pod 的目標埠

使用以下命令配置kubernets
kubectl apply -f my-app-deployment.yaml
kubectl apply -f my-app-service.yaml
注意,如何啟動kubernets呢?你需要在你的docker desktop應用中開啟設定,並開啟kubernets服務
image

四,訪問

檢視kubectl get services即可看到kubernets的服務
image
透過 http://<EXTERNAL-IP>:<Port>即可訪問服務
(由於本nodejs專案的api路徑已配置,所以你可以這樣訪問測試 http://<EXTERNAL-IP>:80/api/users)
image
代表成功訪問

五;踩過的坑

1,Nodeport並不能生成EXTRAL_IP,EXTRAL_IP才能被叢集外部訪問。(EXTRAL_IP的可訪問範圍,還需要研究)
2,nginx反向代理還需要加進來
3,叢集內部訪問ip,可以透過節點內命令,或者容器埠對映,來訪問。(後續有時間再詳細出一個)
4,叢集>節點>pod>容器。pod是容器的承載
5,在討論 Kubernetes 叢集、雲端計算環境或網路安全時,"防火牆策略"、"網路策略"和"網路安全組" 是三個關鍵概念,它們共同構成了網路環境的安全和訪問控制機制
6,kubernets有負載均衡,但是也有侷限性。

六,常用命令總結

其實命令都是為需求服務的

  • kubectl get services // 獲取所有服務
  • kubectl get pods // 獲取所有pods
  • kubectl get nodes //獲取所有節點
  • kubectl describe service <service-name> // 檢視service-name服務的詳細資訊

相關文章