Go 語言怎么使用 Docker 部署項目?
1介紹
Go 語言可以使用內(nèi)置命令行工具 go build 編譯生成可執(zhí)行文件。自 Go1.5 版本開始實現(xiàn)自舉后,交叉編譯也很方便,只需使用 GOOS、GOARCH 環(huán)境變量指定目標平臺和架構(gòu)。
部署 Go 項目,只需運行可執(zhí)行文件,一般有三種方式,分別是使用 nohup 命令、使用 supervisord 進程管理工具、使用 Docker。
本文我們介紹怎么使用 Docker 部署 Go 項目。閱讀本文,需要讀者朋友們了解 Docker 的基本操作。
2.web 項目
首先,我們開發(fā)一個簡單的 Go Web 項目,使用 Go 內(nèi)置命令行工具 go build 編譯生成可執(zhí)行文件 ./hello。
項目目錄:
.
├── Dockerfile
├── go.mod
├── hello
├── main.go
└── service.log
我們使用 Go 標準庫編寫一個 Web 項目,運行編譯生成的可執(zhí)行程序,訪問 http://127.0.0.1:8080/hello,輸出 hello word。
# 編譯
go build -o hello
./hello
# 訪問
curl http://127.0.0.1:8080/hello
# 輸出
hello world
如果使用 curl 訪問,可以正常輸出 hello world,說明我們程序已正常運行。需要注意的是在我們構(gòu)建 Docker 鏡像之前,我們需要重新使用以下命令,交叉編譯生成 linux 平臺的可執(zhí)行程序。
# 編譯
GOOS=linux GOARCH=amd64 go build -o hello
在完成以上準備工作之后,我們開始編寫 Dockerfile 文件,使該項目可以支持使用 Docker 部署。
Dockerfile 文件:
# 基礎(chǔ)鏡像
FROM alpine:3.12
# 維護者
MAINTAINER frank
# docker build 時執(zhí)行命令 - 創(chuàng)建目錄
RUN mkdir -p "/data/app" \
&& ln -sf /dev/stdout /data/app/service.log
# 工作目錄
WORKDIR "/data/app"
# 拷貝
COPY hello /data/app/hello
# docker run 時執(zhí)行命令
ENTRYPOINT ["./hello"]
在編寫完 Dockerfile 文件之后,我們可以使用 docker 命令構(gòu)建鏡像,前提是我們本機已安裝 Docker。
docker build -t hello:v1.0.0 .
運行以上構(gòu)建 Docker 鏡像的命令之后,我們就已成功構(gòu)建 Docker 鏡像。
3.Docker 部署
我們已經(jīng)構(gòu)建好了 Docker 鏡像,現(xiàn)在可以使用 Docker 部署項目了。
首先,執(zhí)行 docker images 命令,查看鏡像列表。
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello v1.0.0 8daaf8297956 11 seconds ago 11.7MB
運行上面命令,我們可以看到我們構(gòu)建好的鏡像名稱為 hello 的 Docker 鏡像。
然后,我們使用該鏡像,運行一個容器。
docker run -d -p 9090:8080 hello:v1.0.0
74f75a374493f21caaf0f2e7f3d14698c3909446c78af6dc1172ac3f9052d839
需要注意的是,我們使用宿主機端口 9090 映射容器端口 8080。其中參數(shù) -d 用于該程序在后臺運行,參數(shù) -p 用于映射端口。
查看容器列表:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
74f75a374493 hello:v1.0.0 "./hello" 9 seconds ago Up 8 seconds 0.0.0.0:9090->8080/tcp dazzling_ramanujan
執(zhí)行 docker ps -a 命令,我們可以查看容器列表。
最后,我們使用 curl 訪問 http://127.0.0.1:9090/hello,輸出 hello world。
# 訪問
curl http://127.0.0.1:9090/hello
# 輸出
hello world
如果使用 curl 訪問,可以正常輸出 hello world,說明我們已經(jīng)成功完成使用 Docker 部署 Go 項目。
我們可以使用 docker logs 命令,查看程序日志。
docker logs -f 74
2022/04/09 05:09:08 [info]run success
2022/04/09 05:09:21 [info]run success
2022/04/09 05:09:21 [info]run success
2022/04/09 05:09:22 [info]run success
我們可以使用 docker exec 命令進入容器中,查看項目文件。
docker exec -it 74 /bin/sh
/data/app # ls -al
total 5948
drwxr-xr-x 1 root root 4096 Apr 9 05:07 .
drwxr-xr-x 1 root root 4096 Apr 9 05:07 ..
-rwxr-xr-x 1 root root 6075093 Apr 9 04:12 hello
lrwxrwxrwx 1 root root 11 Apr 9 05:07 service.log -> /dev/stdout
/data/app #
4.Docker 容器管理工具 docker compose
使用 Docker 部署 Go 項目,我們需要先使用 docker build 命令構(gòu)建 Docker 鏡像,然后使用 docker run 命令運行容器,并且命令后面一般還需要一些參數(shù),操作多少有些繁瑣。
我們可以使用 Docker 容器管理工具 docker compose 解決此問題。讀者朋友們?nèi)绻涣私?docker compose,請自行查閱相關(guān)資料,限于篇幅,本文不再贅述。
我們主要介紹怎么將 docker compose 和 Dockerfile 配合使用,管理容器和鏡像。
我們需要創(chuàng)建一個 docker-compose.yml 文件,在該文件中配置運行容器需要的命令和參數(shù)。
docker-compose.yml 文件:
version: '3.8'
services:
webapp:
restart: always # Docker 重啟時,容器也重啟
build: # 構(gòu)建 Docker 鏡像
context: ./ # Dockerfile 文件的目錄
dockerfile: Dockerfile # Dockerfile 文件的名稱
image: hello:1.0.0 # 鏡像名稱和版本號
container_name: hello # 容器名稱
ports: # 宿主機和容器之間映射端口
- "9090:8080"
在編寫完 docker-compose.yml 文件之后,我們可以使用 docker-compose 命令行工具管理容器。
# 啟動容器
docker-compose up -d
# 查看容器列表
docker-compose ps
# 查看日志
docker-compose -f
# 關(guān)閉容器
docker-compose stop
# 啟動容器
docker-compose start
# 重啟容器
docker-compose restart
# 關(guān)閉并刪除容器
docker-compose down
需要注意的是,使用 docker-compose 命令行工具,需要在 docker-compose.yml 文件當前目錄執(zhí)行。
5.總結(jié)
本文我們介紹怎么使用 Docker 部署 Go 項目,并且介紹 Docker 容器管理工具 docker compose 的簡單使用,關(guān)于 docker 和 docker compose 的更多介紹,感興趣的讀者朋友們可以自行查閱資料。
使用 Docker 部署 Go 項目,主要共分為四步:
- 交叉編譯
- 編寫 Dockfile 文件
- 構(gòu)建鏡像
- 運行容器