[Docker] Comment créer lorsque le code source est monté en liaison sur le conteneur

introduction

supposition

Je n'aborderai pas les opérations de base de Docker. Il est supposé que le code source de l'application est monté dans le conteneur et développé à l'aide du montage de liaison.

information sur la version

Docker Engine: 19.03.13

Écoulement brutal

  1. Première conclusion
  2. Qu'est-ce qu'une monture Bind?
  3. Vérifiez la méthode de construction étape par étape
  4. Bonus
  5. Impressions

Objectif de cet article

Comprenez les caractéristiques du montage de liaison et vous serez en mesure de créer et de créer une image de la source entière de l'application.


Première conclusion

C'est une technique courante pour monter en liaison le code source sur un conteneur pendant le développement, mais il est nécessaire de concevoir un moyen de créer une image comprenant le code source lors du déploiement. La méthode est assez simple à battre, mais vous pouvez préparer un Dockerfile séparé pour la construction et explicitement COPY la source. (J'étais en train de faire des recherches moi-même et je me suis demandé: "Est-ce vraiment une histoire si simple ...?")


Qu'est-ce qu'une monture bind?

Il existe trois principaux types de montage de volume qui peuvent être utilisés avec Docker. Pour expliquer complètement chaque différence

--Le volume --Monter sur la zone gérée par Docker --Plusieurs conteneurs peuvent être partagés --Lier le montage --Monter sur le chemin sur l'hôte

image.png

Le volume et le montage de liaison ont également les caractéristiques suivantes: Extrait de Official Storage Overview

Conseils d'utilisation des montages et des volumes de liaison Lorsque vous utilisez un montage de liaison ou un volume, gardez à l'esprit les points suivants:

Si vous essayez de monter un volume vide sur un répertoire à l'intérieur d'un conteneur et qu'un fichier ou répertoire existe dans ce répertoire, ce fichier ou répertoire sera copié dans le volume. Si le volume spécifié n'existe pas déjà au démarrage du conteneur, un volume vide sera créé. Il est utilisé comme une méthode pour fournir des données à l'avance à la demande du conteneur.

Si vous essayez de lier le montage ou de monter un volume non vide sur un répertoire à l'intérieur d'un conteneur et que le fichier ou répertoire existe dans ce répertoire, le montage masquera ce fichier ou répertoire. C'est la même chose que, par exemple, enregistrer un fichier dans / mnt sur une machine Linux, puis monter une clé USB sur / mnt. Ce qui se trouvait dans / mnt est masqué par le contenu de la clé USB et continue jusqu'à ce que la clé USB soit démontée. Les fichiers cachés ne sont ni supprimés ni modifiés. Cependant, il n'est pas accessible à moins que le montage ou le volume de liaison ne soit démonté.


Vérifiez la méthode de construction étape par étape

situation

On suppose que le conteneur Nginx est simplement construit et que le code source est monté sur le conteneur pour le développement. L'exemple de structure de répertoire et Dockerfile sont présentés ci-dessous.

Structure du répertoire


project-directory/
  └html/
    └index.html
  └Dockerfile

Dockerfile


FROM nginx
COPY ./html /usr/share/nginx/html
EXPOSE 80

index.html


<!DOCTYPE html>
<head>
<title>ContainerA</title>
</head>
<body>
    <h1>ContainerA!</h1>
</body>

Créez un conteneur Nginx monté en liaison avec le code source avec la commande suivante


docker run --name containerA --mount type=bind,source=(pwd)/html,target=/usr/share/nginx/html -d -p 81:80 nginx

image.png

Explication de la commande

Créez un conteneur avec les options suivantes basé sur image nginx du référentiel officiel DockerHub

--Spécifiez le nom du conteneur avec --name

Allez sur http: // localhost: 81 et essayez d'afficher l'écran

L'écran suivant est affiché image.png

Ajoutez un libellé et assurez-vous qu'il est reflété dans le conteneur

index.html


<!DOCTYPE html>
~réduction~
<body>
    <h1>ContainerA!</h1>
    <p>Add message at Host.</p>
</body>

Lorsque vous le chargez à nouveau, le libellé ajouté s'affiche. Cela a également confirmé que l'hôte et le conteneur étaient montés en toute sécurité.

image.png

Construisez Dockerfile et image chaque source


docker build -t build_with_bind_data ./

Vérifiez l'image construite

docker image ls

L'image build_with_bind_data est construite comme indiqué ci-dessous

image.png

Créez un conteneur basé sur l'image construite et vérifiez si la source est également incluse


docker run --name containerB -d -p 82:80 build_with_bind_data

image.png

Lorsque vous accédez à http: // localhost: 82 J'ai pu confirmer que c'était exactement la même chose que ce qui était affiché sur Contaier A. image.png

Pour le moment, si vous vérifiez également la source à l'intérieur du conteneurB


docker exec containerB bash -c "cat /usr/share/nginx/html/index.html"

Au moment de la construction, vous pouvez voir que le répertoire / fichier spécifié a été copié par la commande COPY. image.png

