我的Go服務Docker部署模版
關於Docker
網上關於Docker的介紹有很多,我就不復制貼上了,大家可以自行查詢。為什麼用Docker?,一般來說是為了保證開發和線上環境一致,並能保證機器的乾淨,不會被安裝一堆依賴。說下題外話,之前開發EOS的時候,就被裝了一堆依賴和動態庫,差點讓強迫症的我想重灌電腦...後來寫了個docker映象才算是整理乾淨,可惜被改過的檔案是沒辦法還原了。
Build一個最小的Go應用映象
官方建議是用alpine映象,在實際使用過程中,發現還是會缺一些東西,下面是補充之後的新映象
FROM alpine:latest # 官方推薦映象大小才5M RUN apk update \ && apk upgrade \# 更新源和應用 && apk --no-cache add tzdata \# 只要go裡面用到time的包,那就必裝 && apk --no-cache add openssl \# 如果用到rsa加密解密,也需要裝 && apk --no-cache add ca-certificates \ # ca證書,這個也是必裝的 && rm -rf /var/cache/apk/ \# 清除安裝包 && ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \ && echo "Asia/Shanghai" > /etc/timezone # 這個是設定預設時區 WORKDIR /mnt/work # 最後設定一個工作目錄,這個可以自己定
打包出這個映象並命名go-alpine:
$ docker build -t go-alpine .
上面的映象build完才9M左右,我沒有把go編譯好的服務加進去,這是有原因的,下面會講到。
Before Docker Run
在實際開發過程中,我們會經常編譯go的服務然後執行,難道每次編譯都要重新Build一個映象?當然不,下面是啟動前的準備:
$ mkdir -p /mnt/work/service $ docker volume create --driver local \ --opt type=none \ --opt device=/mnt/work/service \ --opt o=bind \ --name=service-data-volume
建立了一個放服務的目錄併為它建立一個volume
Docker Run
把編譯出來的go服務放入volume裡面,然後讓docker啟動的時候載入這個volume,並執行目錄內的服務:
$ docker run -d -v service-data-volume:/mnt/work \ --name local_service \ -p 8000:8000 \ go-aplpine ./go_service
這樣每次更新都只需要替換volume內的服務,而不需要重新打包映象了。