Comment personnaliser les images Docker avec Dockerfiles

Comment personnaliser les images Docker avec Dockerfiles

Cet article montre comment personnaliser les images Docker à l'aide d'un fichier de description nommé Dockerfile. Vous verrez comment étendre les images existantes, les personnaliser à vos besoins, ainsi que comment publier l'image résultante à Docker Hub.

Dans ce tutoriel, vous apprendrez:

  • Comment personnaliser une image avec un dockerfile.
  • Comment publier l'image résultante dans Docker Hub.
HTTPS est activé.

Exigences et conventions logicielles utilisées

Exigences logicielles et conventions de ligne de commande Linux
Catégorie Exigences, conventions ou version logicielle utilisée
Système Ubuntu 18.04 castor bionique
Logiciel Docker
Autre Accès privilégié à votre système Linux en tant que racine ou via le Sudo commande.
Conventions # - Exige que les commandes Linux soient exécutées avec des privilèges racine soit directement en tant qu'utilisateur racine, soit par l'utilisation de Sudo commande
$ - Exige que les commandes Linux soient exécutées en tant qu'utilisateur non privilégié régulier

Introduction



Les articles précédents ont présenté des concepts Docker et certaines commandes de base Docker. Dans cet article, vous verrez comment personnaliser et étendre une image Docker existante, décrire les modifications dans un dockerfile et publier l'image à un registre.

Le dockerfile

Dans l'article précédent, vous avez apporté des modifications à un conteneur en cours d'exécution et avez commis les modifications au cache d'image local. Bien qu'il s'agisse d'une ressource utile pour des situations spécifiques, il est recommandé que les personnalisations soient faites de manière plus documentée, afin que l'image puisse être déployée sur d'autres hôtes. Le moyen recommandé est d'écrire un dockerfile.

Le dockerfile est un fichier yaml, qui est un fichier texte avec une syntaxe: les relations sont exprimées à l'aide de l'indentation (espaces) et chaque ligne est composée de paires de clés et de valeur.

Commençons par un simple dockerfile qui installe le package accessoires (Contient les commandes htop et ps) à une image debian.

Créez un nouveau répertoire, entrez et enregistrez le fichier ci-dessous avec le nom Dockerfile (Capital D):

De Debian Run apt-get update && \ apt-get -y installer procps 
Copie

Ce dockerfile indique que l'image de base s'appelle Debian (DEPUIS clause). S'il n'existe pas localement, il sera téléchargé à partir du Docker Hub. Le COURIR la commande exécute apt-get deux fois. Remarquez l'utilisation d'une barre oblique inverse (\) pour briser une ligne et l'utilisation de -y pour sauter l'invite de confirmation de Installation de l'apt-get.

La prochaine étape consiste à construire l'image avec docker.



$ docker build -t mydebian . Envoi du contexte de construction à Docker Daemon 2.048KB Étape 1/2: De Debian ---> be2868bebaba Étape 2/2: Exécutez la mise à jour apt-get && apt-get -y installer procps ---> exécutant en 52A16B346AFC… Suppression du conteneur intermédiaire 52A16B346AFC ---> F21A05A59966 Builty F21A05A59966 Tagged avec succès MyDebian: Dernière 
Copie

Le drapeau -t Mydebian Nommer la nouvelle image. Le point (.) dit à Docker d'utiliser le répertoire actuel pour rechercher un dockerfile. Notez que de nouvelles couches sont créées et supprimées lorsque les lignes du dockerfile sont interprétées.

Il doit y avoir une nouvelle image dans le cache local.

$ docker images référentiel étiquette ID d'image créée taille MyDebian Dernier F21A05A59966 Il y a 8 minutes 119 Mo Debian Dernier BE2868BABA il y a 7 semaines 101 Mo 
Copie

Un conteneur de cette image peut être créé.

$ docker run -it --name MyDebian_Container MyDebian root @ ef9eb174874a: / # ps -ef uid pid ppid c stime tty time cmd root 1 0 0 02:43 pts / 0 00:00:00 Bash Root 9 1 02:43 pts / 0 00:00:00 ps -ef 
Copie

À partir de maintenant, vous pouvez créer des conteneurs exécutant Debian avec le procps package, et les commandes htop et ps sera déjà installé.