prime

Le conteneur peut être imagé avec la commande COMMIT, mais les données de montage du volume ne sont pas incluses.

Je veux solidifier l'image avec la commande COMMIT, mais ce n'est qu'une image des paramètres et des modifications à l'intérieur du conteneur, et le volume a été monté [^ 1] sur le conteneur __. Notez que les données ne sont pas incluses dans l'image créée par le commit __ </ font>. Par conséquent, il est nécessaire de placer le code source de l'application avec la commande COPY au moment de la construction.

[^ 1]: Le type de montage est soit volume / bind mount / tmpfs mount.


Impressions

Peut-être que le contenu est rudimentaire. En tant qu'expérience d'utilisation de Docker jusqu'à présent, je n'avais aucune chance de créer et de gérer des images, j'ai donc eu du mal parce que je ne connaissais pas la méthode d'imagerie spécifique, y compris la source. Je n'ai pas remarqué les caractéristiques de la commande COMMIT, et j'ai été surpris par le vent," Pourquoi le commit n'inclut-il pas la source!? " Cependant, j'ai lu attentivement le commentaire officiel et approfondi ma compréhension, alors je l'ai laissé dans l'article pour ne pas l'oublier.

Recommended Posts

[Docker] Comment créer lorsque le code source est monté en liaison sur le conteneur
Comment vérifier le journal dans le conteneur Docker
[Java] Mémo sur la façon d'écrire la source
[IntelliJ IDEA] Comment formater uniquement les modifications locales lors de l'enregistrement du code source
Lors de la lecture du code source
L'heure ne va pas avec l'application lancée sur le conteneur Docker
[Docker] Comment accéder à l'hôte depuis l'intérieur du conteneur. http: //host.docker.internal:
Solution lorsque la connexion à la base de données n'est pas possible avec un nouveau conteneur car le port est affecté au conteneur docker existant
Comment créer un serveur Jenkins avec un conteneur Docker sur CentOS 7 de VirtualBox et accéder au serveur Jenkins à partir d'un PC local
Comment créer CloudStack à l'aide de Docker
Lorsque l'accès demandé à la ressource est refusé lors de la transmission avec Docker
Installez Ubuntu20.04 sur RaspberryPi 4 et compilez Kubernetes pour exécuter le conteneur
Comment le site Web s'affiche à l'écran
La construction du conteneur Docker ne parvient pas à installer php-radis
Créer un environnement de lecture de code Redmine sur Docker
Comment créer un environnement Rails 6 avec Docker
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 6.x)
Comment créer un environnement de développement Ruby on Rails avec Docker (Rails 5.x)
Pg_resetwal peut être utilisé pour démarrer le conteneur Docker PostgreSQL lorsque WAL est cassé et ne peut pas être démarré.
Lorsque j'ai poussé vers Docker Hub, l'accès à la ressource m'a été refusé
Ajouter JDK au conteneur de l'agent TeamCity Build
Comment monter l'emplacement du fichier de commandes via WSL2 et démarrer le conteneur Docker
Comment obtenir un heapdump à partir d'un conteneur Docker
Comment afficher la quantité de disque utilisée par le conteneur Docker pour chaque conteneur
Comment effacer la base de données lors de la recréation de l'application
Comment mettre à jour un fichier prédéfini dans un conteneur Docker
[Heroku] Comment résoudre lorsqu'une erreur est affichée par git push heroku master
Comment définir quand "Le constructeur Empty () n'est pas visible" se produit dans junit
[Rails] Comment créer un environnement avec Docker
Comment créer un environnement Pytorch sur Ubuntu
Comment créer la blockchain la plus simple de Ruby
[Rails] [Docker] Le copier-coller est OK! Comment créer un environnement de développement Rails avec Docker
[Docker] Comment mettre à jour à l'aide d'un conteneur dans Heroku et comment gérer l'erreur de migration
Comment changer le processus en fonction de la liste appuyée lorsqu'il y a plusieurs ListViews
[Docker] Comment voir le contenu des volumes. Démarrez un conteneur avec les privilèges root.
Comment identifier la cause lorsque le GC se produit fréquemment et que l'utilisation du processeur est élevée
[Java] Comment obtenir l'URL de la source de transition
Quand le survol d'Eclipse est difficile à voir
Comment créer l'application Docker + Springboot (pour l'apprentissage de base)
Jusqu'où est la bonne réponse pour diviser le processus?
Comment déterminer la quantité de disque utilisée par Docker
Comment créer un environnement Docker avec Gradle pour IntelliJ
[Ruby on Rails] Comment changer le nom de la colonne
Créer un conteneur Docker pour convertir EPS en source PGF
Comment créer un environnement de développement Java avec VS Code
[swift5] Comment exécuter le traitement lorsque tabBar est appuyé
Installez MySQL 5.6 sur CentOS6 [Comment spécifier la version]
BasicDataSourceFactory est ClassNotFoundException lors de la connexion à DB dans Tomcat 8
Comment installer Docker