Potřebovali jste někdy vidět, co se děje uvnitř kontejneru Docker? Kontejnery mají být idempotentní:Pokud dojde k problému, znovu nasaďte nový kontejner. Život často není tak jednoduchý. Chcete-li identifikovat problém, musíte v kontejneru spustit příkazy. Zde se nachází docker exec
příkaz může pomoci.
Tento článek vás naučí spouštět příkazy na běžícím kontejneru Docker pomocí docker exec
příkaz.
Předpoklady
Chcete-li se řídit příklady v tomto článku, budete muset dodržovat následující.
- Jakákoli nejnovější verze Docker Desktop bude fungovat na Windows, Linux nebo macOS. Tento výukový program používá verzi 3.1.0 běžící na Windows 10.
Spuštění kontejneru NGINX
Docker exec
spouští příkazy v kontejnerech. K tomu však musíte mít nejprve kontejner, ve kterém budou tyto příkazy spouštěny. Začněme stažením obrazu Dockeru a vytvořením demo kontejneru.
- Vytvořte nový adresář, tento tutoriál používá C:\gitrepos\test , k uložení souborů použitých pro kontejner.
2. Vytvořte soubor s názvem dockerfile (bez přípony) obsahující následující kód. Dockerfile definuje kroky potřebné k vytvoření kontejneru.
FROM nginx:alpine
COPY index.html /usr/share/nginx/html/index.html
3. Dále vytvořte soubor ve stejném adresáři s názvem index.html který obsahuje následující kód. Toto je soubor HTML, který po spuštění kontejneru zobrazí zprávu Hello World.
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta http-equiv="X-UA-Compatible" content="ie=edge">
<title>Hello World - Nginx Docker</title>
<style>
h1{ font-weight:lighter; font-family: Arial, Helvetica, sans-serif;
}
</style>
</head>
<body>
<h1>
Hello World
</h1>
</body>
</html>
4. Nyní vytvořte kontejner Nginx Docker. Protože je soubor Dockerfile v aktuálním pracovním adresáři, zadejte .
aby motor Docker věděl, že se tam má podívat. Nezapomeňte také označit kontejner tagem my-ngnix
pomocí t
parametr pro zajištění snadnější reference v budoucnu.
docker build -t my-nginx .
5. Nyní, když je kontejner vytvořen, spusťte kontejner pomocí příkazu Docker run.
# rm - Informs Docker to delete the container after it has stopped
# d - Return control of the command-line after the command has been executed
# p - Map the internal container port 80 to an external port 80 docker run --rm -d -p 80:80 my-nginx
6. Nakonec otevřete webový prohlížeč a přejděte na http://localhost/
abyste viděli následující.
Spouštění příkazů pomocí Docker Exec
Při spouštění příkazů v kontejneru Docker může být nutné spustit příkaz interaktivně. Interaktivní spouštění příkazů znamená zadání příkazu, získání zpětné vazby, zadání jiného příkazu atd. Interaktivní příkazy převezmou vaši relaci a zabrání vám v čemkoli jiném.
Co když ale již znáte příkazy, které se mají odeslat do kontejneru, a chcete příkazy spouštět na pozadí? V takovém případě můžete spouštět neinteraktivní příkazy. Neinteraktivní příkazy vám umožňují odeslat příkaz do Dockeru a okamžitě vrátit ovládání konzole.
Vyhledání názvu a ID kontejneru
Nyní, když máte kontejner postavený, můžete provádět příkazy uvnitř kontejneru. Před spuštěním příkazu vyhledejte buď název nebo ID kontejneru NGINX. V příkazech Dockeru bude fungovat buď název, nebo ID. S ohledem na to může být zapamatování ID náročnější než jméno!
Chcete-li zobrazit informace o spuštěném kontejneru, spusťte Docker ps
příkaz pro výstup následujících informací.
docker ps
Zkopírujte buď jedinečné ID, e17e4b6be01a
, nebo náhodně vygenerovaný název mystifying_chandrasekhar
do schránky pro pozdější použití.
Spuštění neinteraktivního příkazu pomocí Docker Exec
Jako příklad spuštění neinteraktivního příkazu zkopírujte a spusťte níže uvedený příkaz, abyste vrátili seznam souborů v /var/log adresář s ls -l
příkaz. Vše předejte za názvem kontejneru mystifying_chandrasekhar
, do exec
Dockeru příkaz.
docker exec mystifying_chandrasekhar ls -l /var/log
Vyhýbání se výstupu z konzoly pomocí příkazů Docker
Okamžitým vrácením ovládání shellu uživateli se velké operace vyhýbají svazování konzole. Zbavte se výstupu konzoly s odděleným d
volba. Níže uvedený příkaz vytvoří soubor /tmp/execWorks pomocí touch
příkaz v kontejneru a nezobrazuje žádný výstup na konzole.
docker exec -d mystifying_chandrasekhar touch /tmp/execWorks
Provádění interaktivních příkazů pomocí Docker Exec
Až do této chvíle jste se naučili spouštět neinteraktivní příkazy v kontejneru Docker pomocí docker exec
. Můžete se však setkat s situací, kdy budete muset odstraňovat problémy s kontejnerem, například když potřebujete interaktivně zadávat příkazy kontejneru. V takovém případě musíte příkazy spouštět interaktivně.
Interaktivní spouštění příkazů pomocí docker exec
vyžaduje dvě možnosti, i
a t
. i
volba ponechává STDIN otevřený, což umožňuje odesílání příkazů do kontejneru a t
volba přiděluje pseudo-TTY (PTY), komunikační kanál, pro psaní příkazů.
Zkopírováním a vložením následujícího příkazu otevřete interaktivní příkazový řádek do běžícího kontejneru Docker s Bourne (sh) shellem, jak je indikováno změnou výzvy na / #
.
docker exec -it mystifying_chandrasekhar sh
Jakmile jste v shellu, spusťte níže uvedené příkazy, abyste předvedli výpis souborů z kontejneru. Nakonec spusťte exit
příkaz opustit interaktivní shell.
ls -l /var/log
exit
Chcete-li otevřít interaktivní výzvu v konkrétním adresáři, předejte cestu do
w
možnost, která říká Dockeru, aby spustil shell v určeném adresáři.
Předávání proměnných prostředí do běžícího kontejneru
Mnoho programů používá proměnné prostředí k nastavení konfigurací při spuštění. Například většina aplikací Java vyžaduje JAVA_HOME
proměnnou prostředí, kterou chcete nastavit na cestu Java.
Proměnné prostředí můžete předat relaci pomocí e
volba. Například možná potřebujete naplnit proměnné prostředí nazvané MYVAR
do běžícího kontejneru. Chcete-li to provést, použijte e
a zadejte pár klíč/hodnota MYVAR="<some value>"
jak je uvedeno níže.
docker exec -it -e MYVAR="hello" mystifying_chandrasekhar sh
echo $MYVAR
Předávání proměnných prostředí pomocí souboru
Pokud máte mnoho proměnných prostředí nebo sdílenou konfiguraci, uložení těchto proměnných do souboru může být jednodušší. Předejte soubor přes relativní nebo absolutní cestu do Dockeru pomocí --env-file
volba. Tato technika se často používá k poskytování bezpečných přihlašovacích údajů do kontejneru. Ujistěte se, že nikdy nesvěřujte přihlašovací údaje do správy verzí!
Vytvořte textový soubor s názvem env-vars.txt
s proměnnými prostředí, které se mají předat, a jejich hodnotami. Tento soubor lze nazvat jakkoli chcete a nepotřebuje .txt
přípona souboru.
Předejte proměnné prostředí do Dockeru pomocí env-file
volba. Ověřte, že jsou proměnné dostupné pomocí echo
příkaz, jak je znázorněno na níže uvedeném snímku obrazovky.
# Pass the env-vars.txt file and open an interactive prompt
docker exec -it --env-file env-vars.txt mystifying_chandrasekhar sh
# Verify that the environmental variables are available in the Docker container
echo $MYVAR
echo $FOO
echo $SOMETHING
Interakce s běžícím kontejnerem jako jiný uživatel
V produkci aplikace často běží jako konkrétní uživatel, aby byl omezen jejich přístup. Pokud spouštíte aplikace jako konkrétní uživatel v produkci, měli byste tak učinit také při testování příkazů.
V tomto příkladu je kontejner Docker spuštěn jako nginx
uživatel. Předejte uživatele do w
možnost říct Dockeru, aby spustil kontejner jako nginx
účet. whoami
příkaz spuštěný z kontejneru potvrzuje, že nginx
uživatel je skutečně použit.
docker exec -it -u nginx mystifying_chandrasekhar sh
whoami
Další kroky
Naučili jste se spouštět příkazy v běžícím kontejneru pomocí docker exec
příkaz. Pomocí exec
příkaz pro zadávání a dotazování běžících kontejnerů, máte ve svém arzenálu nový výkonný nástroj pro odstraňování problémů s kontejnery Docker.
Nyní zkuste posunout to, co jste se naučili, o krok dále a použijte řízení verzí Git k natažení statického webu do kontejneru namísto kopírování jednoho souboru. Pokud je pro vás Git novinkou, pak je skvělým místem, kde začít, článek Průvodce pro začátečníky ke kódu Visual Studio a Gitu.