将 Golang 应用容器化

容器化可帮助您将应用及其依赖项捆绑到一个称为容器的单一软件包中。该软件包可以在任何平台上运行,而无需担心环境问题。在本节中,您将学习如何使用 Docker 将 Golang 应用容器化。

要将 Golang 应用容器化,首先需要创建一个 Dockerfile。Dockerfile 包含在容器中构建和运行应用的指令。此外,在创建 Dockerfile 时,您可以遵循不同的最佳实践集来优化镜像大小并提高安全性。

创建 Dockerfile

在 Golang 应用的根目录中创建一个名为 Dockerfile 的新文件。Dockerfile 包含在容器中构建和运行应用的指令。

以下是用于 Golang 应用的 Dockerfile。您也可以在 go-prometheus-monitoring 目录中找到此文件。

# Use the official Golang image as the base
FROM golang:1.24-alpine AS builder

# Set environment variables
ENV CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# Set working directory inside the container
WORKDIR /build

# Copy go.mod and go.sum files for dependency installation
COPY go.mod go.sum ./

# Download dependencies
RUN go mod download

# Copy the entire application source
COPY . .

# Build the Go binary
RUN go build -o /app .

# Final lightweight stage
FROM alpine:3.17 AS final

# Copy the compiled binary from the builder stage
COPY --from=builder /app /bin/app

# Expose the application's port
EXPOSE 8000

# Run the application
CMD ["bin/app"]

理解 Dockerfile

Dockerfile 由两个阶段组成

  1. 构建阶段:此阶段使用官方 Golang 镜像作为基础,并设置必要的环境变量。它还设置容器内的工作目录,复制 go.modgo.sum 文件以安装依赖项,下载依赖项,复制整个应用源文件,并构建 Go 二进制文件。

    您使用 golang:1.24-alpine 镜像作为构建阶段的基础镜像。CGO_ENABLED=0 环境变量禁用 CGO,这对于构建静态二进制文件非常有用。您还将 GOOSGOARCH 环境变量分别设置为 linuxamd64,以便为 Linux 平台构建二进制文件。

  2. 最终阶段:此阶段使用官方 Alpine 镜像作为基础,并从构建阶段复制编译后的二进制文件。它还暴露应用的端口并运行应用。

    您使用 alpine:3.17 镜像作为最终阶段的基础镜像。您将编译后的二进制文件从构建阶段复制到最终镜像。您使用 EXPOSE 指令暴露应用的端口,并使用 CMD 指令运行应用。

    除了多阶段构建之外,Dockerfile 还遵循最佳实践,例如使用官方镜像、设置工作目录以及仅将必要文件复制到最终镜像。您可以通过其他最佳实践进一步优化 Dockerfile。

构建 Docker 镜像并运行应用

拥有 Dockerfile 后,您可以构建 Docker 镜像并在容器中运行应用。

要构建 Docker 镜像,请在终端中运行以下命令

$ docker build -t go-api:latest .

构建镜像后,您可以使用以下命令在容器中运行应用

$ docker run -p 8000:8000 go-api:latest

应用将在容器内部开始运行,您可以通过 http://localhost:8000 访问它。您还可以使用 docker ps 命令检查正在运行的容器。

$ docker ps

总结

在本节中,您学习了如何使用 Dockerfile 将 Golang 应用容器化。您创建了一个多阶段 Dockerfile 来在容器中构建和运行应用。您还了解了优化 Docker 镜像大小和提高安全性的最佳实践。

相关信息

下一步

在下一节中,您将学习如何使用 Docker Compose 连接和运行多个服务,以使用 Prometheus 和 Grafana 监控 Golang 应用。

页面选项