go语言工程制作dockerfile,并部署到docker

偶尔善良 提交于 2019-12-07 14:04:55

前言

众所周知云计算时代,是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 "niyuelin1990@163.com"
#设置工作目录
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 "niyuelin1990@163.com"
 ---> 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

此时便启动了docker容器。
我们可以在http://10.7.28.129:8080/ 访问该服务。
输出:

"{\"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集群下部署服务。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!