本文章同時發佈於:
大家好,繼上次Week25 - 用 Minecraft 來說明 Docker 為什麼這麼香 - Docker-Compose 篇的文章後,接下來要來介紹一下 Docker 在軟體實戰中的一些應用。
Docker 在實戰中有個很實用的功能就是:
> 統一開發環境
就像Week22 - 用 Redis 來幫 Line bot 髒沙發設計一次性功能 - 實作篇,透過 Docker 可以快速建立一個有 Redis 的開發環境,讓開發者專心於開發,而不是忙於架設 Redis。
在還沒有 Docker 以前,關於怎麼建立開發環境一直是個麻煩的問題,常見的作法就是請 Infra team 的人員統一建立一個 Development 的環境供大家開發,但如果有天有同事不小心把這個環境的 Redis 用爆了,就...
然後架設環境的 Infra team 就要加班了 QQ
所以用 Docker 建立一個「個人電腦上的環境」,無不是個好方法。
在 Docker 裡面開發,環境上的確方便,不過在 Docker 裡 debbuging,就變成了另一個問題。
而 Golang 針對這個問題的解決方案就是:
在 Docker 裡設定一個對外的 debug port
實作我們以 Golang Server 來講解,
首先先 clone example code。
然後起動 Docker。
$ docker-compose up
我們會看到以下 log,代表 Docker 的環境已經啟動完成,「但 Server 實際上還沒啟動,我們必須透過 VSCode Debug Mode 來啟動」,
透過 Debug Mode 啟動 Golang Server,
在 main.go
裡頭標注第 10 行,會看到 終端機
顯示已經新增中斷點的 log,
在瀏覽器進入localhost:8080
時可以看到,Debug Mode 的中斷點發揮的作用,
首先,Dockerfile 必須安裝delve,這是 Golang 專門拿來「Remote(遠端)」Debug 的工具,而這個遠端就是指 Docker。
# Dockerfile
FROM golang:1.14-alpine
WORKDIR /app
COPY . /app
RUN apk add --no-cache g++ git
# 安裝 delve
RUN go get github.com/go-delve/delve/cmd/dlv
接下來我們必須設定 docker-compose,解釋我寫在註解裡,
# docker-compose.yaml
version: "3.5"
services:
server:
build: .
working_dir: /app
volumes:
- .:/app
ports:
# Golang Server 的對外 8080 Port
- 8080:8080
# 由於 delve 的 Debug Port 是 6379,所以 Docker 必須要對外開放 6379 Port 供 VSCode 的 Debug Mode
- 6379:6379
# 會以 delve 來啟動 Golang Server,而這個 Debug Port 是 6379
entrypoint: dlv debug --headless --listen=:6379 --log --api-version=2
最後是 Debug Mode 的設定檔.vscode/launch.json
,
workspaceRoot
這個環境變數{
"version": "0.2.0",
"configurations": [
{
"name": "Launch remote",
"type": "go",
"request": "launch",
"mode": "remote",
"remotePath": "/app",
"port": 6379,
"host": "127.0.0.1",
"program": "${workspaceRoot}",
"env": {}
}
]
}
設定好這些參數後,就可以在 Docker 裡兼顧開發環境與 debugging 功能啦~
謝謝你的閱讀,也歡迎分享討論指正~