GNU/Linux >> Znalost Linux >  >> Panels >> Docker

Jak používat Docker Commit ke změně obrázků kontejnerů

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 a changedimage jsou libovolně zvoleny, ale obvykle odrážejí správně označené zdroje, jako je customimages/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 jeden CMD může existovat v DockerFile najednou. Poslední CMD bude ten, který vstoupí v platnost. Primární účel CMD je poskytnout výchozí spouštěcí příkazy pro kontejner při vytvoření.
  • ENTRYPOINT – Podobně jako příkaz CMD používá ENTRYPOINT syntaxi ENTRYPOINT ["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í proces PID 1 . Tato akce vám pak umožní ukončit proces pomocí docker stop elegantně. Navíc můžete použít CMD s tímto vynecháním executable část, která předává tyto parametry do ENTRYPOINT 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íč–hodnota ENV 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átu LABEL 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 jako USER 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!


Docker
  1. Jak přesunout obrazy Dockeru mezi hostiteli

  2. Jak použít Dockerfile k vytvoření Docker Image

  3. Jak upravit obrázky Docker

  1. Jak sdílet obrázky Docker s ostatními

  2. Jak potvrdit změny v obrazu Dockeru

  3. Jak používat místní docker obrázky s Minikube?

  1. Jak vytvořit vlastní obrázek z kontejneru Docker

  2. Jak vytvořit Docker Image z kontejneru a Dockerfile

  3. Jak změnit časové pásmo pro kontejner Docker