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