Cómo usar el comando docker init para contenerizar una aplicación de Go

DockerDockerBeginner
Practicar Ahora

💡 Este tutorial está traducido por IA desde la versión en inglés. Para ver la versión original, puedes hacer clic aquí

Introducción

En este laboratorio, aprenderá cómo contenerizar una aplicación de Go utilizando el comando docker init. El laboratorio comienza verificando la correcta instalación de Docker Desktop en la máquina virtual (VM) de LabEx, incluyendo la comprobación de la versión de Docker y la ejecución del contenedor hello-world para asegurarse de que Docker funcione como se espera.

Los pasos subsiguientes implican inicializar un proyecto de Go con docker init, personalizar el archivo Dockerfile y el archivo Compose generados específicamente para una aplicación de Go, y finalmente, construir y ejecutar la aplicación de Go utilizando Docker Compose. Esta experiencia práctica le proporcionará las habilidades necesarias para contenerizar eficazmente aplicaciones de Go utilizando las herramientas modernas de Docker.


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("Docker")) -.-> docker/ContainerOperationsGroup(["Container Operations"]) docker(("Docker")) -.-> docker/ImageOperationsGroup(["Image Operations"]) docker(("Docker")) -.-> docker/SystemManagementGroup(["System Management"]) docker(("Docker")) -.-> docker/DockerfileGroup(["Dockerfile"]) docker/ContainerOperationsGroup -.-> docker/run("Run a Container") docker/ContainerOperationsGroup -.-> docker/logs("View Container Logs") docker/ContainerOperationsGroup -.-> docker/create("Create Container") docker/ImageOperationsGroup -.-> docker/pull("Pull Image from Repository") docker/SystemManagementGroup -.-> docker/version("Show Docker Version") docker/DockerfileGroup -.-> docker/build("Build Image from Dockerfile") subgraph Lab Skills docker/run -.-> lab-555164{{"Cómo usar el comando docker init para contenerizar una aplicación de Go"}} docker/logs -.-> lab-555164{{"Cómo usar el comando docker init para contenerizar una aplicación de Go"}} docker/create -.-> lab-555164{{"Cómo usar el comando docker init para contenerizar una aplicación de Go"}} docker/pull -.-> lab-555164{{"Cómo usar el comando docker init para contenerizar una aplicación de Go"}} docker/version -.-> lab-555164{{"Cómo usar el comando docker init para contenerizar una aplicación de Go"}} docker/build -.-> lab-555164{{"Cómo usar el comando docker init para contenerizar una aplicación de Go"}} end

Instalar Docker Desktop y Verificar Docker Init

En este paso, verificaremos que Docker esté instalado correctamente en la máquina virtual (VM) de LabEx. La VM de LabEx viene preinstalada con Docker Engine, por lo que verificaremos la versión de Docker y ejecutaremos un simple contenedor "hello-world" para asegurarnos de que todo funcione como se espera.

Primero, veamos cómo comprobar la versión de Docker. Abra una terminal en la VM de LabEx. Puede encontrar el icono de la terminal en el escritorio o en el menú de aplicaciones.

Ejecute el siguiente comando en la terminal:

docker --version

Este comando mostrará la versión de Docker instalada en el sistema. Debería ver una salida similar a:

Docker version 20.10.21, build xxxxxxx

Si ve la versión de Docker, significa que Docker está instalado correctamente. Si encuentra un error, póngase en contacto con el soporte.

A continuación, ejecutemos el contenedor "hello-world". Este es un contenedor simple que imprime un mensaje en la consola y luego se cierra.

Ejecute el siguiente comando en la terminal:

docker run hello-world

Antes de ejecutar el comando, debe descargar la imagen hello-world de Docker Hub. Docker Hub es un registro público de imágenes de Docker.

Ejecute el siguiente comando para descargar la imagen:

docker pull hello-world

Este comando descarga la imagen hello-world de Docker Hub a su máquina local. Debería ver una salida similar a:

Using default tag: latest
latest: Pulling from library/hello-world
...
Digest: sha256:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Status: Downloaded newer image for hello-world:latest
docker.io/library/hello-world:latest

Ahora, ejecute el comando docker run hello-world de nuevo:

docker run hello-world

Este comando ejecutará el contenedor hello-world. Debería ver una salida similar a:

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Este mensaje indica que Docker está funcionando correctamente y que ha ejecutado con éxito su primer contenedor.

Inicializar un proyecto de Go con Docker Init

En este paso, inicializaremos un nuevo proyecto de Go y usaremos docker init para generar los archivos Dockerfile y docker-compose.yml necesarios. Esto proporcionará un punto de partida para contenerizar nuestra aplicación de Go.

