1. 程式人生 > >go語言工程製作dockerfile,並部署到docker

go語言工程製作dockerfile,並部署到docker

前言

眾所周知雲端計算時代,是docker,kubernetes的天下。學習使用docker和kubernetes是必選的。當然這兩個應用都是基於go語言的。所以雲端計算時代使用go語言寫服務也是極好的。那麼如何將go語言服務部署到docker容器呢?

1.首先使用go語言實現基本http服務

使用echo標準庫實現8080埠輸出helloworld的服務。

import (
    "github.com/labstack/echo"
    "log"
    "net/http"
)

func main() {
    e := echo.New()
    e.GET("/", handlerindex)
    log
.Println("starting echo") err := e.Start(":8080") if err != nil { log.Fatal("echo", err) } } func handlerindex(c echo.Context) error { log.Println("hello world handlerindex") return c.JSON(http.StatusOK, `{"hello":"world"}`) }

2.dockerfile 製作

dockerfile 製作的源映象我們可以在 hub.docker.com 找到 golang官方提供的源映象,我們採用golang:latest。

#源映象
FROM golang:latest
#作者
MAINTAINER Razil "[email protected]"
#設定工作目錄
WORKDIR $GOPATH/src/github.com/mygohttp
#將伺服器的go工程程式碼加入到docker容器中
ADD . $GOPATH/src/github.com/mygohttp
#go構建可執行檔案
RUN go build .
#暴露埠
EXPOSE 6064
#最終執行docker的命令
ENTRYPOINT  ["./mygohttp"]

注意dockerfile檔名稱必須是Dockerfile,其檔案必須再工程目錄下。

3.執行dockerfile,並生成docker映象

在當前目錄下,執行docker build -t hellomygohttp .
最終輸出:

Sending build context to Docker daemon 99.87 MB
Step 1 : FROM golang:latest
 ---> 138bd936fa29
Step 2 : MAINTAINER Razil "[email protected]"
 ---> Using cache
 ---> 2800249138e0
Step 3 : WORKDIR $GOPATH/src/github.com/mygohttp
 ---> Using cache
 ---> 593cdce39c9f
Step 4 : ADD . $GOPATH/src/github.com/mygohttp
 ---> Using cache
 ---> a63e6147a02c
Step 5 : RUN go build .
 ---> Using cache
 ---> f257c9bd5fa3
Step 6 : EXPOSE 6064
 ---> Using cache
 ---> c83be0bc2c21
Step 7 : ENTRYPOINT ./mygohttp
 ---> Using cache
 ---> ea2edeaf1f5b
Successfully built ea2edeaf1f5b

製作完成後,我們即可以用docker images檢視製作好的映象。

4.docker執行mygohttp

docker run --name mygohttp -p 8080:8080 -d mygohttp
"{\"hello\":\"world\"}"

至此服務便通了。這是我們也可以用如下指令檢視容器內日誌。

docker logs -f mygohttp 

2018/01/11 17:08:54 starting echo
⇨ http server started on [::]:8080
2018/01/11 17:09:28 hello world handlerindex

5.停止並刪除mygohttp服務和映象

#停止服務
docker stop mygohttp
#刪除container例項
docker rm mygohttp
#刪除container映象
docker rmi mygohttp

6.如何在go工程啟動時帶入變數引數

我們在執行go工程的時候,往往需要帶入動態變數去執行,那麼如何做到?
我們採用 系統變數的方式
go語言對應的庫是syscall.Getenv
修改程式碼如下:

package main

import (
    "github.com/labstack/echo"
    "log"
    "net/http"
    "syscall"
)

func main() {
    v, ok := syscall.Getenv("TASKID")
    log.Println("Getenv", v, ok)
    e := echo.New()
    e.GET("/", handlerindex)
    log.Println("starting echo")
    err := e.Start(":8080")
    if err != nil {
        log.Fatal("echo", err)
    }
}

func handlerindex(c echo.Context) error {
    log.Println("hello world handlerindex")
    return c.JSON(http.StatusOK, `{"hello":"world"}`)
}

dockerfile 不需要修改,重新制作dockerfile。docker build -t hellomygohttp .

7.執行帶系統引數的go工程容器

docker執行時 帶-e,可以加入系統配置引數。

docker run --name hellomygohttp -e TASKID=abc hellomygohttp 

此時便可以將系統引數帶入工程,如下是日誌輸出:

2018/01/11 17:08:54 Getenv  abc true
2018/01/11 17:08:54 starting echo

總結

至此go語言工程製作dockerfile和部署全部講完了,希望讀者能有所收穫。同時筆者將在下一節中將如何用製作完成的docker映象在kubernetes叢集下部署服務。