Pokud používáte Docker nějakou dobu, pravděpodobně již máte jednoduchý a efektivní pracovní postup přizpůsobený vám, který zahrnuje některé z vašich oblíbených příkazů dockeru (podpříkazy, které mají být technicky správné).
Například jsem použil k odstranění kontejnerů, které neběží, pomocí dlouhého příkazu, který vypadá takto docker container rm $(docker container ps -qf status=exited)
, fungovalo to, zjevně házelo chybu, kdykoli tam nebyly žádné visící kontejnery. Jednoho dne to přestalo, když jsem zjistil, že máme také prune
dílčí příkaz pro kontejnery! Nyní se tedy dlouhý příkaz stáhl do jednoduchého docker container prune
.
Jde o to, že i když mnoho z nás Docker nějakou dobu používá, existuje možnost, že některé věci mohly být přehlédnuty, nebo možná dokonce zapomenuty v průběhu času.
V tomto článku vám dám tři dílčí příkazy dockeru, které pro vás mohou být nové nebo je příliš nepoužíváte, ale myslím, že byste měli.
Tyto dílčí příkazy mohou také zahrnovat své vlastní dílčí příkazy.
1. Dílčí příkaz systému
Docker má system
příkaz, který vám nějaké poskytne informace na úrovni systému související s dockerem. Ve skutečnosti už nějakou dobu používáte jeden z jeho dílčích příkazů. Zapamatujte si docker info
? Tento příkaz je ve skutečnosti docker system info
.
Chcete-li se dozvědět více o tomto dílčím příkazu a o tom, co nabízí, spusťte --help
možnost na něm.
➟ docker system --help
Usage: docker system COMMAND
Manage Docker
Commands:
df Show docker disk usage
events Get real time events from the server
info Display system-wide information
prune Remove unused data
Run 'docker system COMMAND --help' for more information on a command.
Pojďme si projít každý z těchto dílčích příkazů, protože si myslím, že jsou všechny velmi kritické.
Docker system df
Byli jste někdy v situaci, kdy se zdálo, že diskový prostor vašeho serveru je téměř plný? Chcete-li zkontrolovat, zda se jedná o kontejnery (běh/objemy), pravděpodobně jste použili du
příkaz přímo v kořenovém adresáři dat.
Pomocí du
na datovém kořeni vyžaduje sudo
přístup.
✗ du -h --max-depth=1 /var/lib/docker
du: cannot read directory '/var/lib/docker': Permission denied
4.0K /var/lib/docker
A nejen to, abyste explicitně věděli, kolik svazků nebo obrázků přidělují, museli byste příkaz spustit několikrát.
➟ sudo du -h --max-depth=0 /var/lib/docker/volumes && \
sudo du -h --max-depth=0 /var/lib/docker/image && \
sudo du -h --max-depth=0 /var/lib/docker/
Mnohem lepší alternativou je zavolat docker system df
příkaz. To automaticky detekuje datový kořen a podle toho vytiskne všechny informace týkající se využití disku kontejnery, obrázky a svazky Docker.
Zde je to, co ukazuje můj aktuální systém (je to nová instalace)
➟ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 10 1 84.17MB 84.17MB (100%)
Containers 1 1 8.219MB 0B (0%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
Prořezávání systému Docker
Pokud jste někdy chtěli odstranit (1) všechny nepoužívané sítě, (2) visící obrázky, (3) zastavené kontejnery, (4) všechny nepoužívané svazky, je velká šance, že jste použili nebo jste zvyklí používat čtyři samostatné příkazy k dosažení práce.
docker network prune && \
docker image prune && \
docker volume prune && \
docker container prune
Pokud jste dříve nevěděli o container prune
jako já, pak se příkaz ještě zvětší. Máme štěstí, že to vše lze provést pomocí jednoduchého příkazu, konkrétně docker system prune --volumes
.
Ve výchozím nastavení docker system prune
neodstraní svazky, k tomu musíte použít --volumes
volba. Tento příkaz navíc také vymaže mezipaměť sestavení.
Můžete použít -f
možnost vyhnout se (někdy) nepříjemné výzvě. Viz příklad níže:
➟ docker system prune --volumes -f
Deleted Containers:
672d39c1a78969887f411ce9139e74e5b21c31fccf2bcf8c1190a9e166089ede
Deleted Networks:
Example
SSHnet
Dummy
Deleted Volumes:
dummy
Total reclaimed space: 0B
Mezi další možnosti patří -a
který odstraní všechny nepoužívané obrázky, nejen ty visící.
Události systému Docker
Tento příkaz nemusí být vždy užitečný, ale myslím si, že by si to měl být vědom každý.
docker system events
nebo docker events
ve zkratce vám poskytuje události v reálném čase přímo pro démona dockeru (dockerd
). To může pomoci sledovat určité události, jako je například odstranění obrázku.
Chcete-li tomu lépe porozumět, podívejte se na níže uvedený snímek obrazovky.
2. Dílčí příkaz context
Toto je další krásný dílčí příkaz, o kterém, pokud vím, mnoho lidí neví. Kontext pro provádění jakéhokoli příkazu dockeru je několik párů klíč-hodnota, které zahrnují, ale nejsou omezeny na koncový bod, hostitele, možná nějaký konfigurační soubor atd.
Jakmile budete mít vytvořený kontext, můžete jej později znovu použít.
Jedním z největších praktických případů použití, zejména pro mě, bylo vytváření samostatných kontextů pro jednotlivé servery, na kterých mám spuštěný docker. Protože se většina mé práce točí kolem toho, místo toho, abych se pokaždé přihlašoval na server, používám svého místního klienta se serverem remove docker přes SSH.
Jak nastavit vzdálený přístup k démonu Docker [Podrobná příručka] Nechcete používat ssh na vzdálený server a poté spouštět příkazy dockeru? Můžete nastavit vzdálený přístup do dockeru, který má i další výhody. Linux HandbookDebdut ChakrabortyDovolte mi, abych vám ukázal, jak toho dosáhnu pomocí kontextů dockeru.
Nejprve mám server nasazený na Linode, na kterém běží docker. Pokud bych měl přistupovat k démonu vzdáleného dockeru bez kontextů, použil bych příkaz jako je následující
➟ docker --host ssh://[email protected]:7770 ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
Takže pro přístup ke vzdálenému démonovi bych musel mít alias docker
na docker --host ssh://[email protected]:7770
nebo použijte proměnnou prostředí DOCKER_HOST
. Ty však velmi znesnadňují přechod na jiné hostitele. Jednodušší alternativou je prostě vytvořit kontext.
Následující příkaz vytvoří kontext s názvem remote
, pro koncový bod dockeru s jiným hostitelem, než je místní.
docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
Výstup vypadá takto:
➟ docker context create remote --description "Remote docker server" --docker "host=ssh://[email protected]:7770"
remote
Successfully created context "remote"
Nyní můžete buď použít -c
možnost pomocí docker
pokud chcete něco zkontrolovat rychle nebo pro opakované operace, změňte kontext na tento nový.
Pomocí -c
možnost:
➟ docker -c remote ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
S docker context use [CONTEXT_NAME]
:
➟ docker context use remote
remote
Current context is now "remote"
~
➟ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bb4fa8390ab7 jrcs/letsencrypt-nginx-proxy-companion "/bin/bash /app/entr…" 2 hours ago Up 2 hours reverse-proxy_letsencrypt_1
ccdda507facb jwilder/nginx-proxy "/app/docker-entrypo…" 2 hours ago Up 2 hours 0.0.0.0:80->80/tcp, :::80->80/tcp, 0.0.0.0:443->443/tcp, :::443->443/tcp reverse-proxy_reverse_proxy_1
Chcete-li se dostat z kontextu, použijte use
dílčí příkaz s default
pro kontextový název:
➟ docker context use default
default
Current context is now "default"
~
➟ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3. Dílčí příkaz pause &unpause
Velké nasazení (aplikace) jsou nyní rozděleny do více komponent, lépe známých jako mikroslužby. Když je nasadíte pomocí něčeho jako docker-compose, někdy se stane, že se jedna komponenta spustí dříve než ta, na které závisí. To je problém, protože jeho závislost (nebo závislosti) se ještě nespustila, spuštění této komponenty se nezdaří.
Tento problém můžete zmírnit pomocí zásad restartování v Dockeru, ale nezabrání zahlcení protokolu neúspěšnými pokusy. To, co jsem na začátku dělal, bylo prostě zastavit kontejner/službu, dokud se závislost úplně nespustí.
Lepší způsob je prostě na chvíli pozastavit kontejner, a jakmile budou potřebné služby úspěšně spuštěny, můžete pozastavení kontejneru zrušit a vše se odtamtud pohne vpřed.
Přestože se kontejnery rychle otáčejí, je to ještě rychlejší způsob, jak takovému problému čelit.
Syntaxe pro pause
a unpause
je docela jednoduché.
docker pause [CONTAINER_NAME|ID]
docker unpause [CONTAINER_NAME|ID]
Tím tento článek prozatím končí. Pokud najdu nějaké další takové příkazy, užitečné nebo zajímavé, aktualizuji tento článek odpovídajícím způsobem.
Máte příkaz Docker, který by podle vás měl být na tomto seznamu? Dejte mi vědět v komentářích níže.