最简单的部署方式是拿生成的二进制文件直接构成镜像,但作者介绍的部署方式是镜像构建阶段使用源码自动编译成二进制文件的部署
1,首先写个将部署在docker中的http服务
package main
import (
"fmt"
"net/http"
)
func IndexHandler(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "hello docker")
}
func main() {
http.HandleFunc("/", IndexHandler)
err := http.ListenAndServe("0.0.0.0:80", nil)
if err != nil {
fmt.Println(err)
}
}
2,在同目录下加个Dockerfile文件 ,内容如下
#使用golang环境,标记第一构建阶段名称为builder
FROM golang:1.13 AS builder
#当前目录所有文件copy进去
COPY . .
#执行编译,生成/bin/hellodocker
RUN go build -o /bin/hellodocker main.go
#第二构建阶段
FROM ubuntu:18.04
#将第一构建阶段生成的二进制文件copy进去
COPY --from=builder /bin/hellodocker .
#默认执行
CMD ["./hellodocker"]
这里使用了docker的多阶段构建,如果使用单阶段构建:
FROM golang:1.13
COPY . .
RUN go build -o hellodocker main.go
CMD ["./hellodocker"]
会有两个问题:
1,镜像中包含源码,会泄漏代码
2,由于包含golang编译环境,镜像体积会特别大
所以,作者使用了多阶段构建,将第一阶段构建的二进制文件copy到第二阶段中,第二阶段理论上只有系统镜像+二进制文件的大小
3,构建镜像
docker build -t hellodocker .
4,运行容器
docker run -itd -p 80:80 hellodocker
5,打开浏览器,输入127.0.0.1,即可看到hello docker
最终构建的镜像大小可以再优化,不包含系统镜像,但要在编译阶段将依赖项编入,这里作者就不深入了
有疑问加站长微信联系(非本文作者)