Primero, creemos un nuevo directorio para nuestro proyecto de Go. Abra una terminal en la máquina virtual (VM) de LabEx y ejecute los siguientes comandos:

mkdir my-go-app
cd my-go-app

Estos comandos crean un nuevo directorio llamado my-go-app en el directorio ~/project y luego cambian el directorio actual a my-go-app.

A continuación, necesitamos inicializar un módulo de Go. Esto creará un archivo go.mod que realiza un seguimiento de las dependencias de nuestro proyecto.

Ejecute el siguiente comando en la terminal:

go mod init my-go-app

Este comando inicializa un nuevo módulo de Go llamado my-go-app. Debería ver una salida similar a:

go: creating new go.mod: module my-go-app
go: to add module requirements and sums:
        go mod tidy

Ahora, creemos una simple aplicación de Go. Cree un nuevo archivo llamado main.go en el directorio my-go-app utilizando el editor nano:

nano main.go

Agregue el siguiente código al archivo main.go:

package main

import "fmt"

func main() {
	fmt.Println("Hello, Docker!")
}

Este es un simple programa de Go que imprime "Hello, Docker!" en la consola.

Guarde el archivo y salga del editor nano presionando Ctrl+X, luego Y y luego Enter.

Ahora, usaremos docker init para generar los archivos Dockerfile y docker-compose.yml. Sin embargo, la VM de LabEx no tiene Docker Compose instalado por defecto. Primero debemos instalarlo.

Descargue la última versión de Docker Compose utilizando curl:

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

Haga que el binario de Docker Compose sea ejecutable:

sudo chmod +x /usr/local/bin/docker-compose

Verifique la instalación comprobando la versión de Docker Compose:

docker-compose --version

Debería ver una salida similar a:

docker-compose version 1.29.2, build xxxxxxx

Ahora que Docker Compose está instalado, podemos continuar con docker init.

Ejecute el siguiente comando en la terminal:

docker init

docker init hará una serie de preguntas para configurar los archivos Dockerfile y docker-compose.yml. Aquí están las respuestas recomendadas para este laboratorio:

  • ¿Cómo desea llamar a esta aplicación? my-go-app
  • ¿En qué puerto está escuchando esta aplicación? 3000 (Este es un marcador de posición, en este simple ejemplo no usaremos realmente un puerto)
  • ¿Cuál es el archivo principal a ejecutar? main.go
  • ¿Desea incluir la configuración de Docker Compose? Yes
  • Por favor, elija una versión de Docker Compose: 2.0

Después de responder estas preguntas, docker init generará un archivo Dockerfile y un archivo docker-compose.yml en el directorio my-go-app.

Puede ver el contenido de los archivos generados utilizando el comando cat:

cat Dockerfile
cat docker-compose.yml

Estos archivos proporcionan una configuración básica para construir y ejecutar nuestra aplicación de Go en un contenedor de Docker. En el siguiente paso, personalizaremos estos archivos para adaptarlos mejor a nuestras necesidades.

Personalizar el Dockerfile y el archivo Compose generados para Go

En este paso, personalizaremos los archivos Dockerfile y docker-compose.yml generados en el paso anterior. Optimizaremos el Dockerfile para construir nuestra aplicación de Go y configuraremos el archivo docker-compose.yml para ejecutar nuestra aplicación.

Primero, examinemos el Dockerfile generado. Abra el Dockerfile en el directorio my-go-app utilizando el editor nano:

nano Dockerfile

El Dockerfile generado podría verse algo así:

## syntax=docker/dockerfile:1

FROM golang:latest AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o my-go-app

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/my-go-app .

EXPOSE 3000

CMD ["./my-go-app"]

Este Dockerfile utiliza una construcción de múltiples etapas. La primera etapa (builder) utiliza la imagen golang:latest para construir la aplicación de Go. La segunda etapa utiliza la imagen alpine:latest para ejecutar la aplicación.

Modifiquemos el Dockerfile para utilizar una versión específica de Go y optimizar el proceso de construcción. Reemplace el contenido del Dockerfile con lo siguiente:

## syntax=docker/dockerfile:1

FROM golang:1.17 AS builder

WORKDIR /app

COPY go.mod go.sum ./
RUN go mod download && go mod verify

COPY . .

RUN go build -o my-go-app

FROM alpine:latest

WORKDIR /app

COPY --from=builder /app/my-go-app .

CMD ["./my-go-app"]

Hemos cambiado la imagen base para la etapa de construcción a golang:1.17. Esto asegura que estemos utilizando una versión específica de Go para construir nuestra aplicación.

Guarde el archivo y salga del editor nano.

