之前我寫過(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)期待。