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.
Docker Engine: 19.03.13
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.
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 ...?")
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
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é.
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>
docker run --name containerA --mount type=bind,source=(pwd)/html,target=/usr/share/nginx/html -d -p 81:80 nginx
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
--mount
--Volume a aussi l'ancienne option -v ou --volume
, mais recommande officiellement --mount
, alors suivez-le.
--type
spécifie le type de montage (cette fois, il s'agit d'un montage lié, donc bind
)
--source
spécifie le chemin de la source de montage (hôte)
--target
spécifie le chemin sur lequel monter (à l'intérieur du conteneur)
--Détacher le mode avec -d
(démarrer en arrière-plan)
--Définir le port en avant avec -p
--Associer loclahost: 80
dans le conteneur avec localhost: 81
de l'hôteL'écran suivant est affiché
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é.
docker build -t build_with_bind_data ./
Dockerfile
↓ est le résultat de l'exécution
docker image ls
L'image build_with_bind_data
est construite comme indiqué ci-dessous
docker run --name containerB -d -p 82:80 build_with_bind_data
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.
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
.
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.
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