Docker部署 Go Web 示例
准备 GoWeb 代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| package main
import ( "fmt" "log" "net/http" )
func sayHello(w http.ResponseWriter, r *http.Request) { _, _ = fmt.Fprintf(w, "Hello PFinal") } func getConfig(w http.ResponseWriter, r *http.Request) { appId := r.FormValue("app_id") if appId == "" { _, _ = fmt.Fprintf(w, "请传递参数") return } _, _ = fmt.Fprintf(w, "获取对应的配置:" + appId) }
func main() { http.HandleFunc("/", sayHello) http.HandleFunc("/get_config", getConfig) log.Println("【默认项目】服务启动成功 监听端口 8989") er := http.ListenAndServe("0.0.0.0:8989", nil) if er != nil { log.Fatal("ListenAndServe: ", er) } }
|
上面的代码通过8989端口对外提供服务。
编写 Dockerfile
分阶段构建,通过仅保留二进制文件来减小镜像大小.使用分阶段构建技术,剥离了使用golang:alpine作为编译镜像来编译得到二进制可执行文件的过程,并基于scratch生成一个简单的、非常小的新镜像
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41
| FROM golang:alpine AS builder
ENV GO111MODULE=on \ CGO_ENABLED=0 \ GOOS=linux \ GOARCH=amd64
WORKDIR /build
COPY . .
RUN go mod init app && go mod tidy
RUN go build -o app .
WORKDIR /dist
RUN cp /build/app .
FROM scratch
COPY --from=builder /build/app / EXPOSE 8989
ENTRYPOINT ["/app"]
|
构建镜像
构建完成后,本地运行,然后 测试一下:
1 2
| docker run -p 8989:8989 web
|
1 2
| curl http://172.31.1.40:8989
|
输出: Hello PFinal
给镜像打标签 然后上传到 私有镜像仓库
1 2 3 4
| docker tag web:latest 172.31.1.40:5000/pfinalclub/web:v1
docker push 172.31.1.40:5000/pfinalclub/web:v1
|
172.31.1.40:5000 是私有仓库地址
Docker 搭建私有化
查看仓库是否有镜像
1
| curl http://172.31.1.40:5000/v2/_catalog
|
输出:
1
| {"repositories":["pfinalclub/web"]}
|
服务器拉取镜像运行
1 2
| docker pull 172.31.1.40:5000/pfinalclub/web:v1
|
1 2 3 4
| docker run -p 8981:8981 127.0.0.1:5000/pfinalclub/web
docker run -p 8981:8982 127.0.0.1:5000/pfinalclub/web
|