docker 部署 Go Web 程序
本轮只做理论正文与源码静态复核;下列命令、示例和测试均未执行。已有输出按代码推演或历史记录理解,不作为本轮运行证据。
完整文件与原片段边界
末尾保留的 Dockerfile 是 2020 年历史单阶段片段,[root@demo-host ...]# 是终端提示符,不能写进文件;原文没有提供 main.go/go.mod,不能据目录树认定工程完整。EXPOSE 不发布端口,CGO_ENABLED=0 也不能保证任意依赖能禁用CGO。以下是与课程一致的 Go 1.27.2 标准库教学示例,3个文件放同一独立目录,未构建、未拉取镜像、未运行:
go.mod:
text
module example.com/local-health
go 1.27.0main.go:
go
package main
import (
"log"
"net/http"
"time"
)
func main() {
mux := http.NewServeMux()
mux.HandleFunc("GET /health", func(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "text/plain; charset=utf-8")
_, _ = w.Write([]byte("ok\n"))
})
srv := &http.Server{Addr: ":8888", Handler: mux, ReadHeaderTimeout: 5*time.Second}
log.Fatal(srv.ListenAndServe())
}Dockerfile:
dockerfile
FROM golang:1.27.2 AS build
WORKDIR /src
COPY go.mod main.go ./
RUN CGO_ENABLED=0 go build -o /app .
FROM scratch
COPY --from=build /app /app
USER 65532:65532
EXPOSE 8888
ENTRYPOINT ["/app"]在上述三个文件所在的独立目录,未来可按下面顺序构建、启动、请求和清理;本次未执行:
sh
docker build -t local-health:lesson .
docker run -d --name local-health-lesson -p 127.0.0.1:18888:8888 local-health:lesson
curl -i http://127.0.0.1:18888/health
docker logs local-health-lesson
docker stop local-health-lesson
docker rm local-health-lesson
docker image rm local-health:lesson理论步骤是在该目录以当前目录为构建上下文、标记专用镜像,再显式映射 127.0.0.1:18888:8888。预期 GET /health 返回200和三个字节 ok加换行;其他路径404。此示例不访问HTTPS或时区数据库,scratch没有Shell、CA证书或时区文件;不能直接套到需要这些文件的业务应用。固定tag是教学选择,未核验远程digest,不声称镜像身份不可变。书面练习先画清主机18888到容器8888的映射,再解释为何EXPOSE本身不等于可访问。
2020 年原始 Dockerfile 与终端记录
docker 部署 Go Web 程序
http
shell
[root@demo-host dockerFile]# tree
.
├── Dockerfile
├── go.mod
└── main.godockerfile
[root@demo-host dockerFile]# cat Dockerfile
FROM golang:alpine
# 为我们的镜像设置必要的环境变量
ENV GO111MODULE=on \
CGO_ENABLED=0 \
GOOS=linux \
GOARCH=amd64
# 移动到工作目录:/build
WORKDIR /build
# 将代码复制到容器中
COPY . .
# 将我们的代码编译成二进制可执行文件app
RUN go build -o app .
# 移动到用于存放生成的二进制文件的 /dist 目录
WORKDIR /dist
# 将二进制文件从 /build 目录复制到这里
RUN cp /build/app .
# 声明服务端口
EXPOSE 8888
# 启动容器时运行的命令
CMD ["/dist/app"]继续阅读
- 知识专题
- 命令
- 命令