Comment utiliser la commande docker init pour containeriser une application Go

DockerDockerBeginner
Pratiquer maintenant

💡 Ce tutoriel est traduit par l'IA à partir de la version anglaise. Pour voir la version originale, vous pouvez cliquer ici

Introduction

Dans ce laboratoire, vous apprendrez à containeriser une application Go en utilisant la commande docker init. Le laboratoire commence par la vérification de l'installation correcte de Docker Desktop sur la machine virtuelle LabEx, y compris la vérification de la version de Docker et l'exécution du conteneur hello-world pour s'assurer que Docker fonctionne comme prévu.

Les étapes suivantes consistent à initialiser un projet Go avec docker init, à personnaliser le Dockerfile et le fichier Compose générés spécifiquement pour une application Go, et enfin, à construire et exécuter l'application Go en utilisant Docker Compose. Cette expérience pratique vous permettra d'acquérir les compétences nécessaires pour containeriser efficacement les applications Go en utilisant les outils Docker modernes.


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{{"Comment utiliser la commande docker init pour containeriser une application Go"}} docker/logs -.-> lab-555164{{"Comment utiliser la commande docker init pour containeriser une application Go"}} docker/create -.-> lab-555164{{"Comment utiliser la commande docker init pour containeriser une application Go"}} docker/pull -.-> lab-555164{{"Comment utiliser la commande docker init pour containeriser une application Go"}} docker/version -.-> lab-555164{{"Comment utiliser la commande docker init pour containeriser une application Go"}} docker/build -.-> lab-555164{{"Comment utiliser la commande docker init pour containeriser une application Go"}} end

Installer Docker Desktop et vérifier Docker Init

Dans cette étape, nous allons vérifier que Docker est correctement installé sur la machine virtuelle LabEx. La machine virtuelle LabEx est préinstallée avec Docker Engine, nous allons donc vérifier la version de Docker et exécuter un simple conteneur "hello-world" pour nous assurer que tout fonctionne comme prévu.

Tout d'abord, vérifions la version de Docker. Ouvrez un terminal dans la machine virtuelle LabEx. Vous pouvez trouver l'icône du terminal sur le bureau ou dans le menu des applications.

Exécutez la commande suivante dans le terminal :

docker --version

Cette commande affichera la version de Docker installée sur le système. Vous devriez voir une sortie similaire à :

Docker version 20.10.21, build xxxxxxx

Si vous voyez la version de Docker, cela signifie que Docker est correctement installé. Si vous rencontrez une erreur, veuillez contacter le support.

Ensuite, exécutons le conteneur "hello-world". C'est un simple conteneur qui affiche un message dans la console puis se termine.

Exécutez la commande suivante dans le terminal :

docker run hello-world

Avant d'exécuter la commande, vous devez télécharger l'image hello-world depuis Docker Hub. Docker Hub est un registre public pour les images Docker.

Exécutez la commande suivante pour télécharger l'image :

docker pull hello-world

Cette commande télécharge l'image hello-world depuis Docker Hub sur votre machine locale. Vous devriez voir une sortie similaire à :

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

Maintenant, exécutez à nouveau la commande docker run hello-world :

docker run hello-world

Cette commande exécutera le conteneur hello-world. Vous devriez voir une sortie similaire à :

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/

Ce message indique que Docker fonctionne correctement et que vous avez exécuté avec succès votre premier conteneur !

Initialiser un projet Go avec Docker Init

Dans cette étape, nous allons initialiser un nouveau projet Go et utiliser docker init pour générer les fichiers Dockerfile et docker-compose.yml nécessaires. Cela fournira un point de départ pour containeriser notre application Go.

Tout d'abord, créons un nouveau répertoire pour notre projet Go. Ouvrez un terminal dans la machine virtuelle LabEx et exécutez les commandes suivantes :

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

Ces commandes créent un nouveau répertoire nommé my-go-app dans le répertoire ~/project, puis changent le répertoire actuel pour my-go-app.

Ensuite, nous devons initialiser un module Go. Cela créera un fichier go.mod qui suivra les dépendances de notre projet.

Exécutez la commande suivante dans le terminal :

go mod init my-go-app

Cette commande initialise un nouveau module Go nommé my-go-app. Vous devriez voir une sortie similaire à :

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

Maintenant, créons une simple application Go. Créez un nouveau fichier nommé main.go dans le répertoire my-go-app en utilisant l'éditeur nano :

nano main.go

Ajoutez le code suivant au fichier main.go :

package main

import "fmt"

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

Il s'agit d'un simple programme Go qui affiche "Hello, Docker!" dans la console.

Enregistrez le fichier et quittez l'éditeur nano en appuyant sur Ctrl+X, puis Y, puis Entrée.

Maintenant, nous allons utiliser docker init pour générer les fichiers Dockerfile et docker-compose.yml. Cependant, la machine virtuelle LabEx n'a pas Docker Compose installé par défaut. Nous devons l'installer d'abord.

Téléchargez la dernière version de Docker Compose en utilisant 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

Rendez le binaire Docker Compose exécutable :

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

Vérifiez l'installation en vérifiant la version de Docker Compose :

docker-compose --version

Vous devriez voir une sortie similaire à :

docker-compose version 1.29.2, build xxxxxxx

Maintenant que Docker Compose est installé, nous pouvons procéder avec docker init.

Exécutez la commande suivante dans le terminal :

docker init

