使用 dockerfile构建golang的web服务

在使用docker时,如何将自己的下golang 应用打包成一个镜像呢?

1. 编写web应用

package main

import (
	"fmt"
	"log"
	"net/http"
)

func handler(w http.ResponseWriter, r *http.Request) {
	if _, err := fmt.Fprintf(w, "hello,you visit url is %q\n", r.URL.Path); err != nil {
		log.Println(err)
	}
}

func main() {
	http.HandleFunc("/", handler)
	if err := http.ListenAndServe(":8000", nil); err != nil {
		log.Println(err)
	}
}

2. 编写dockerfile文件

查看官方文档:https://docs.docker.com/engine/reference/builder/

##源镜像
FROM golang:latest
##作者
MAINTAINER "xxx000@163.com"
#设置工作目录
WORKDIR $GOPATH/src/github.com/golangcode
#将服务器的go工程代码加入到docker容器中
ADD server.go $GOPATH/src/github.com/golangcode
#go构建可执行文件
RUN go build server.go
#暴露端口
EXPOSE 8000
#最终运行docker的命令
ENTRYPOINT  ["./server"]

查看文件目录情况:

root@cchui-virtual-machine:~/dockerfile# tree
.
├── dockerfile
└── server.go

0 directories, 2 files

2. docker build

root@cchui-virtual-machine:~/dockerfile# docker build -t myhttp .
Sending build context to Docker daemon  3.072kB
Step 1/7 : FROM golang:latest
latest: Pulling from library/golang  #### 拉取镜像
b9a857cbf04d: Pull complete 
d557ee20540b: Pull complete 
3b9ca4f00c2e: Pull complete 
667fd949ed93: Pull complete 
547cc43be03d: Pull complete 
0977886e8147: Pull complete 
cceccf7c7738: Pull complete 
Digest: sha256:de97bab9325c4c3904f8f7fec8eb469169a1d247bdc97dcab38c2c75cf4b4c5d
Status: Downloaded newer image for golang:latest
 ---> 5f46b413e8f5
Step 2/7 : MAINTAINER "wuzhihui000@163.com"
 ---> Running in 1547c38dccd0
Removing intermediate container 1547c38dccd0
 ---> 3bbeafee5863
Step 3/7 : WORKDIR $GOPATH/src/github.com/mygohttp  #### 设置工作目录
 ---> Running in a521736ec4aa
Removing intermediate container a521736ec4aa
 ---> 9e77014e18a0
Step 4/7 : ADD server.go $GOPATH/src/github.com/mygohttp
 ---> ba34fcf31732
Step 5/7 : RUN go build server.go
 ---> Running in 52da49b8a534
Removing intermediate container 52da49b8a534
 ---> 4c123c6263f7
Step 6/7 : EXPOSE 8000         ##### 暴露端口
 ---> Running in 69d02148537b
Removing intermediate container 69d02148537b
 ---> ddd533c50608
Step 7/7 : ENTRYPOINT  ["./server"]
 ---> Running in 92a0caca5771
Removing intermediate container 92a0caca5771
 ---> f7b57e00a5d8
Successfully built f7b57e00a5d8
Successfully tagged myhttp:latest

查看镜像:

root@cchui-virtual-machine:~/dockerfile# docker images
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
myhttp       latest    f7b57e00a5d8   2 minutes ago   845MB
golang       latest    5f46b413e8f5   6 weeks ago     839MB

3. 运行容器

root@cchui-virtual-machine:~/dockerfile# docker run -d -p 8000:8000 --name myserver myhttp
8cfd1ae6bc8ae7201c5605226ea62e7fdab0c4a4fb25fb68e3fc875a452416f5

测试访问:

root@cchui-virtual-machine:~/dockerfile# curl 127.0.0.1:8000/hello
hello,you visit url is "/hello"

4. 遇到的问题

在运行容器成功后,发现无法访问容器内的web服务:

root@cchui-virtual-machine:~/dockerfile# curl 127.0.0.1:8000/hello
curl: (7) Recv failure: 连接被对方重设

原因:

项目启动默认用的 hos 是127.0.0.1,而我们 docker 端口默认映射的host是0.0.0.0,所以需要把监听地址改为 0.0.0.0

即,改为:http.ListenAndServe(":8000", nil)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值