Ahora, examinemos el archivo docker-compose.yml generado. Abra el archivo docker-compose.yml en el directorio my-go-app utilizando el editor nano:

nano docker-compose.yml

El archivo docker-compose.yml generado podría verse algo así:

version: "3.9"
services:
  my-go-app:
    build: .
    ports:
      - "3000:3000"

Este archivo docker-compose.yml define un solo servicio llamado my-go-app. Especifica que el servicio debe construirse desde el directorio actual (.) y que el puerto 3000 debe exponerse.

Dado que nuestra aplicación en realidad no escucha en un puerto, podemos eliminar la sección ports. Modifique el archivo docker-compose.yml para que quede así:

version: "3.9"
services:
  my-go-app:
    build: .

Guarde el archivo y salga del editor nano.

En este paso, hemos personalizado los archivos Dockerfile y docker-compose.yml para adaptarlos mejor a nuestras necesidades. En el siguiente paso, construiremos y ejecutaremos nuestra aplicación de Go utilizando Docker Compose.

Construir y ejecutar la aplicación de Go con Docker Compose

En este paso, construiremos y ejecutaremos nuestra aplicación de Go utilizando Docker Compose. Docker Compose simplifica el proceso de construcción y ejecución de aplicaciones de múltiples contenedores. En nuestro caso, solo tenemos un contenedor, pero Docker Compose sigue proporcionando una forma conveniente de gestionar el proceso de construcción y ejecución.

Primero, navegue al directorio my-go-app en la terminal:

cd ~/project/my-go-app

Para construir la imagen de Docker para nuestra aplicación, ejecute el siguiente comando:

docker-compose build

Este comando construirá la imagen de Docker basada en el Dockerfile en el directorio actual. Debería ver una salida similar a:

Building my-go-app
Sending build context to Docker daemon  3.072kB
Step 1/6 : FROM golang:1.17 AS builder
 ---> xxxxxxxxxxxxxxxx
Step 2/6 : WORKDIR /app
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 3/6 : COPY go.mod go.sum ./
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 4/6 : RUN go mod download && go mod verify
 ---> Using cache
 ---> xxxxxxxxxxxxxxxx
Step 5/6 : COPY . .
 ---> xxxxxxxxxxxxxxxx
Step 6/6 : RUN go build -o my-go-app
 ---> Running in xxxxxxxxxx
Removing intermediate container xxxxxxxxxx
 ---> xxxxxxxxxxxxxxxx
Successfully built xxxxxxxxxxxxxxxx
Successfully tagged my-go-app_my-go-app:latest

Esta salida indica que la imagen de Docker se ha construido con éxito.

Ahora, para ejecutar la aplicación, ejecute el siguiente comando:

docker-compose up

Este comando iniciará el contenedor definido en el archivo docker-compose.yml. Debería ver una salida similar a:

Starting my-go-app_my-go-app_1 ... done
Attaching to my-go-app_my-go-app_1
my-go-app_1  | Hello, Docker!
my-go-app_my-go-app_1 exited with code 0

Esta salida muestra que nuestra aplicación de Go se ha ejecutado y ha impreso "Hello, Docker!" en la consola. Luego, el contenedor salió con código 0, lo que indica una ejecución exitosa.

Para detener el contenedor, presione Ctrl+C en la terminal.

También puede ejecutar el contenedor en modo desatendido agregando la bandera -d al comando docker-compose up:

docker-compose up -d

Esto iniciará el contenedor en segundo plano. Para ver los registros del contenedor, ejecute el siguiente comando:

docker logs my-go-app_my-go-app_1

Para detener el contenedor que se está ejecutando en modo desatendido, ejecute el siguiente comando:

docker-compose down

Este comando detendrá y eliminará el contenedor.

En este paso, hemos construido y ejecutado con éxito nuestra aplicación de Go utilizando Docker Compose. Esto demuestra cómo Docker Compose puede simplificar el proceso de gestión de aplicaciones contenerizadas.

Resumen

En este laboratorio, comenzamos verificando la instalación exitosa de Docker Desktop en la máquina virtual (VM) de LabEx. Esto implicó comprobar la versión de Docker utilizando el comando docker --version y confirmar su correcta instalación. Luego, procedimos a descargar la imagen hello-world desde Docker Hub utilizando docker pull hello-world y, posteriormente, ejecutamos el contenedor con docker run hello-world para asegurarnos de que Docker estaba funcionando como se esperaba, imprimiendo un mensaje de confirmación en la consola.

Este primer paso estableció un entorno de Docker funcional, sentando las bases para los pasos posteriores que involucran el uso de docker init para contenerizar una aplicación de Go.