在使用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)