Charakteristickým znakem kontejnerů Docker je neměnnost. Kontejnery můžete kdykoli zničit a znovu vytvořit, abyste obnovili původní stav. Pomocí docker commit
můžete provést nové změny obrázku kontejneru, ale není to relativně jednoduché, jak byste očekávali.
Pojďme se podívat na to, jak potvrdit změny v novém obrázku kontejneru pomocí docker commit
příkaz!
Kdy provést změny u nového obrázku kontejneru
Kontejnery jsou vytvořeny tak, aby byly neměnné (nezměnily se), tak proč byste chtěli zadávat změny do kontejneru? Existuje několik důvodů.
- Během vývoje nové kontejnerové služby pro rychlé testování změn.
- Proveďte rychlou opravu chyb produkční služby, aniž byste museli nejprve opravit zdrojový obraz.
- Použijte
commit
k pořízení snímku snímku a exportu snímku na nový server.
Ačkoli tyto nemusí pokrývat všechny potenciální scénáře, je jich několik, které umožňují použití docker commit
perfektní případ použití.
Potvrzení změn jednoduchého obrázku
Pro zdánlivě jednoduchý příkaz dělá tento příkaz hodně.
Níže je jednoduchý příklad commit
příkaz. Pomocí ID spuštěného kontejneru d3fdd3517e0a
v tomto příkladu je vytvořen nový obrázek v úložišti s názvem myrepository
a pojmenované changedimage
.
Původní obrázek je označen jako version2
, což není nutné, ale užitečné pro sledování změn mezi podobně pojmenovanými obrázky.
Oba
myrepository
achangedimage
jsou libovolně zvoleny, ale obvykle odrážejí správně označené zdroje, jako jecustomimages/alpine-linux
.
docker commit d3fdd3517e0a myrepository/changedimage:version2
Kontejnery Docker jsou série obrázků pouze pro čtení s vrstvou pro čtení a zápis nahoře. Ve výše uvedeném příkladu Docker pozastaví běžící kontejner. Tato pauza má zabránit náhodnému poškození dat, zatímco Docker vytváří obraz
Protože tato pauza může způsobit přerušení služby, můžete použít
--pause=false
. Mohlo by dojít k poškození dat, protože zápisy nemusí být úspěšně dokončeny.
Navíc commit
operace vynechá data obsažená ve svazcích namontovaných v kontejneru. Protože svazky nejsou součástí samotného systému souborů kontejneru, Docker je ignoruje.
Jakmile je operace potvrzení dokončena, Docker poté vytvoří novou vrstvu se změnami z původního obrázku pod novým názvem obrázku kontejneru.
Předpoklady
Jediným předpokladem v tomto tutoriálu je samotný Docker. To lze nainstalovat prostřednictvím softwaru Docker Desktop v systému Windows nebo nainstalovat prostřednictvím balíčku v systému Linux.
Související:Nasazení prvního kontejneru Docker ve Windows
Potvrzení změn nového obrázku kontejneru Docker
Podívejme se nyní na některé běžné scénáře, které docker commit
příkaz může být užitečný pro.
Nejprve stáhněte image kontejneru Alpine Linux z veřejného úložiště Docker. Alpine je známý svými tenkými kontejnery, jak je patrné z velikosti ~5 MB.
# Pull the latest Alpine Linux image
docker pull alpine
# List all Docker images
docker images
Vývoj a testování kontejnerů
Primární případ použití pro docker commit
je vývoj nového image kontejneru. Tento obrázek může být nakonec použit jako základ pro další obrázky nebo jako samotný produkční kontejner.
V ukázkovém úryvku níže je Docker:
- Spuštění dříve vytaženého
alpine
obrázek - Otevření interaktivního prostředí pro instalaci balíčku
- Instalace balíčku htop
# Open an interactive shell to the Docker Alpine Linux container
docker run -it a24bb4013296 bin/sh
# Install the HTOP package
apk add htop
Níže můžete vidět, že balíček je správně nainstalován v kontejneru spuštěním htop
příkaz.
Jakmile nainstalujete balíček do nové „vrstvy“, měli byste nyní tuto změnu potvrdit původnímu základnímu obrazu. Chcete-li to provést:
- Spusťte
docker ps -a
k vyhledání ID kontejneru. - Pomocí ID kontejneru odevzdejte obsah aktuální vrstvy do nového základního obrázku.
V níže uvedeném příkladu se nový obrázek jmenuje alpine-htop
a označené version1
. Obrázek je označen pro snadné sledování verzí obrázku dockeru, které jsou pojmenovány podobně.
# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the layer to a new image named alpine-htop and tagged version1
docker commit b57e066d5bfa alpine-htop:version1
# List all images available
docker images
Oprava chyb v produkčních obrázcích
Často můžete mít produkční službu, která má nějakou chybu. Může existovat známá oprava a vy byste mohli opravu použít rychleji než úpravou stávajících konfigurací a opětovným nasazením. Pomocí docker commit
, můžete rychle použít opravu a poté pracovat na pozadí na aktualizaci dalších nezbytných součástí.
Tento ukázkový úryvek níže ukazuje instalaci NGINX do obrazu Alpine Linux Docker.
# First List the available images
docker images
# Run an interactive session for the alpine-htop image
docker run -it a24bb4013296 bin/sh
# Install the NGINX package
apk add nginx
# Create the location for the NGINX PID file
mkdir /run/nginx
# Verify that NGINX is installed
nginx -v
# Run NGINX
/usr/sbin/nginx
# Verify that NGINX is properly running
ps | grep nginx
# Kill the NGINX process
kill 18
# Verify that the NGINX process is no longer active
ps | grep nginx
Potvrdit nový kontejner NGINX vytvořený výše do nového obrázku s názvem alpine-nginx
a se značkou version1
. Označení obrázku je osvědčený postup, který pomůže odlišit různé verze stejného obrázku.
# List all Docker containers regardless of status, -a or --all to show every container
docker ps -a
# Commit the changes to a new image named alpine-nginx
docker commit 37043139525c alpine-nginx:version1
# Verify that the new image was created
docker images
Ne každý spustitelný soubor bude možné spustit na pozadí a NGINX není jiný. Pro správné spuštění tohoto kontejneru s NGINX běžícím na pozadí předejte -g 'daemon off;'
možnost na NGINX.
# Run the NGINX container in the background
docker run -d f6b46a3b76be /usr/sbin/nginx -g 'daemon off;'
# Verify that the container is running
docker ps -a
Nakonec použijte --change
přepněte na vystavení portu 80. Pomocí --change
parametr, EXPOSE 80
příkaz bude zapsán do DockerFile kontejneru. Po provedení této změny spusťte nový kontejner. Po spuštění nového kontejneru pokračujte v zastavení předchozího kontejneru, který byl nesprávně spuštěn bez odhaleného portu. To pomůže elegantně převést nefunkční kontejner do pracovního kontejneru.
# List all running containers
docker ps -a
# Commit the changes to a new image with an exposed port 80
docker commit --change "EXPOSE 80" c649c813d985 alpine-nginx:version2
# List the running containres
docker ps -a
# List all Docker images
docker images
# Run the newly created image
docker run -d c71f0f9cef7b /usr/sbin/nginx -g 'daemon off;'
# List running containers
docker ps -a
# Stop the prior container without the exposed port 80
docker stop c649c813d985
# List running containers
docker ps -a
Snímání obrázku Docker
A konečně, co scénář, kdy možná budete muset pořídit snímek, obraz určitého okamžiku, běžícího kontejneru, abyste mohli kontejner přesunout na nový server? docker commit
příkaz k tomu dobře funguje, jak můžete vidět níže.
Níže uvedené příkazy vytvoří běžící kontejner, který zastavíme a odevzdáme do nového alpine-nginx
verze.
# List running Docker containers
docker ps -a
# Create a new running Docker NGINX container
docker run -d c71f0f9cef7b
# List running Docker containers
docker ps -a
# Stop the Docker container
docker stop 7ff99f2bcf6b
# Create a new alpine-nginx version to export
docker commit 7ff99f2bcf6b alpine-nginx:version3
# List the Docker images available
docker images
Exportujte obrázek Dockeru do souboru. V tomto příkladu se soubor exportu jmenuje export.tar
, ale pojmenujte soubor podle svých potřeb. Nakonec importujte export.tar
soubor zpět do Dockeru, což ukazuje celý proces.
Ujistěte se, že exportujete pomocí formátu
repo:tag
pokud chcete, aby tyto štítky byly zachovány při opětovném importu obrázku.
# Save the image to a file on the local disk
docker save -o export.tar alpine-nginx:version3
# Verify that the image exists
ls
# Remove the just exported Docker image
docker rmi 39ca9e64828a
# List Docker images and verify that the image is removed
docker images
# Load the Docker image back in
docker load -i export.tar
# List Docker images and show that the image has been loaded back in
docker images
Další možnosti pro příkaz Docker Commit
Využití dalších možností dostupných pro commit
je podporováno mnoho různých scénářů.
Pozastavení kontejneru
Chcete-li kontejner nepozastavit, když je spuštěný, můžete předat --pause=false
příkaz k deaktivaci funkce pozastavení. To se často používá při zálohování produkční služby a pozastavení této služby by bylo škodlivé.
Příkaz pause má také zkratku -p
které se mohou používat rychleji. Uvědomte si však, že vynecháním pozastavení kontejneru riskujete poškození dat, pokud dojde k zápisu do souborového systému, což by mohlo způsobit zápis neúplných nebo poškozených dat.
Zanechání zprávy o závazku
Mnoho vývojářů zná způsob poskytování správné zprávy o odevzdání. Stejně jako při používání ovládání zdroje byste v ideálním případě chtěli poskytnout užitečnou zprávu, která vysvětluje, proč byla potvrzena nová verze kontejneru.
To lze provést pomocí --message="message to commit"
příkaz. Stejně jako dříve existuje zkrácená verze tohoto příkazu, -m
. Chcete-li zobrazit seznam zpráv odevzdání Dockeru, použijte docker history
příkaz.
Definování autora
Chcete-li správně označit, kdo změnu vytváří, můžete zadat hodnotu autora, která poskytne další kontext tomu, kdo změnu provádí. To lze použít prostřednictvím --author="Jane Author ([email protected])"
. Tento příkaz lze také použít prostřednictvím zkratky -a
. Pomocí docker inspect
budete moci načíst JSON výpis informací o kontejneru, včetně štítků, jako je autor.
Paralelní použití změn DockerFile
Konečně nejsložitější příkaz, který lze použít v docker commit
příkaz je change
parametr. Tento parametr aplikuje změny v kontejneru na DockerFile ve stejnou dobu jako potvrzení.
Můžete použít change
parametr předáním pokynů do souboru Dockerfile takto, --change="ENV TEST true"
. Tento příkaz vloží text ENV TEST true
do DockerFile. Nyní, když se kontejner znovu spustí, změny, které zde určíte, budou již použity.
Namísto
--change
jméno, můžete použít zkratku a použít-c
alias.
Pomocí tohoto příkazu můžete také zřetězit více --change
parametry dohromady. To vám umožní snadno přidat více změn do DockerFile v jednom příkazu odevzdání.
Možnosti změny parametrů
S change
můžete použít pouze několik příkazů parametr, jak je uvedeno níže.
CMD
– Instrukce CMD má tvar CMD ["executable","parameter1","parameter2"]
. Toto je preferovaná metoda, ale mějte na paměti, že pouze jedenCMD
může existovat v DockerFile najednou. PosledníCMD
bude ten, který vstoupí v platnost. Primární účelCMD
je poskytnout výchozí spouštěcí příkazy pro kontejner při vytvoření.ENTRYPOINT
– Podobně jako příkaz CMD používá ENTRYPOINT syntaxiENTRYPOINT ["executable","parameter1","parameter2"]
. Tato syntaxe vyvolává otázku, proč používat ENTRYPOINT přes CMD?
Příkaz ENTRYPOINT spouští spustitelný soubor jako primární procesPID 1
. Tato akce vám pak umožní ukončit proces pomocídocker stop
elegantně. Navíc můžete použítCMD
s tímto vynechánímexecutable
část, která předává tyto parametry doENTRYPOINT
spustitelný.ENV
– Protože většina aplikací využívá proměnné prostředí, příkaz ENV vám je umožňuje jednoduše nastavit ve formátu klíč–hodnotaENV key=value
. K těmto proměnným klíč=hodnota přistupujte jako ke standardním proměnným prostředí Linuxu.EXPOSE
– Příkaz EXPOSE zpřístupní port a volitelný protokol mimo kontejner. Tento příkaz mapuje porty v kontejneru na vnější stranu kontejneru a umožňuje kontejnerům komunikovat s vnějšími zdroji, jako je webový server obsluhující obsah.LABEL
– Příkaz LABEL přidá metadata do kontejneru. Metadata můžete přidat pomocí formátuLABEL version="2.0"
k zobrazení dalších metadat použijte příkaz docker image inspect.ONBUILD
– Příkaz ONBUILD přidá instrukci, která se má provést později, když je obraz použit jako základ pro další sestavení kontejneru. Tento parametr používá příkazy ADD a RUN k přidání obsahu pomocí příkazu ADD nebo RUN spustitelný soubor.USER
-Příkaz USER nastavuje uživatelské jméno (nebo UID) a volitelně skupinu uživatelů (nebo GID), které se mají použít při spouštění obrazu. Vypadá to jakoUSER myuser:mygroup
v praxi.- OBJEM – U většiny kontejnerů je nutné nějakým způsobem přistupovat k datům. Příkaz VOLUME vytvoří bod připojení se zadaným názvem, který jej označí, že obsahuje externě připojený svazek. Toto se běžně používá jako
VOLUME ["/data"]
. WORKDIR
– Nakonec příkaz WORKDIR nastaví pracovní adresář příkazů CMD nebo ENTRYPOINT. Toto se používá takto,WORKDIR /path/to/directory
. WORKDIR je užitečný, když potřebujete spustit spustitelný soubor, ale umístění není ve výchozí proměnné prostředí PATH.
Závěr
docker commit
příkaz je překvapivě složitý. Ačkoli existuje jednoduchá syntaxe, s možností přidávat změny DockerFile při použití příkazu commit, můžete rychle provádět změny, které přetrvají při příštím vytvoření kontejneru prostřednictvím DockerFile.
Tento příkaz nemusí být nutný pro všechny situace, ale pro rychlé řešení problémů a pro vytváření snímků kontejnerů, které lze snadno přesouvat mezi servery, se příkaz commit rychle stane velmi užitečným!