從零使用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

image-20210628200427053

選擇一個版本安裝

yum install docker-ce-20.10.3

啟動 Docker

systemctl start docker

設置開機自啟

systemctl enable docker

查看是否安裝成功

docker version

image-20210628201410975

創建 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"

image-20210628212427225

請求成功啦~

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

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM