前言
众所周知云计算时代,是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集群下部署服务。
来源:CSDN
作者:逆月林
链接:https://blog.csdn.net/niyuelin1990/article/details/79035728