Comment personnaliser les images Docker avec Dockerfiles
- 1684
- 156
- Anaïs Charles
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.
Exigences et conventions logicielles utilisées
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
- « Comment installer le serveur VNC sur RHEL 8 / CENTOS 8
- Comment installer Apache Tomcat sur Linux Rhel 8 / Centos 8 »