使用docker部署一個go應用
前言

使用docker部署應用已經成為現在的主流。Docker 是一個開源的輕量級容器技術,讓開發者可以打包他們的應用以及應用運行的上下文環境到一個可移植的鏡像中,然后發布到任何支持Docker的系統上運行。 通過容器技術,在幾乎沒有性能開銷的情況下,Docker 為應用提供了一個隔離運行環境。
- 簡化配置
- 代碼流水線管理
- 提高開發效率
- 隔離應用
- 快速、持續部署
直接部署
首先准備好go項目,使用了一段簡單的代碼來進行測試
package main
import (
"fmt"
"log"
"net/http"
)
func sayHello(w http.ResponseWriter, r *http.Request) {
fmt.Fprintf(w, "hello world")
}
func main() {
http.HandleFunc("/", sayHello) //注冊URI路徑與相應的處理函數
log.Println("【默認項目】服務啟動成功 監聽端口 8000")
er := http.ListenAndServe("0.0.0.0:8000", nil)
if er != nil {
log.Fatal("ListenAndServe: ", er)
}
}
服務器需要配置go環境。我的gopath是在root下面的。
GOPATH="/root/go"
然后上傳代碼到src目錄中。我的項目名用的test。
在項目根目錄創建Dockerfile文件然后寫入內容。
FROM golang:latest
WORKDIR $GOPATH/src/test
COPY . $GOPATH/src/test
RUN go build .
EXPOSE 8000
ENTRYPOINT ["./test"]
Dockerfile中常見命令的分析,詳見Dockerfile常見的命令
構建鏡像
在項目目錄下面執行
docker build -t test-docker-go .
我們來看下這條命令
Usage: docker image build [OPTIONS] PATH | URL | -
Options:
-t, --tag list # 鏡像名稱
-f, --file string # 指定Dockerfile文件位置
示例:
docker build .
docker build -t shykes/myapp .
docker build -t shykes/myapp -f /path/Dockerfile /path
執行命令,然后打包鏡像
# docker build -t test-docker-go .
Sending build context to Docker daemon 14.34kB
Step 1/6 : FROM golang:latest
---> 2421885b04da
Step 2/6 : WORKDIR $GOPATH/src/test
---> Running in f372c7f2e310
Removing intermediate container f372c7f2e310
---> bdedf88480c9
Step 3/6 : COPY . $GOPATH/src/test
---> 4e8b7f1a47b9
Step 4/6 : RUN go build .
---> Running in 851d5c682f76
Removing intermediate container 851d5c682f76
---> 3d5ae3a19f94
Step 5/6 : EXPOSE 8000
---> Running in 9ed63b8df046
Removing intermediate container 9ed63b8df046
---> 40f1958f50a8
Step 6/6 : ENTRYPOINT ["./test"]
---> Running in d505df7ce50c
Removing intermediate container d505df7ce50c
---> 7c834b14f69a
Successfully built 7c834b14f69a
Successfully tagged test-docker-go:latest
創建並運行容器
執行命令運行並創建容器
# docker run -p 8000:8000 test-docker-go
2020/05/09 02:55:43 【默認項目】服務啟動成功 監聽端口 8000

使用docker-compose部署
上面成功創建並啟動了go容器,下面嘗試用docker-composer,創建並啟動容器。
在項目的根目錄創建docker-compose.yml文件。
version: '2'
networks:
basic:
services:
test-docker:
container_name: test-docker1
image: test-docker-go
ports:
- "8020:8000"
networks:
- basic
然后啟動docker-composer
# docker-compose up
Recreating test-docker1 ... done
Attaching to test-docker1
test-docker1 | 2020/05/09 06:33:47 【默認項目】服務啟動成功 監聽端口 8010
上傳到docker-hub,然后拉取鏡像,部署
下面嘗試把鏡像上傳到hub.docker,然后通過拉取鏡像,啟動容器。
首先打包鏡像到鏡像倉庫,同理先打包成鏡像,為了區分上面的,新打了一個鏡像。
# docker build -t test-docker-go-hub .
Sending build context to Docker daemon 14.34kB
Step 1/6 : FROM golang:latest
---> 2421885b04da
Step 2/6 : WORKDIR $GOPATH/src/test
---> Using cache
---> bdedf88480c9
Step 3/6 : COPY . $GOPATH/src/test
---> Using cache
---> 4e8b7f1a47b9
Step 4/6 : RUN go build .
---> Using cache
---> 3d5ae3a19f94
Step 5/6 : EXPOSE 8000
---> Using cache
---> 40f1958f50a8
Step 6/6 : ENTRYPOINT ["./test"]
---> Using cache
---> 7c834b14f69a
Successfully built 7c834b14f69a
Successfully tagged test-docker-go-hub:latest
然后登錄hub.docker。
# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to https://hub.docker.com to create one.
Username: liz2019
Password:
之后把打包的鏡像push到倉庫中。需要注意的是,需要將鏡像打個tag,不然push會報錯
denied: requested access to the resource is denied
打tag
# docker tag test-docker-go-hub liz2019/test-docker-go-hub
然后push
# docker push liz2019/test-docker-go-hub
The push refers to repository [docker.io/liz2019/test-docker-go-hub]
12a132dad8d5: Pushed
16b18b49dbb5: Pushed
1ffec8d4838f: Pushed
6e69dbdef94b: Pushed
f0c38edb3fff: Pushed
ef234633eec2: Pushed
8967306e673e: Pushed
9794a3b3ed45: Pushed
5f77a51ade6a: Pushed
e40d297cf5f8: Pushed
latest: digest: sha256:0ec0fa83015614135357629a433a7d9d19ea57c9f6e5d774772c644509884fa8 size: 2421
然后創新創建docker-compose.yml文件。
version: '3'
networks:
basic:
services:
test-docker:
container_name: test-docker2
image: liz2019/test-docker-go-hub
ports:
- "8020:8000"
networks:
- basic
然后啟動
# docker-compose up
Creating network "go_basic" with the default driver
Creating test-docker2 ... done
Attaching to test-docker2
test-docker2 | 2020/05/09 09:03:15 【默認項目】服務啟動成功 監聽端口 8000
^CGracefully stopping... (press Ctrl+C again to force)
Stopping test-docker2 ... done
參考
【Gin實踐 連載九 將Golang應用部署到Docker】https://segmentfault.com/a/1190000013960558
【Docker三劍客——Compose】https://blog.csdn.net/Anumbrella/article/details/80877643
