將Go應用程式製作為docker image並運行在docker container。
範例環境:
- macOS Ventura 13.1
- Docker 20.10.21
- Go 1.19
事前要求
參考「Golang 建立網頁伺服器 Web Server」建立要作為docker image的Go應用程式專案。
Dockerfile
在Go專案根目錄新增Dockerfile檔內容如下,此為建構docker image的檔案。
Dockerfile
# syntax=docker/dockerfile:1
FROM golang:1.19-alpine
WORKDIR /app
COPY ./* ./
RUN go mod download
RUN go build -o /go-demo
EXPOSE 8080
CMD [ "/go-demo" ]
FROM golang:1.19-alpine- 使用golang:1.19-alpine為建構時的base image。WORKDIR /app- 指定container的/app目錄為後面Docker命令的工作目錄。COPY ./* ./- 把host執行docker build時的所在目錄下的所有檔案複製到container的WORKDIR下的./(即/app)。RUN go mod download- 在containers的WORKDIR執行go mod download依go.mod下載依賴的go modules。RUN go build -o /go-demo- 執行go build編譯當下目錄中的Go專案為執行檔並輸出為/go-demo。EXPOSE 8080- 宣告Go應用程式運行的docker container對外暴露8080 port。CMD [ "/go-demo" ]- 在container的WORKDIR執行/go-demo。
Build image
在Dockerfile同目錄執行docker build -t go-demo .把Go應用程式建構為docker image。
-t後的參數為image名稱,所以製作的image為"go-app"。.表示使用所在目錄中的Dockerfile來build image。
image製作好後會存在本機的docker registry。執行docker images列出現有的images,可以看到製作好的go-demo。
% docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
go-demo latest 9fef9e714dc5 About a minute ago 363MB
Push image
參考「Docker 推送image至Docker Hub」。
Run image
在命令列輸入docker run --name go-demo -d -it -p 8080:8080 go-demo:latest運行Go應用程式的image "go-demo"於docker容器。
% docker run --name go-demo -d -it -p 8080:8080 go-demo:latest
90aaceaf0a7cedf820fc9d6d280c29ea45f22ffc618befa0391d47268b3bb003
在命令列輸入docker ps檢視運行的go-demo container。
% docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90aaceaf0a7c go-demo:latest "/go-demo" 4 seconds ago Up 3 seconds 0.0.0.0:8080->8080/tcp go-demo
測試
在瀏覽器網址列輸入http://localhost:8080/hello?name=john得到的回應結果如下。
hello, john
沒有留言:
張貼留言