將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
沒有留言:
張貼留言