Compartir comentarios
Las respuestas se generan en base a la documentación.

Contenedorizar una aplicación Golang

La contenedorización te ayuda a empaquetar la aplicación y sus dependencias en un solo paquete llamado contenedor. Este paquete se puede ejecutar en cualquier plataforma sin preocuparte por el entorno. En esta sección, aprenderás cómo contenedorizar una aplicación Golang usando Docker.

Para contenedorizar una aplicación Golang, primero debes crear un Dockerfile. El Dockerfile contiene las instrucciones para construir y ejecutar la aplicación en un contenedor. Además, al crear un Dockerfile, puedes seguir diferentes conjuntos de mejores prácticas para optimizar el tamaño de la imagen y hacerla más segura.

Creación de un Dockerfile

Crea un nuevo archivo llamado Dockerfile en el directorio raíz de tu aplicación Golang. El Dockerfile contiene las instrucciones para construir y ejecutar la aplicación en un contenedor.

A continuación se muestra un Dockerfile para una aplicación Golang. También encontrarás este archivo en el directorio go-prometheus-monitoring.

# Usar la imagen oficial de Golang como base
FROM golang:1.24-alpine AS builder

# Configurar variables de entorno
ENV CGO_ENABLED=0 \
    GOOS=linux \
    GOARCH=amd64

# Configurar el directorio de trabajo dentro del contenedor
WORKDIR /build

# Copiar los archivos go.mod y go.sum para la instalación de dependencias
COPY go.mod go.sum ./

# Descargar dependencias
RUN go mod download

# Copiar todo el código fuente de la aplicación
COPY . .

# Compilar el binario de Go
RUN go build -o /app .

# Etapa final ligera
FROM alpine:3.21 AS final

# Copiar el binario compilado desde la etapa de construcción (builder)
COPY --from=builder /app /bin/app

# Exponer el puerto de la aplicación
EXPOSE 8000

# Ejecutar la aplicación
CMD ["bin/app"]

Entendiendo el Dockerfile

El Dockerfile consta de dos etapas:

  1. Etapa de construcción (Build stage): Esta etapa utiliza la imagen oficial de Golang como base y configura las variables de entorno necesarias. También establece el directorio de trabajo dentro del contenedor, copia los archivos go.mod y go.sum para la instalación de dependencias, descarga las dependencias, copia todo el código fuente de la aplicación y compila el binario de Go.

    Utilizas la imagen golang:1.24-alpine como imagen base para la etapa de construcción. La variable de entorno CGO_ENABLED=0 deshabilita CGO, lo cual es útil para compilar binarios estáticos. También configuras las variables de entorno GOOS y GOARCH en linux y amd64, respectivamente, para compilar el binario para la plataforma Linux.

  2. Etapa final (Final stage): Esta etapa utiliza la imagen oficial de Alpine como base y copia el binario compilado desde la etapa de construcción. También expone el puerto de la aplicación y la ejecuta.

    Utilizas la imagen alpine:3.21 como imagen base para la etapa final. Copias el binario compilado de la etapa de construcción a la imagen final. Expones el puerto de la aplicación mediante la instrucción EXPOSE y ejecutas la aplicación con la instrucción CMD.

    Además de la construcción multi-etapa, el Dockerfile sigue mejores prácticas como el uso de imágenes oficiales, la configuración del directorio de trabajo y la copia únicamente de los archivos necesarios a la imagen final. Puedes optimizar aún más el Dockerfile aplicando otras mejores prácticas.

Construcción de la imagen Docker y ejecución de la aplicación

Una vez que tengas el Dockerfile, puedes construir la imagen Docker y ejecutar la aplicación en un contenedor.

Para construir la imagen Docker, ejecuta el siguiente comando en la terminal:

$ docker build -t go-api:latest .

Después de construir la imagen, puedes ejecutar la aplicación en un contenedor con el siguiente comando:

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

La aplicación comenzará a ejecutarse dentro del contenedor y podrás acceder a ella en http://localhost:8000. También puedes verificar los contenedores que están en ejecución mediante el comando docker ps.

$ docker ps

Resumen

En esta sección, aprendiste a contenedorizar una aplicación Golang utilizando un Dockerfile. Creaste un Dockerfile de múltiples etapas para construir y ejecutar la aplicación en un contenedor. También aprendiste sobre las mejores prácticas para optimizar el tamaño de la imagen Docker y hacerla más segura.

Información relacionada:

Próximos pasos

En la siguiente sección, aprenderás a usar Docker Compose para conectar y ejecutar múltiples servicios juntos con el fin de monitorear una aplicación Golang con Prometheus y Grafana.