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

发布了74 篇原创文章 · 获赞 53 · 访问量 21万+
展开阅读全文

GoLand调试器不会在Docker容器中调试go代码时在源代码中停止

11-08

<div class="post-text" itemprop="text"> <p>I am using:</p> <pre><code>Mac os High sierra 10.13.6 Docker Community Edition 18.06.1-ce GoLand 2018.2.3 Go 1.11.1 (installed by brew at /usr/local/Cellar/go/1.11.1/libexec </code></pre> <p><a href="https://i.stack.imgur.com/ErBhJ.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/ErBhJ.png" alt="enter image description here"></a> I am following the instructions at <a href="https://blog.jetbrains.com/go/2018/04/30/debugging-containerized-go-applications/" rel="nofollow noreferrer">https://blog.jetbrains.com/go/2018/04/30/debugging-containerized-go-applications/</a> to remotely debug go code running in a docker container from GoLand IDE.</p> <p>However, the debugger doesn't stop at the source code on calling <a href="http://localhost:8080" rel="nofollow noreferrer">http://localhost:8080</a></p> <p><a href="https://i.stack.imgur.com/EX9xu.png" rel="nofollow noreferrer"><img src="https://i.stack.imgur.com/EX9xu.png" alt="enter image description here"></a></p> <p>If I use Dockerfile.1, I see this error on running the container:</p> <pre><code>Could not create config directory: user: Current not implemented on linux/amd64. </code></pre> <p>If I use Dockerfile.2, I don't see any error on running the container.</p> <p>However, debugger doesn't stop at any breakpoints in the source.</p> <p>---- Dockerfile.1 ----</p> <pre><code>FROM golang:1.10.1-alpine3.7 AS build-env ENV CGO_ENABLED 0 ADD . /go/src/hello RUN go build -gcflags "all=-N -l" -o /server hello RUN apk add --no-cache git RUN go get github.com/derekparker/delve/cmd/dlv FROM alpine:3.7 EXPOSE 8080 40000 RUN apk add --no-cache libc6-compat WORKDIR / COPY --from=build-env /server / COPY --from=build-env /go/bin/dlv / CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "exec", "/server"] </code></pre> <p>---- Dockerfile.2 ----</p> <pre><code>FROM golang:1.10.1-alpine3.7 AS build-env ADD . /go/src/hello RUN apk add --no-cache libc6-compat build-base RUN go build -gcflags "all=-N -l" -o /server hello RUN apk add --no-cache git RUN go get github.com/derekparker/delve/cmd/dlv FROM alpine:3.7 EXPOSE 8080 40000 RUN apk add --no-cache libc6-compat WORKDIR / COPY --from=build-env /server / COPY --from=build-env /go/bin/dlv / CMD ["/dlv", "--listen=:40000", "--headless=true", "--api-version=2", "exec", "/server"] </code></pre> </div> 问答

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 编程工作室 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览