docker init posera une série de questions pour configurer les fichiers Dockerfile et docker-compose.yml. Voici les réponses recommandées pour ce laboratoire :

  • What do you want to call this application? my-go-app
  • What port is this app listening on? 3000 (C'est un placeholder, nous n'utiliserons pas réellement de port dans cet exemple simple)
  • What is the main file to execute? main.go
  • Would you like to include the Docker Compose configuration? Yes
  • Please choose a Docker Compose version: 2.0

Après avoir répondu à ces questions, docker init générera un fichier Dockerfile et un fichier docker-compose.yml dans le répertoire my-go-app.

Vous pouvez afficher le contenu des fichiers générés en utilisant la commande cat :

cat Dockerfile
cat docker-compose.yml

Ces fichiers fournissent une configuration de base pour construire et exécuter notre application Go dans un conteneur Docker. Dans l'étape suivante, nous personnaliserons ces fichiers pour mieux répondre à nos besoins.

Personnaliser le Dockerfile et le fichier Compose générés pour Go

Dans cette étape, nous allons personnaliser les fichiers Dockerfile et docker-compose.yml générés à l'étape précédente. Nous allons optimiser le Dockerfile pour la construction de notre application Go et configurer le fichier docker-compose.yml pour exécuter notre application.

Tout d'abord, examinons le Dockerfile généré. Ouvrez le Dockerfile dans le répertoire my-go-app en utilisant l'éditeur nano :

nano Dockerfile

Le Dockerfile généré peut ressembler à ceci :

## 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"]

Ce Dockerfile utilise une construction multi-étapes. La première étape (builder) utilise l'image golang:latest pour construire l'application Go. La deuxième étape utilise l'image alpine:latest pour exécuter l'application.

Modifions le Dockerfile pour utiliser une version spécifique de Go et optimiser le processus de construction. Remplacez le contenu du Dockerfile par le suivant :

## 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"]

Nous avons changé l'image de base pour l'étape de construction en golang:1.17. Cela garantit que nous utilisons une version spécifique de Go pour construire notre application.

Enregistrez le fichier et quittez l'éditeur nano.

Maintenant, examinons le fichier docker-compose.yml généré. Ouvrez le fichier docker-compose.yml dans le répertoire my-go-app en utilisant l'éditeur nano :

nano docker-compose.yml

Le fichier docker-compose.yml généré peut ressembler à ceci :

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

Ce fichier docker-compose.yml définit un seul service nommé my-go-app. Il spécifie que le service doit être construit à partir du répertoire actuel (.) et que le port 3000 doit être exposé.

Comme notre application n'écoute pas réellement sur un port, nous pouvons supprimer la section ports. Modifiez le fichier docker-compose.yml comme suit :

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

Enregistrez le fichier et quittez l'éditeur nano.

Dans cette étape, nous avons personnalisé les fichiers Dockerfile et docker-compose.yml pour mieux répondre à nos besoins. Dans l'étape suivante, nous allons construire et exécuter notre application Go en utilisant Docker Compose.

Construire et exécuter l'application Go avec Docker Compose

Dans cette étape, nous allons construire et exécuter notre application Go en utilisant Docker Compose. Docker Compose simplifie le processus de construction et d'exécution d'applications multi-conteneurs. Dans notre cas, nous n'avons qu'un seul conteneur, mais Docker Compose offre toujours un moyen pratique de gérer le processus de construction et d'exécution.

Tout d'abord, accédez au répertoire my-go-app dans le terminal :

cd ~/project/my-go-app

Pour construire l'image Docker de notre application, exécutez la commande suivante :

docker-compose build

Cette commande construira l'image Docker en fonction du Dockerfile dans le répertoire actuel. Vous devriez voir une sortie similaire à :

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

Cette sortie indique que l'image Docker a été construite avec succès.

Maintenant, pour exécuter l'application, exécutez la commande suivante :

docker-compose up

Cette commande démarrera le conteneur défini dans le fichier docker-compose.yml. Vous devriez voir une sortie similaire à :

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

Cette sortie montre que notre application Go a été exécutée et a affiché "Hello, Docker!" dans la console. Le conteneur a ensuite quitté avec le code 0, indiquant une exécution réussie.

Pour arrêter le conteneur, appuyez sur Ctrl+C dans le terminal.

Vous pouvez également exécuter le conteneur en mode détaché en ajoutant le flag -d à la commande docker-compose up :

docker-compose up -d

Cela démarrera le conteneur en arrière-plan. Pour afficher les journaux du conteneur, exécutez la commande suivante :

docker logs my-go-app_my-go-app_1

Pour arrêter le conteneur en mode détaché, exécutez la commande suivante :

docker-compose down

Cette commande arrêtera et supprimera le conteneur.

Dans cette étape, nous avons réussi à construire et exécuter notre application Go en utilisant Docker Compose. Cela démontre comment Docker Compose peut simplifier le processus de gestion d'applications containerisées.

Résumé

Dans ce laboratoire, nous avons commencé par vérifier que Docker Desktop était correctement installé sur la machine virtuelle (VM) LabEx. Cela a consisté à vérifier la version de Docker en utilisant la commande docker --version et à confirmer son installation correcte. Nous avons ensuite téléchargé l'image hello-world depuis Docker Hub en utilisant la commande docker pull hello-world, puis exécuté le conteneur avec docker run hello-world pour nous assurer que Docker fonctionnait comme prévu, affichant un message de confirmation dans la console.

Cette première étape a permis d'établir un environnement Docker fonctionnel, posant les bases pour les étapes suivantes impliquant l'utilisation de docker init pour containeriser une application Go.