[微服務] Docker基礎(5) - 使用Docker進行第一個實戰

前言

在這篇文章我們要

  • 建立一個超簡單的node.js web app
  • 根據此app創建我們的Dockerfile
  • 建立image
  • 執行container
  • 透過瀏覽器連接我們的web應用

建立NodeJs web app

前言: 這不是我們的主要目的如果有更喜歡的語言或方式的話都可以取代

創建一個乾淨的資料夾並且建立一個簡單的nodeJs app

package.json

{
    "dependencies": {
        "express": "*"
    },
    "scripts": {
        "start": "node index.js"
    }
}

index.js

const express = require('express');

const app = express();

app.get('/', (req, res) => {
    res.send('Hi there');
});

app.listen(8080, () => {
    console.log('Listening on port 8080');
})

記得要先安裝node.js與npm

建立Dockerfile

  • 基底選擇
    • 哪個基底:他的tagName
  • 跑哪個Dependency
  • 執行Dependency指令
# Specify a base image
FROM node:alpine

# Install some dependencies
RUN npm install

# Default command
CMD ["npm", "start"]

可以看到FROM中我們將alpine改成node:alpine
因為node這個基底是node官方提供的,他可以直接幫你將node的各種工具安裝好,而我們為了方便所以選擇了alpine的tag,代表著這個基底也包含了alpine提供的package功能

問題來了

  • 如何放我們的source到我們的image中呢?

COPY 指令

在我們的Dockerfile中加上COPE指令,將我們的source放到image中

COPY ./ ./

指令代表將目前目錄的文件放到image的主目錄目錄中,全部的Dockerfile會如下

# Specify a base image
FROM node:alpine

# Install some dependencies
COPY ./ ./
RUN npm install

# Default command
CMD ["npm", "start"]

我們執行一次docker build .
可以看到我們的image順利產出了

還記的我們之前文章提到的將image客製化自己的標籤嗎

docker build -t 你的名稱/此image的名稱:版本號 .

我們就可以透過docker images中看到我們客製化的image了!!

啟動我們的Container

記得在build後的image id,如果忘記了可以用docker images查詢,直接讓他起來吧

docker run image-id

問題又來了

我起來了可是我卻無法透過我的瀏覽器看到我的node web app訊息,問題在哪呢?
因為我們目前瀏覽器訪問的是實際電腦的port,而這個port並沒有和我們的容器做掛勾,所以當然怎麼都沒辦法看到我們的NodeJS web app,

讓我們的Container port和電腦Hook up!

在我們的run指令增加-p設定Port

docker run -p 8080:8080 image-id
  • -p port:port 此變數用來宣告我們的實體port對應到的Container port

小知識:為了避免常使用的Port被我們的Container佔用,所以通常本機port都會用較冷門的port去和Container做映射

總結

今天我們將NodeJs web app和裝在Docekr容器中並且啟動,這也是微服務的基本操作,一口氣起好幾個Container包裝我們的微服務。

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)