Créons maintenant un dockerfile pour faire installer Apache et PHP au moment de la construction d'images, pour atteindre les mêmes objectifs de l'article précédent, lorsque les commandes ont été exécutées à l'intérieur du conteneur.

De Debian Run apt-get update && \ apt-get -y installer procps libapache2-mod-php cmd service apache2 start 
Copie

Nous avons ajouté libapache2-mod-php dans la ligne 3 et un CMD Commande à la ligne 4 pour démarrer Apache. Lorsque le conteneur est démarré, le CMD La commande est exécutée. Il ne peut exister qu'un seul CMD commande par dockerfile. Quand le CMD la commande est spécifiée, il remplace le CMD commande de l'image que vous étendez. Si la CMD La commande est omise, l'une de l'image de base sera exécutée (le cas échéant). Comme vous l'avez peut-être deviné, le dockerfile de l'image de la base Debian a un CMD commande pour exécuter bash. Vous pouvez vérifier cela dans le hub docker.



$ docker run -d --name MyDebian_Container2 -D -P 8000: 80 -v "$ pwd": / var / www / html MyDebian AD325685B738464C49BFF40B65C6824160105AB Noms de ports ad325685b738 MyDebian "/ bin / sh -c 'service…" il y a 11 secondes en haut de 5 secondes 0.0.0.0: 8000-> 80 / TCP MyDebian_Container2 
Copie

Cette fois, nous avons commencé le conteneur en utilisant le -d changer parce que nous voulons qu'il soit détaché du terminal.

Commandes importantes Dockerfile

Le dockerfile a d'autres commandes au-delà DEPUIS, COURIR, et CMD.

Commande Env est utilisé pour définir des variables d'environnement dans l'image, comme http proxy, Par exemple. De nombreuses images utilisent des variables d'environnement pour transmettre des paramètres au nouveau conteneur. Pour des exemples, vérifiez les images de bases de données comme MySQL et PostgreSQL dans Docker Hub.

Commande COPIE copie les fichiers et répertoires de l'hôte à l'image au moment de la construction. Le chemin source (premier argument) est relatif au répertoire actuel.

Commande AJOUTER est similaire à COPIE, Avec la différence que, si la source est un fichier de goudron comprimé, il sera automatiquement décompressé dans le répertoire de destination à l'intérieur de l'image. Sauf pour cette utilisation, Docker recommande l'utilisation du COPIE Commande chaque fois que possible.

Commande EXPOSER indique quels ports de l'image peuvent être exposés par Docker. Pendant la création de conteneurs, ces ports peuvent être mappés pour héberger des ports, si vous le souhaitez.

Commande Travail Définit le répertoire que Docker utilisera lorsque les commandes seront exécutées à l'intérieur du conteneur avec docker.

Création d'une image avec HTTPS activée

Nous allons maintenant étendre l'image PHP APACH officielle pour activer SSL avec un certificat généré automatiquement pour exempter comment utiliser les commandes mentionnées. Dans un nouveau répertoire, créez le dockerfile suivant.



De PHP: 7-APACHE RUN OpenSSL REQ -X509 -NODES -DAYS 365 -NEWKEY RSA: 2048 -Keyout / etc / SSL / Private / SSL-CERT-SNAKEOLOIL.clé -out / etc / ssl / certs / ssl-cersert-sakeoil.pem -subj "/ c = br / st = rio Grande do sul / l = porto alegre / o = security / ou = développement / cn = exemple.com "Exécuter A2enmod réécriture Run A2ensite Default-SSL Run A2enmod SSL Expose 443 Copie ./ html / var / www / html workdir / var / www / html 
Copie

