1. 程式人生 > 其它 >從零使用Docker部署Gin專案

從零使用Docker部署Gin專案

為啥要用Docker

大家平時肯定遇到過在開發環境下執行得好好的程式,放到線上環境就出現奇奇怪怪的 bug 甚至無法啟動,這往往是線上環境與開發環境不同導致的。為了解決這個問題,Docker 應運而生,它可以讓開發人員將應用打包到容器(可以理解為輕量虛擬機器)中,容器包含了程式及對應的執行環境,且可以在任何主流的 linux 機器上執行,從而保持了開發與上線時程式的執行環境一致,十分方便 。今天我們就重點聊聊怎麼從零開始使用 Docker 部署專案。

安裝Docker

篇幅所限,本文只介紹 CentOs 環境下的安裝方式,其餘系統可自行 Google

注:非 root 使用者以下命令前均新增 sudo

更新 yum 包

yum -y update

安裝所需軟體包

yum install -y yum-utils device-mapper-persistent-data lvm2

設定 yum 源

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

檢視可用版本

yum list docker-ce --showduplicates | sort -r

選擇一個版本安裝

yum install docker-ce-20.10.3

啟動 Docker

systemctl start docker

設定開機自啟

systemctl enable docker

檢視是否安裝成功

docker version

建立 Mysql 容器

拉取 Mysql 映象

docker pull mysql

建立並執行一個 Mysql 容器

docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=testPass -d mysql

進入容器

docker exec -it 9a35fc886fec4(容器id) /bin/bash

登入 Mysql

mysql -uroot -p

密碼使用建立容器時設定的密碼,接下來就可以建立/遷移資料庫啦

構建 Scratch 映象

編寫 Dockerfile

在專案根目錄建立名為 Dockerfile 的檔案,新增內容

FROM scratch

WORKDIR $GOPATH/src/msf-backend-web
COPY . $GOPATH/src/msf-backend-web

EXPOSE 8888
CMD ["./msf-backend-web"]

其中專案路徑/目標路徑/執行埠等根據自己專案情況修改即可

編譯可執行檔案

CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o msf-backend-web .

構建映象

$ docker build -t msf-backend-web .
Sending build context to Docker daemon  33.44MB
Step 1/5 : FROM scratch
 ---> 
Step 2/5 : WORKDIR $GOPATH/src/msf-backend-web
 ---> Using cache
 ---> 6b8e45c136a9
Step 3/5 : COPY . $GOPATH/src/msf-backend-web
 ---> 7ffb12cabe52
Step 4/5 : EXPOSE 8888
 ---> Running in 263232b68cfe
Removing intermediate container 263232b68cfe
 ---> 243f8e8a2913
Step 5/5 : CMD ["./msf-backend-web"]
 ---> Running in 06441170cf66
Removing intermediate container 06441170cf66
 ---> 369328eb2861
Successfully built 369328eb2861
Successfully tagged msf-backend-web:latest

執行容器

$ docker run --link mysql:mysql -p 8888:8888 msf-backend-web
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
 - using env:   export GIN_MODE=release
 - using code:  gin.SetMode(gin.ReleaseMode)

[GIN-debug] POST   /api/login                --> msf-backend-web/routers/api.Login (3 handlers)
[GIN-debug] POST   /api/token/refresh        --> msf-backend-web/routers/api.RefreshToken (3 handlers)
[GIN-debug] POST   /api/project/publish      --> msf-backend-web/routers/api.PublishProject (3 handlers)
[GIN-debug] GET    /api/project/detail/basic --> msf-backend-web/routers/api.GetProjectBasicDetail (3 handlers)
[GIN-debug] GET    /api/project/list         --> msf-backend-web/routers/api.GetProjectList (3 handlers)
[GIN-debug] GET    /api/project/detail/list  --> msf-backend-web/routers/api.GetProjectDetailList (3 handlers)
[GIN-debug] POST   /api/project/delete       --> msf-backend-web/routers/api.DeleteProject (3 handlers)
[GIN-debug] POST   /api/project/detail/option/delete --> msf-backend-web/routers/api.DeleteClientOption (3 handlers)
[GIN-debug] POST   /api/project/rebuild      --> msf-backend-web/routers/api.PublishProjectByOldProject (3 handlers)
[GIN-debug] GET    /api/project/detail/client/search --> msf-backend-web/routers/api.GetAllClientsByProjectId (3 handlers)

測試一下

[GIN] 2021/06/28 - 13:01:54 | 200 |    254.6702ms |      172.17.0.1 | GET      "/api/project/detail/basic?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBZG1pbklkIjoxLCJleHAiOjE2MjQ4OTIyODN9.aHqWSyqOtCpSKITgoOO0Yr-sdUNHyw2jwpGem98VAh0&project_id=1"
[GIN] 2021/06/28 - 13:20:15 | 200 |    260.0823ms |      172.17.0.1 | GET      "/api/project/detail/basic?token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJBZG1pbklkIjoxLCJleHAiOjE2MjQ4OTIyODN9.aHqWSyqOtCpSKITgoOO0Yr-sdUNHyw2jwpGem98VAh0&project_id=1"

請求成功啦~

至此我們成功建立了一個可以使用的 Scratch 映象,它可以執行在任何一個安裝了 docker 的機器上,當代碼編寫完成需要上線的時候,我們只需要按這個流程製作一個最新的映象交給運維同學即可,再也不會遇到開發環境與線上環境不同的困擾。

這樣我們就將使用 Docker 部署 Gin 專案的流程介紹完了。不過,這篇部落格可以教會你如何按流程刻板地 Docker 化部署 Gin專案,卻不能滿足每個人的定製化需求,如果你有更多需求(比如部署 Springboot 專案),則需要學習更多 Docker 知識,做到知其然並知其所以然,如果這正是你所需要的,那就繼續去學習吧。