新建工程
本示例采用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:8080
,IP为docker
所在虚拟机的IP。
"{\"hello\":\"world\"}"
停止服务并删除镜像
#停止服务
docker stop myweb
#删除container实例
docker rm myweb
#删除container镜像
docker rmi myweb
以上便是完整过程。