Docker部署Golang程序方法

之前我寫過如何部署Golang程序到服務(wù)器,這次咱們來寫寫怎么利用Docker來部署我的Golang,當(dāng)然如果要部署到Docker里面,Docker是必須安裝的,可以點(diǎn)擊這里查看安裝步驟。

文/謙益

這篇文章可能不太適合對(duì)go和Docker零基礎(chǔ)人士閱讀,需要有一定的基礎(chǔ)知識(shí)。

依賴知識(shí)

  • Go交叉編譯基礎(chǔ)
  • Docker基礎(chǔ)
  • Dockerfile自定義鏡像基礎(chǔ)
  • docker-compose編排文件編寫基礎(chǔ)

當(dāng)然,一點(diǎn)也不會(huì)也可以按照這個(gè)步驟部署完成,不過可能中間如果出點(diǎn)小問題,會(huì)不知道怎么解決,當(dāng)然你也可以留言。

我是在mac環(huán)境上開發(fā)測(cè)試的,如果你是在windows上可能有一點(diǎn)出入,但應(yīng)該不會(huì)有啥大問題。

一、依賴環(huán)境

  • Docker

二、編寫一個(gè)GoLang web程序

我這里就寫一個(gè)最簡(jiǎn)單的hello world程序吧,監(jiān)聽端口是80端口。
新建一個(gè)main.go文件,內(nèi)容如下:

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)//注冊(cè)URI路徑與相應(yīng)的處理函數(shù)
    log.Println("【默認(rèn)項(xiàng)目】服務(wù)啟動(dòng)成功 監(jiān)聽端口 80")
    er := http.ListenAndServe("0.0.0.0:80", nil)
    if er != nil {
        log.Fatal("ListenAndServe: ", er)
    }

}

三、編譯成linux下的程序包

我是在mac上開發(fā)的,需要用到go的交叉編譯,如果對(duì)交叉編譯不熟悉的,可以查下文檔,或者直接復(fù)制我下面的命令進(jìn)行編譯。
我們是要跑在Docker里面,基礎(chǔ) golang這個(gè)鏡像跑的,所以需要把他編譯成兼容 i386 處理器的程序。

sudo env GOOS=linux GOARCH=386 go build main.go

這個(gè)編譯完成后,本地會(huì)多出一個(gè) main 程序,暫時(shí)不用管它備用就行。

四、使用 Dockerfile 定制我們go程序的鏡像

新建一個(gè)文件夾,里面新建一個(gè)Dockerfile文件,再在里面新建app,script兩個(gè)文件。把上一步的main程序放到app文件夾里面,在script里面新建一個(gè)build.sh腳本文件,文件內(nèi)容先不管,等下會(huì)說。
具體的文件結(jié)構(gòu)是這樣。

.
├── Dockerfile
├── app
│   └── main
└── script
    └── build.sh

下面就是編寫Dockerfile文件內(nèi)容了,內(nèi)容我先上代碼:

FROM golang
MAINTAINER  謙益
WORKDIR /go/src/
COPY . .
EXPOSE 80
CMD ["/bin/bash", "/go/src/script/build.sh"]

這里解釋下:

  • FROM 是集成自哪個(gè)鏡像,我們是go程序官方提供了一個(gè)golang這樣的鏡像,我們可以直接使用。
  • MAINTAINER 是維護(hù)這名字。
  • WORKDIR 工作目錄。
  • COPY 這是一個(gè)復(fù)制命令,把本地的所有文件復(fù)制到工作目錄下。
  • EXPOSE 這是對(duì)方開發(fā)的端口,我默認(rèn)是開放80端口,這里可根據(jù)實(shí)際情況修改
  • CMD 執(zhí)行一個(gè)帶參數(shù)的命令,我這樣寫,是為了讓鏡像啟動(dòng)時(shí)去執(zhí)行script/build.sh的腳本,這個(gè)腳本里面是寫的啟動(dòng)go程序的命令。
    這里我把內(nèi)容粘貼出來:
#!/usr/bin/env bash
cd /go/src/app/ && ./main

就這兩行。

五、編譯我們自己的鏡像

這屬于Docker的知識(shí)了,我把命令粘貼出來。

docker build -t go-web .
  • 這個(gè)命令執(zhí)行,如果本地沒有 golang 這個(gè)鏡像的話,他會(huì)自己先去官方鏡像庫拉取這個(gè)鏡像再編譯,我們靜靜的等他就行。
  • go-web這個(gè)參數(shù)是你最后編譯后的鏡像名字,可以隨意修改,也可以加上版本號(hào)比如: go-web:v1

看到上面這個(gè)輸出,就說明編譯成功了,在你的本地鏡像里面就有了一個(gè)名為go-web的鏡像。可以使用 docker images 進(jìn)行查詢:

六、編寫 docker-compose.yml 文件

到這里屬于我們的最后一步了,如果用我們剛編譯的go-web來運(yùn)行我們的go程序:

version: '2'

networks:
  basic:

services:

  world:
    container_name: world
    image: go-web
    ports:
      - "8099:80"
    volumes:
      - ./app/go/world:/go/src/app:rw
    networks:
      - basic

到這里我們的編排文件已經(jīng)寫好了,現(xiàn)在只需要用docker-compose來啟動(dòng)我們的編排文件就好,啟動(dòng)命令如下:

docker-compose -f docker-compose.yml up -d world

如果輸出下面的提示,說明啟動(dòng)成功了。

Creating world ... done

啟動(dòng)成功后你可以再用

docker ps -a

來查看下是否啟動(dòng)成功了,如果看到下面的這個(gè)輸出說明就啟動(dòng)成功了。


你現(xiàn)在就可以訪問你們 http://127.0.0.1:8099 就能訪問我們的go程序了。

下一期文章主題會(huì)寫怎么用 Docker + Nginx 部署 Go 應(yīng)用程序,敬請(qǐng)期待。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容