Docker kontejnery jsou obecně pomíjivé instance aplikací, které postrádají vnitřní stav. Toto je osvědčený způsob, jak s nimi zacházet, který vám umožní kdykoli zastavit nebo restartovat kontejnery.
Někdy jsou však úpravy souborového systému kontejneru nevyhnutelné. Možná zkoušíte software a chcete snímek, ke kterému se později vrátíte. Dalším případem použití mohou být situace, kdy software uvnitř kontejneru přestal fungovat a chcete si uložit repliku, kterou můžete v budoucnu ladit.
Zde je návod, jak vytvořit nový obrázek Docker z existujícího kontejneru. Poté budete moci začít další kontejner z toho obrazu, který bude naplněn souborovým systémem z prvního.
Potvrzení kontejnerů
docker commit
příkaz se používá k odebrání kontejneru a vytvoření nového obrázku z něj. Funguje se zastavenými nebo běžícími kontejnery.
Základní syntaxe je následující:
docker commit example-container example-image:latest
Tím se vytvoří obrázek z kontejneru s názvem example-container
. Pokud chcete, můžete kontejner identifikovat také podle ID. Obě informace jsou dostupné z výstupu docker ps
který uvádí všechny kontejnery na vašem hostiteli.
Výslednému obrázku je přiřazen tag daný jako druhý parametr příkazu. Toto je example-image:latest
ve výše uvedeném příkladu. Stejně jako při běžné operaci označování obrázků nový obrázek nahradí referenci značky, pokud již existuje.
Nyní můžete použít svůj obraz k obnovení souborového systému z example-container
do nové instance kontejneru:
docker run -d example-image:latest
Obsah souborového systému bude odpovídat example-container
kontejneru v době docker commit
Byl proveden příkaz Existuje jedno důležité upozornění:obsah připojených svazků nebude zahrnut, takže jejich místa připojení budou ve vytvořeném obrazu kontejneru prázdná. Chcete-li spustit nový kontejner s nedotčenými daty objemu, použijte -v
příznak pro opětovné připojení svazků z prvního kontejneru, když spustíte druhou instanci pomocí docker run
.
Dalším pozoruhodným problémem je, jak Docker zpracovává potvrzení běžících kontejnerů. Z velké části by to mělo fungovat bez problémů, ale výchozím nastavením je pozastavení cílového kontejneru před vytvořením odevzdání. Všechny procesy v kontejneru budou pozastaveny a poté obnoveny po dokončení vytváření obrázku. To zlepšuje konzistenci dat v novém obrazu, ale kontejner je dočasně nedostupný. Toto chování můžete zakázat přidáním --pause false
s vaším docker commit
příkaz.
Přidávání zpráv pro potvrzení
docker commit
příkaz podporuje zprávy odevzdání podobným způsobem jako software pro správu verzí, jako je Git. Přidání zprávy při vytváření obrázku z kontejneru vám umožní zdokumentovat, co se změnilo, a důvod vašeho odevzdání.
Použijte --message
nebo -m
příznak pro použití zprávy odevzdání:
docker commit -m "Example commit" example-container example-image:latest
Můžete také přidat informace o autorství pomocí vyhrazené vlajky. Zadejte řetězec ve společném First Name <[email protected]>
formátovat na --author
nebo -a
vlajka. Bude uložena spolu se zprávou odevzdání.
docker commit -a "Example Author <[email protected]>" -m "Example commit" example-container example-image:latest
Při použití docker history
se zobrazují zprávy potvrzení příkaz pro zobrazení vrstev v obrázku. Zobrazí se v COMMENT
sloupec zcela vpravo.
Dalším způsobem přístupu k těmto informacím je použití docker inspect
v tandemu s grep
extrahovat hodnoty autorství a komentářů z reprezentace JSON obrázku:
docker inspect <image-id> | grep 'Created|Author|Comment'
Zobrazí se data spojená s nejvyšší vrstvou v obrázku.
Změna pokynů pro Dockerfile
Potvrzení obrázku vám dává možnost zmutovat některé jeho instrukce Dockerfile. V novém obrázku můžete přepsat následující hodnoty:
CMD
ENTRYPOINT
ENV
EXPOSE
LABEL
ONBUILD
USER
VOLUME
WORKDIR
Pro nastavení instrukce použijte --change
nebo -c
příznak:
docker commit --change 'ENTRYPOINT ["sh"]' example-container example-image:latest
Příznak můžete opakovat tolikrát, kolikrát je potřeba, abyste použili všechny zamýšlené změny.
Podporovány jsou pouze instrukce, které ovlivňují nejvyšší vrstvu souborového systému. Potvrzený obrázek nelze plynule rozšířit o nové vrstvy pomocí pokynů, jako je RUN
a COPY
. Můžete však vzít výsledek potvrzení a napsat nový soubor Docker, který v případě potřeby přidá nový obsah:
# Created via `docker commit` FROM example-image:latest RUN apt install example-package
Pokud změníte instrukce Dockerfile v době odevzdání, stojí za to přidat zprávu odevzdání, která vysvětluje, co upravujete a proč. To pomůže komukoli dalšímu s přístupem k obrázku pochopit jakékoli rozdíly v chování ve srovnání s kontejnerem, ze kterého byl vytvořen.
Přehled
Docker obrazy jsou obvykle sestaveny z Dockerfiles a používají se ke spuštění jednorázových kontejnerů. Změny stavu souborového systému kontejneru se provádějí přebudováním bitové kopie, zničením stávajícího kontejneru a spuštěním nového. V ideálním světě kontejnery nemají žádný vnitřní stav, ale v praxi to není vždy pravda.
Potvrzení kontejneru vám poskytuje způsob, jak v budoucnu obnovit jeho aktuální souborový systém. Závazky jsou užitečné pro vytváření replik problematických kontejnerů, takže můžete ladit v samostatném prostředí a zároveň si zachovat přístup k dříve vygenerovaným protokolům a dočasným souborům.
Přestože se odevzdání kontejneru často podobá snímkům virtuálních počítačů, není to úplně totéž. Virtuální počítače řídí virtuální hardware a stav tohoto hardwaru bude přítomen ve snímku. Docker kontejnery jsou jen sadou procesů běžících na hostiteli; potvrzení je nový obrázek Dockeru, který představuje systém souborů kontejneru ale nutně postrádá jakákoli data o stavu procesů, kernelu a vašem hardwaru.