Académique Documents
Professionnel Documents
Culture Documents
Docker V07
Docker V07
2 La conteneurisation
L’image conteneur devient l’unité que nous utilisons pour distribuer nos applications.
2.3.3 Portabilité
Le déploiement est un des points clés à prendre en compte de nos jours. On peut déplacer
les conteneurs d’un environnement à l’autre très rapidement (en réalité c'est encore plus
simple et rapide avec Docker, car il suffit juste de partager des fichiers de config qui sont
en général très légers).
3 Docker
La plateforme Docker est constituée de plusieurs composants que nous utilisons pour
générer, exécuter et gérer nos applications conteneurisées.
L’hôte Docker contient deux objets. L’un représente le moteur Docker et le second les
conteneurs Docker en cours d’exécution. L’objet de l’hôte Docker contient quatre objets :
le serveur Docker, l’API REST Docker, le client Docker et les images conteneur
stockées.
Des flèches montrent la communication entre le serveur Docker, l’API REST et le client
Docker. Ces flèches indiquent la façon dont l’utilisateur communique avec le serveur
Docker via l’API REST.
Des flèches montrent la communication entre le serveur Docker, les conteneurs exécutés
et les images conteneur stockées. Ces flèches indiquent comment le serveur Docker
charge les images conteneur stockées et gère les conteneurs exécutés.
Le client Docker
Le client Docker est une application en ligne de commande nommée docker, qui nous
fournit une interface en ligne de commande pour interagir avec un serveur Docker. La
commande docker utilise l’API REST de Docker pour envoyer des instructions à un
serveur local ou distant, et est l’interface principale que nous utilisons pour gérer nos
conteneurs.
Le serveur Docker
Objets Docker
Vous allez créer et configurer plusieurs objets pour prendre en charge les déploiements
de vos conteneurs. Il s’agit de réseaux, de volumes de stockage, de plug-ins et autres
objets de service. Nous ne couvrirons pas tous ces objets ici, mais il est bon de garder à
l’esprit que ces objets sont des éléments que nous pouvons créer et déployer en fonction
des besoins.
Gardez à l’esprit que vous pouvez créer et utiliser un registre Docker privé ou utiliser une
des nombreuses options de fournisseur cloud disponibles. Par exemple, vous pouvez
utiliser Azure Container Registry pour stocker les conteneurs Docker à utiliser dans
plusieurs services Azure compatibles avec les conteneurs.
4 Éditions Docker
Docker est principalement disponible en deux éditions Community et Enterprise édition. L'édition
communautaire est livrée avec un ensemble gratuit de produits Docker. En revanche, l'édition
entreprise est une plate-forme de conteneur certifiée qui facilite les utilisateurs commerciaux avec
des fonctionnalités complémentaires telles que la sécurité des images, la gestion des images,
l'orchestration et la gestion de l'exécution des conteneurs, mais à un coût raisonnable.
Nous commencerons notre apprentissage avec Community Edition. Les conteneurs Docker
exécutés sur un système d'exploitation particulier partagent le noyau du système d'exploitation
sous-jacent. Cela signifie que nous ne pouvons pas utiliser le noyau Windows (hôte) pour
exécuter des conteneurs Linux ou vice versa. Pour surmonter cela, nous avons Docker Desktop
pour Windows et MAC.
5 Version de Docker
La version de l'édition communautaire Docker Desktop est disponible en deux versions.
Stable : Comme son nom l'indique, Stable Edition est minutieusement testée et peut être
utilisée pour développer des applications plus fiables. Ses versions sont entièrement
synchronisées avec les versions de Docker Engine. Sur le canal stable, il existe une
option pour choisir d'envoyer ou non les statistiques d'utilisation.
Bord : Ces versions comprennent toutes les fonctionnalités nouvelles et expérimentales
du moteur Docker. Il y a plus de chances que des bogues, des plantages et des
problèmes se produisent. Cependant, les utilisateurs auront l'occasion de se familiariser
avec les fonctionnalités à venir.
6 Installer Docker Desktop sur Windows
1. Double-cliquez sur Docker Desktop Installer.exe pour exécuter le programme
d'installation. Si vous n'avez pas encore téléchargé le programme d'installation (Docker
Desktop Installer.exe), vous pouvez l'obtenir à partir de Docker Hub.
2. Lorsque vous y êtes invité, assurez-vous que l'option Activer les fonctionnalités
Windows Hyper-V ou Installer les composants Windows requis pour WSL 2 est
sélectionnée sur la page Configuration.
3. Suivez les instructions de l'assistant d'installation pour autoriser le programme
d'installation et poursuivez l'installation.
4. Une fois l'installation réussie, cliquez sur Fermer pour terminer le processus
d'installation.
5. Si votre compte administrateur est différent de votre compte utilisateur, vous devez
ajouter l'utilisateur au groupe docker-users. Exécutez Gestion de l'ordinateur en tant
qu'administrateur et accédez à Utilisateurs et groupes locaux > Groupes > docker-users.
Cliquez avec le bouton droit pour ajouter l'utilisateur au groupe. Déconnectez-vous et
reconnectez-vous pour que les modifications prennent effet.
Lorsque l'icône de la baleine dans la barre d'état reste fixe, Docker Desktop est opérationnel et
accessible depuis n'importe quelle fenêtre de terminal.
Si l'icône de la baleine est masquée dans la zone Notifications, cliquez sur la flèche vers le haut
de la barre des tâches pour l'afficher. Pour en savoir plus, voir Paramètres Docker.
Une fois l'initialisation terminée, Docker Desktop lance le didacticiel d'intégration. Le didacticiel
comprend un exercice simple pour créer un exemple d'image Docker, l'exécuter en tant que
conteneur, envoyer et enregistrer l'image sur Docker Hub.
8 Exercices
8.1 Récupérer une image Docker existante et la déployer localement
Un bon point de départ pour générer et exécuter vos propres images Docker consiste à
prendre une image existante dans Docker Hub et à l’exécuter localement sur votre
ordinateur.
Comme preuve de concept pour les applications de l’entreprise, vous décidez d’essayer
d’exécuter un exemple d’image à partir de Docker Hub. L’image que vous avez
sélectionnée implémente une application web ASP.NET .NET Core de base. Une fois que
vous avez établi un processus pour le déploiement d’une image Docker, vous pouvez
exécuter une des applications web de votre entreprise à l’aide de Docker.
Dans cet exercice, vous allez tirer une image de Docker Hub et l’exécuter. Vous allez
examiner l’état local de Docker pour mieux comprendre les éléments qui sont déployés.
Enfin, vous allez supprimer le conteneur et l’image de votre ordinateur.
docker ps
docker ps -a
1. Bien que le conteneur se soit arrêté, il est toujours chargé et peut être
redémarré. Supprimez-le en exécutant la commande suivante. Comme
auparavant, remplacez <NAME> par le nom de votre conteneur.
docker ps -a
8.2 Personnaliser une image Docker pour qu’elle exécute votre propre
application web
Application à déployer : Une application web simple qui implémente une API web
pour un site web de réservations d’hôtel. L’API web expose les opérations HTTP
POST et GET qui créent et récupèrent les réservations du client.
Notes : Dans cette version de l’application web, les réservations ne sont pas
réellement conservées et les requêtes retournent des données factices.
Dans cet exercice, vous allez créer un fichier Dockerfile pour une application qui
n’en possède pas. Ensuite, vous allez générer l’image et l’exécuter localement.
2. Accédez au dossier src.
cd mslearn-hotel-reservation-system/src
FROM mcr.microsoft.com/dotnet/core/sdk:2.2
WORKDIR /src
COPY ["HotelReservationSystem/HotelReservationSystem.csproj",
"HotelReservationSystem/"]
COPY
["HotelReservationSystemTypes/HotelReservationSystemTypes.csproj",
"HotelReservationSystemTypes/"]
RUN dotnet restore
"HotelReservationSystem/HotelReservationSystem.csproj"
COPY . .
WORKDIR "/src/HotelReservationSystem"
RUN dotnet build "HotelReservationSystem.csproj" -c Release -o
/app
EXPOSE 80
WORKDIR /app
ENTRYPOINT ["dotnet", "HotelReservationSystem.dll"]
docker ps -a
docker rm reservations
Vous avez créé une image pour votre application web et l’avez exécutée à l’aide
d’un conteneur Docker.
8.3 Conteneuriser une application web Python
Dans ce qui suit, vous allez créer une application Web Python simple exécutée sur Docker.
L'application se composera de deux containers :
- Un container Python pour la page web en Python exécuté sur le Framework Flask
- Un container Redis qui représente un cache Redis pour gérer le compteur d'accès.
Dans cet exemple, redis est le nom d'hôte du conteneur. Nous utilisons le port par défaut
pour Redis, 6379.
3. Créer un fichier requirements.txt et coller dedans:
flask
redis
4. Créer un fichier Dockerfile et coller dedans :
FROM python:3.7-alpine
WORKDIR /code
ENV FLASK_APP=app.py
ENV FLASK_RUN_HOST=0.0.0.0
RUN apk add --no-cache gcc musl-dev linux-headers
COPY requirements.txt requirements.txt
RUN pip install -r requirements.txt
EXPOSE 5000
COPY . .
CMD ["flask", "run"]
Cela indique à Docker de:
FROM redis:alpine
import os
import numpy as np
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.neural_network import MLPClassifier
import pandas as pd
from joblib import dump
from sklearn import preprocessing
def train():
MODEL_DIR = os.environ["MODEL_DIR"]
MODEL_FILE_LDA = os.environ["MODEL_FILE_LDA"]
MODEL_FILE_NN = os.environ["MODEL_FILE_NN"]
MODEL_PATH_LDA = os.path.join(MODEL_DIR, MODEL_FILE_LDA)
MODEL_PATH_NN = os.path.join(MODEL_DIR, MODEL_FILE_NN)
# Models training
# Save model
from joblib import dump
dump(clf_lda, MODEL_PATH_LDA)
# Record model
from joblib import dump, load
dump(clf_NN, MODEL_PATH_NN)
import json
import os
# #############################################################################
# Load directory paths for persisting model and metadata
MODEL_DIR = os.environ["MODEL_DIR"]
MODEL_FILE = os.environ["MODEL_FILE"]
METADATA_FILE = os.environ["METADATA_FILE"]
MODEL_PATH = os.path.join(MODEL_DIR, MODEL_FILE)
METADATA_PATH = os.path.join(MODEL_DIR, METADATA_FILE)
# #############################################################################
# Load and split data
print("Loading data...")
boston = datasets.load_boston()
print("Splitting data...")
X, y = shuffle(boston.data, boston.target, random_state=13)
X = X.astype(np.float32)
offset = int(X.shape[0] * 0.9)
X_train, y_train = X[:offset], y[:offset]
X_test, y_test = X[offset:], y[offset:]
# #############################################################################
# Fit regression model
print("Fitting model...")
params = {'n_estimators': 500, 'max_depth': 4, 'min_samples_split': 2,
'learning_rate': 0.01, 'loss': 'ls'}
clf = ensemble.GradientBoostingRegressor(**params)
clf.fit(X_train, y_train)
train_mse = mean_squared_error(y_train, clf.predict(X_train))
test_mse = mean_squared_error(y_test, clf.predict(X_test))
metadata = {
"train_mean_square_error": train_mse,
"test_mean_square_error": test_mse
}
# #############################################################################
# Serialize model and metadata
print("Serializing model to: {}".format(MODEL_PATH))
dump(clf, MODEL_PATH)
MODEL_DIR = os.environ["MODEL_DIR"]
MODEL_FILE = os.environ["MODEL_FILE"]
METADATA_FILE = os.environ["METADATA_FILE"]
MODEL_PATH = os.path.join(MODEL_DIR, MODEL_FILE)
METADATA_PATH = os.path.join(MODEL_DIR, METADATA_FILE)
def get_data():
"""
Return data for inference.
"""
print("Loading data...")
boston = datasets.load_boston()
X, y = shuffle(boston.data, boston.target, random_state=13)
X = X.astype(np.float32)
offset = int(X.shape[0] * 0.9)
X_train, y_train = X[:offset], y[:offset]
X_test, y_test = X[offset:], y[offset:]
return X_test, y_test
print("Running inference...")
X, y = get_data()
# #############################################################################
# Load model
print("Loading model from: {}".format(MODEL_PATH))
clf = load(MODEL_PATH)
# #############################################################################
# Run inference
print("Scoring observations...")
y_pred = clf.predict(X)
print(y_pred)