Docker部署Golang程序方法

之前我寫過(guò)如何部署Golang程序到服務(wù)器,這次咱們來(lái)寫寫怎么利用Docker來(lái)部署我的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è)步驟部署完成蒂萎,不過(guò)可能中間如果出點(diǎn)小問(wèn)題,會(huì)不知道怎么解決淮椰,當(dāng)然你也可以留言五慈。

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

一、依賴環(huán)境

  • Docker

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

我這里就寫一個(gè)最簡(jiǎn)單的hello world程序吧聪轿,監(jiān)聽(tīng)端口是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)聽(tīng)端口 80")
    er := http.ListenAndServe("0.0.0.0:80", nil)
    if er != nil {
        log.Fatal("ListenAndServe: ", er)
    }

}

三陆错、編譯成linux下的程序包

我是在mac上開(kāi)發(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ì)說(shuō)霹购。
具體的文件結(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ì)方開(kāi)發(fā)的端口察蹲,我默認(rèn)是開(kāi)放80端口请垛,這里可根據(jù)實(shí)際情況修改
  • CMD 執(zhí)行一個(gè)帶參數(shù)的命令,我這樣寫洽议,是為了讓鏡像啟動(dòng)時(shí)去執(zhí)行script/build.sh的腳本宗收,這個(gè)腳本里面是寫的啟動(dòng)go程序的命令。
    這里我把內(nèi)容粘貼出來(lái):
#!/usr/bin/env bash
cd /go/src/app/ && ./main

就這兩行亚兄。

五混稽、編譯我們自己的鏡像

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

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

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

六健田、編寫 docker-compose.yml 文件

到這里屬于我們的最后一步了烛卧,如果用我們剛編譯的go-web來(lái)運(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來(lái)啟動(dòng)我們的編排文件就好抄课,啟動(dòng)命令如下:

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

如果輸出下面的提示唱星,說(shuō)明啟動(dòng)成功了雳旅。

Creating world ... done

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

docker ps -a

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


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

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末型豁,一起剝皮案震驚了整個(gè)濱河市僵蛛,隨后出現(xiàn)的幾起案子尚蝌,更是在濱河造成了極大的恐慌,老刑警劉巖充尉,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件飘言,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡驼侠,警方通過(guò)查閱死者的電腦和手機(jī)姿鸿,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)倒源,“玉大人苛预,你說(shuō)我怎么就攤上這事∷癜荆” “怎么了热某?”我有些...
    開(kāi)封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)胳螟。 經(jīng)常有香客問(wèn)我昔馋,道長(zhǎng),這世上最難降的妖魔是什么糖耸? 我笑而不...
    開(kāi)封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任绒极,我火速辦了婚禮,結(jié)果婚禮上蔬捷,老公的妹妹穿的比我還像新娘垄提。我一直安慰自己,他們只是感情好周拐,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布铡俐。 她就那樣靜靜地躺著,像睡著了一般妥粟。 火紅的嫁衣襯著肌膚如雪审丘。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天勾给,我揣著相機(jī)與錄音滩报,去河邊找鬼。 笑死播急,一個(gè)胖子當(dāng)著我的面吹牛脓钾,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播桩警,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼可训,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起握截,我...
    開(kāi)封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤飞崖,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后谨胞,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體固歪,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年胯努,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了昼牛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡康聂,死狀恐怖贰健,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情恬汁,我是刑警寧澤伶椿,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布,位于F島的核電站氓侧,受9級(jí)特大地震影響脊另,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜约巷,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一偎痛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧独郎,春花似錦踩麦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至贪婉,卻和暖如春反粥,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背疲迂。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工才顿, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人尤蒿。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓郑气,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親优质。 傳聞我的和親對(duì)象是個(gè)殘疾皇子竣贪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

推薦閱讀更多精彩內(nèi)容