Dans la ligne 3, nous créons un certificat. Lignes 5 - 7 Activer Mod_rewrite et SSL. La ligne 9 expose le port 443 (le port 80 est déjà exposé par l'image en amont). La ligne 11 ajoute le répertoire d'application au conteneur. Enfin, la ligne 13 définit le répertoire de travail en tant que répertoire de travail Apache. Toutes les commandes exécutées par docker utilisera ce répertoire comme base par défaut.

Maintenant, créez un répertoire nommé html et un fichier nommé phpinfo.php avec ce contenu.

 
Copie

Voyons maintenant et exécutons le conteneur.

docker build -t app_image . docker run -d --rm -p 80:80 -p 443: 443 --name app_conntainer app_image 
Copie

Maintenant, vous pouvez accéder phpinfo.php script via les deux, HTTP et HTTPS.

http: // localhost / phpinfo.php https: // localhost / phpinfo.php 
Copie HTTPS est activé.

Dans HTTPS, le navigateur se plaindra de la sécurité du certificat car cela est auto-signé, mais l'avertissement peut être ignoré.

Publier des images au Docker Hub



Les images créées n'existent que localement, dans le cache local de Docker. Vous voudrez peut-être les partager avec d'autres hôtes Docker, ou avec des coéquipiers, ou même les rendre publics au monde. En tout cas, vous souhaitez publier vos images dans un registre Docker. Ils peuvent être publiés dans un registre basé sur le cloud, comme le Docker Hub qui, soit dit en passant, est la valeur par défaut si vous ne spécifiez pas explicitement le registre. Créez d'abord un ID Docker gratuit, puis connectez-vous:

$ Docker Connexion Connexion avec votre identifiant Docker pour pousser et extraire des images de Docker Hub. Si vous n'avez pas d'identifiant Docker, rendez-vous sur https: // hub.docker.com pour en créer un. Nom d'utilisateur: Mot de passe infroger: Connexion a réussi 
Copie

Ensuite, marquez l'image avec le nom du référentiel (Infroger), le nom de l'image et la balise (version d'image).

$ docker tag app_image infroger / app_image: 1 $ docker images balise id d'image ID créé taille infroger / app_image 1 c093151fc68f il y a 14 heures 381Mb app3_image Dernier C093151fc68f il y a 14 heures 381MB 
Copie

Puis pousser l'image vers le référentiel.

$ docker push infroger / app_image: 1 Le push fait référence au référentiel [docker.io/infroger/app_image] 27f7f2b01c49: Pushed 81b08cd5fe07: Pushed d1c23d198f84: Pushed e66392ad9b85: Pushed a71f63e3a00f: Pushed 9c58778f21dd: Pushed 973719bed9b7: Pushed 8f5090ef2ac0: Pushed fbdafdbe3319: Pushed a5c4801ecf39: Pushed e9ba112d38b9: Pushed 25ba5230dadf: Pushed f2907ce42b47: Pushed e31bf34cfab9: Pushed 9066d03e98e0: Poussé 96DB4CE698AD: poussé ABAE6A338E5C: Poussé 4572A80A7A5E: PUSSED EF68F6734AA4: Poussé 1: Digest: SHA256: 2E7E53FCDF800AD0C4837CD70014170CC869D36DE5C301F2E2EC 
Copie

Allez maintenant sur Docker Hub et vérifiez que l'image est là:



https: // hub.docker.com / r / infroger / app_image 

Dans Docker Hub avec inscription gratuite, vous pouvez avoir un référentiel privé, avec des référentiels publics illimités. Sinon, vous voudrez peut-être exécuter votre propre registre Docker, ce qui peut être fait avec une commande:

docker run -d -p 5000: 5000 --restart = toujours - Name Registry Registry: 2 

L'avantage d'avoir un registre privé est la confidentialité. Mais vous avez le fardeau pour gérer la sécurité, la haute disponibilité, les exigences de stockage, le contrôle d'accès, etc.

Conclusion

Dans cet article, nous avons couvert comment étendre les images existantes et les personnaliser à vos besoins en utilisant un dockerfile. Nous avons également vu comment publier les images dans un registre Docker. Vous pouvez faire beaucoup jusqu'à présent, mais nous gratterons le monde Docker. Dans le prochain article, nous verrons une forme très simple d'orchestration locale de conteneurs avec Docker Compose.

Plus dans cette série d'articles Docker

  • Une introduction pratique aux conteneurs Docker
  • Comment interagir avec les conteneurs Docker

Tutoriels Linux connexes:

  • Choses à installer sur Ubuntu 20.04
  • Choses à faire après l'installation d'Ubuntu 20.04 Focal Fossa Linux
  • Une introduction à l'automatisation Linux, des outils et des techniques
  • Choses à faire après l'installation d'Ubuntu 22.04 Jammy Jellyfish…
  • Fichiers de configuration Linux: 30 premiers
  • Choses à installer sur Ubuntu 22.04
  • Mint 20: Mieux que Ubuntu et Microsoft Windows?
  • Comment monter l'image ISO sur Linux
  • Comment doubler Kali Linux et Windows 10
  • Ubuntu 20.04 Guide