用Dockerfile制作Go语言工程镜像

通过Dockerfile实现Go工程镜像,并部署运行

Posted by HonorJoey on April 9, 2020

新建工程

本示例采用echo开源框架实现http服务。

在空文件夹下新建main.go并将以下代码复制进去。

代码:

package main

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

func main() {
    e := echo.New()
    e.GET("/", handler)
    log.Println("starting echo")
    err := e.Start(":8080")
    if err != nil {
        log.Fatal("echo", err)
    }
}

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

新建Dockerfile

新建Dockerfile,并将写入以下内容。

#源镜像
FROM golang:latest
#设置代理
ENV HTTPS_PROXY "http://192.168.199.235:1087"
ENV HTTP_PROXY "http://192.168.199.235:1087"
#作者
MAINTAINER Razil "james293@126.com"
#设置工作目录
WORKDIR $GOPATH/src/github.com/myweb
#将服务器的go工程代码加入到docker容器中
ADD . $GOPATH/src/github.com/myweb
#下载包
RUN go get -u -v github.com/labstack/echo
#go构建可执行文件
RUN go build .
#暴露端口
EXPOSE 6064
#最终运行docker的命令
ENTRYPOINT  ["./myweb"]

因为在下载包的过程中可能会需要翻墙,所以在前面设置代理。如果不设置代理可能会出现go get过程中timeout的现象。此处的为翻墙服务所在的IP和开放的端口。

文件目录

root@ubuntu:/mnt/docker/golang# ll
total 16
drwxr-xr-x 2 root root 4096 Apr 16 18:41 ./
drwxr-xr-x 5 root root 4096 Apr 16 18:13 ../
-rw-r--r-- 1 root root  475 Apr 16 18:41 Dockerfile
-rw-r--r-- 1 root root  408 Apr 16 17:20 main.go

构建镜像

Dockerfile的文件夹下运行

docker build -t myweb . 

以下是运行过程

Sending build context to Docker daemon 3.072 kB
Step 1/10 : FROM golang:latest
 ---> 315fc470b445
Step 2/10 : ENV HTTPS_PROXY "http://192.168.199.235:1087"
 ---> Running in 08e22120d037
 ---> 7ea51fc350b9
Removing intermediate container 08e22120d037
Step 3/10 : ENV HTTP_PROXY "http://192.168.199.235:1087"
 ---> Running in c31be7929f69
 ---> d23ccad8f801
Removing intermediate container c31be7929f69
Step 4/10 : MAINTAINER Razil "james293@126.com"
 ---> Running in ef919d37ec07
 ---> 43bba626c1b9
Removing intermediate container ef919d37ec07
Step 5/10 : WORKDIR $GOPATH/src/github.com/mygohttp
 ---> 2a6b8c5c307a
Removing intermediate container d42e7171e711
Step 6/10 : ADD . $GOPATH/src/github.com/mygohttp
 ---> ac7dbfb77453
Removing intermediate container 7233029443f2
Step 7/10 : RUN go get -u -v github.com/labstack/echo
 ---> Running in bc27ed04e4fe
github.com/labstack/echo (download)
...
 ---> 1ab0ea2c86fc
Removing intermediate container bc27ed04e4fe
Step 8/10 : RUN go build .
 ---> Running in 04b7e937b02a
 ---> f1fdf820e2d0
Removing intermediate container 04b7e937b02a
Step 9/10 : EXPOSE 6064
 ---> Running in 2546f0aa5501
 ---> d86caf5bb53e
Removing intermediate container 2546f0aa5501
Step 10/10 : ENTRYPOINT ./mygohttp
 ---> Running in 3d08d59b1efc
 ---> 070b32655e2a
Removing intermediate container 3d08d59b1efc
Successfully built 070b32655e2a

完成后既可以通过docker images查看我们的镜像

REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
myweb               latest              070b32655e2a        26 minutes ago      936 MB

运行

通过docker run来运行我们的容器。

docker run --name myweb -p 8080:8080 -d myweb

通过docker ps查看

root@ubuntu:/mnt/docker/golang# docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                              NAMES
d7e355d2464d        myweb               "./mygohttp"        5 seconds ago       Up 2 seconds        6064/tcp, 0.0.0.0:8080->8080/tcp   myweb

查看日志

root@ubuntu:/mnt/docker/golang# docker logs -f myweb
2020/04/16 10:45:11 starting echo

   ____    __
  / __/___/ /  ___
 / _// __/ _ \/ _ \
/___/\__/_//_/\___/ v4.1.16
High performance, minimalist Go web framework
https://echo.labstack.com
____________________________________O/_______
                                    O\
⇨ http server started on [::]:8080
2020/04/16 10:45:40 hello world handler

浏览器访问http://192.168.199.236:8080IPdocker所在虚拟机的IP

"{\"hello\":\"world\"}"

停止服务并删除镜像

#停止服务
docker stop myweb
#删除container实例
docker rm myweb
#删除container镜像
docker rmi myweb

以上便是完整过程。