Golang 部署 web 项目
首先使用 gin 编写一个 WebDemo
func main() {
r := gin.Default()
r.GET("/", func(context *gin.Context) {
context.String(http.StatusOK, "Hello,Sakura")
})
r.Run(":9999")
}
# 在window系统打linux的包
go env -w set CGO_ENABLED=0
go env -w set GOOS=linux
go env -w set GOARCH=amd64
go build WebDemo .
# 可以将这几条命令写入为bat文件或者sh文件
在 linux 上运行成功
1. Docker 部署 go web 程序
1.1 基于 golang:alpine 构建
本质上就是在 docker 中编译再运行
- 编写 DockerFile 文件
# 指定基础镜像
FROM golang:alpine
# 环境变量
ENV GOPROXY https://goproxy.cn,direct
# 创建目录
RUN mkdir /app
# 将源码复制到app目录
ADD . /app/
# 切换工作目录
WORKDIR /app
# 将代码编译为二级制文件
RUN go build -o web .
# 声明服务端口
EXPOSE 9999
# 启动容器自动运行go程序
CMD ["./web"]
- 使用 Docker build 构建镜像
# . 表示当前目录下的Dockerfile文件
docker build -t web .
# -f 可以指定文件
- 使用
docker images
查看镜像
可以看出构建的镜像非常大,是因为指定的基础镜像为 golang:alpine,此镜像包含 golang 开发环境
- 基于该镜像启动容器
root@VM-8-13-debian:~/Go_WorkSpace/DemoWeb# docker run -p 9999:9999 web
[GIN-debug] [WARNING] Creating an Engine instance with the Logger and Recovery middleware already attached.
[GIN-debug] [WARNING] Running in "debug" mode. Switch to "release" mode in production.
- using env: export GIN_MODE=release
- using code: gin.SetMode(gin.ReleaseMode)
[GIN-debug] GET / --> main.main.func1 (3 handlers)
[GIN-debug] [WARNING] You trusted all proxies, this is NOT safe. We recommend you to set a value.
Please check https://pkg.go.dev/github.com/gin-gonic/gin#readme-don-t-trust-all-proxies for details.
[GIN-debug] Listening and serving HTTP on :9999
1.2 基于空镜像构建
# 指定基础镜像
FROM busybox
# 将编译后的文件复制到app目录
ADD web /
# 启动容器时运行的命令
CMD ["./web"]
可以看出两者的大小区别