使用 Docker 進(jìn)行 Go 應(yīng)用程序引導(dǎo)指南
為在 Docker 中部署的 Go 應(yīng)用程序做準(zhǔn)備
在使用 Go 開(kāi)發(fā) Web 應(yīng)用程序時(shí),無(wú)論是用于 HTTP 還是其他類型的服務(wù),部署到不同的階段或環(huán)境(本地開(kāi)發(fā)、生產(chǎn)環(huán)境等)都是一個(gè)常見(jiàn)的考慮因素。在本文中,我們將探討在 Docker 容器內(nèi)集成 Golang 棧的方法,這是一個(gè)被廣泛采用的方法,并使用 Docker Compose 進(jìn)行編排。
準(zhǔn)備您的 Go 應(yīng)用程序
首先,您需要一個(gè)功能齊全的 Go 應(yīng)用程序。以下是我們 main.go 文件的代碼及其簡(jiǎn)要說(shuō)明:
// /src/main.go
package main
import (
"fmt"
"net/http"
"os"
)
func main() {
var PORT string
if PORT = os.Getenv("PORT"); PORT == "" {
PORT = "3001"
}
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "Hello World from path: %s\n", r.URL.Path)
})
http.ListenAndServe(":"+PORT, nil)
}
這段代碼設(shè)置了一個(gè)基本的 HTTP 服務(wù)器,當(dāng)接收到請(qǐng)求時(shí)返回“Hello World”,并根據(jù)環(huán)境變量動(dòng)態(tài)分配一個(gè)端口。
創(chuàng)建您的 Dockerfile
接下來(lái)的步驟是創(chuàng)建一個(gè) Dockerfile,該文件定義了構(gòu)建和運(yùn)行您的 Go 應(yīng)用程序的環(huán)境。
# /Dockerfile
FROM golang:alpine
ADD ./src /go/src/app
WORKDIR /go/src/app
ENV PORT=3001
CMD ["go", "run", "main.go"]
Dockerfile 的解釋如下:
- 使用 Alpine Linux 發(fā)行版從官方 Golang 鏡像構(gòu)建容器,因?yàn)樗p量級(jí)。
- 將當(dāng)前目錄掛載到容器的標(biāo)準(zhǔn) Go 路徑上。
- 設(shè)置工作目錄到我們應(yīng)用程序的 Go 路徑。
- 定義一個(gè)名為“PORT”的環(huán)境變量,其默認(rèn)值為“3001”。
- 指定構(gòu)建和運(yùn)行我們應(yīng)用程序的命令。
構(gòu)建和運(yùn)行容器
假設(shè)您已安裝 Docker 運(yùn)行環(huán)境,請(qǐng)按照以下步驟操作:
(1) 構(gòu)建 Docker 鏡像:
docker build . -t my-golang-app-image
(2) 從該鏡像運(yùn)行一個(gè)容器:
docker run -p 3030:3001 -it --rm --name my-golang-app-run my-golang-app-image
在這里,我們指示 Docker 運(yùn)行一個(gè)新容器,將主機(jī)端口 3030 綁定到容器的內(nèi)部端口 3001,將 stdout 輸出顯示在當(dāng)前終端上,在其進(jìn)程終止后刪除容器,并為容器分配一個(gè)自定義名稱。
試一試!
在您的瀏覽器中訪問(wèn) localhost:3030,您應(yīng)該會(huì)看到文本“Hello World from path: /”。要停止容器,請(qǐng)按 Ctrl + C。
使用 Docker Compose 進(jìn)行編排
Docker Compose 允許集成多個(gè)容器。雖然對(duì)于此練習(xí)來(lái)說(shuō)可能有些大材小用,但對(duì)于未來(lái)的場(chǎng)景是寶貴的知識(shí)。創(chuàng)建一個(gè) docker-compose.yml 文件:
# /docker-compose.yml
version: '2'
services:
my-golang-app-run:
container_name: my-golang-app-run
build: .
command: go run main.go
volumes:
- ./src:/go/src/app
working_dir: /go/src/app
ports:
- "3030:3000"
environment:
PORT: 3001
現(xiàn)在,運(yùn)行以下命令:
docker-compose up
再次在瀏覽器中訪問(wèn) localhost:3030,您將看到與之前使用 Docker Compose 相同的結(jié)果。要停止容器,請(qǐng)按 Ctrl + C。
為什么在本地使用 Docker?
請(qǐng)注意,我們從未在本地環(huán)境中安裝 Go。只需安裝 Docker,您就可以避免在本地環(huán)境中安裝各種運(yùn)行時(shí),這在處理具有不同運(yùn)行時(shí)的多個(gè)項(xiàng)目時(shí)非常有用。
總結(jié)
我們成功地配置了一個(gè) Dockerfile,用于構(gòu)建圖像和運(yùn)行具有 Go 應(yīng)用程序所需環(huán)境的容器。此外,Docker Compose 定義文件允許我們?cè)谛枰獣r(shí)無(wú)縫運(yùn)行容器與其他服務(wù)。
希望這個(gè)指南對(duì)您有所幫助!