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

Jak nastavit vzdálený přístup k démonu Docker [Podrobný průvodce]

Podrobně jsem psal o tom, jak SSH do kontejneru dockeru. Tento výukový program posouvá stejný koncept na jinou úroveň tím, že umožňuje vzdálený přístup k Dockeru.

Díky vzdálenému přístupu dockeru, kdykoli spustíte příkaz docker na svém místním hostiteli, efekt se odehraje na vzdáleném serveru.

Dovolte mi to podrobně vysvětlit.

Co je vzdálený přístup Docker?

Než se ponoříte do nastavení, dovolte mi připomenout, jak docker funguje.

Docker pracuje v něčem, co se nazývá architektura klient-server. Hlavní komponentou, která zpracovává všechny vaše kontejnery, svazky, sítě atd., je démon dockeru, který běží na pozadí.

docker příkaz není nic jiného než klientská aplikace. Klient a démon komunikují přes docker API přes tradiční unixový soket, který najdete na /run/docker.sock nebo /var/run/docker.sock . Klient požádá démona, aby něco udělal nebo získal informace, a démon to udělá.

Jak vás to zajímá? Vzhledem k tomu, že komunikační protokol používaný mezi klientem dockeru a serverem je prostý HTTP, měli byste být schopni odesílat požadavky na server vzdáleně, pokud můžete přimět démona, aby naslouchal požadavkům HTTP na portu namísto místního soketu UNIX.

Jak se ukázalo, můžete to úplně udělat. Démon může skutečně naslouchat nejen na soketu UNIX, ale také na portu TCP. Jako by to nestačilo, počínaje dockerem verze 18.09 můžete pro komunikační protokol dokonce použít SSH.

V tomto tutoriálu vás provedu celým procesem, jak můžete nakonfigurovat hostitele a vzdálený server, abyste mohli používat docker příkazy z jednoho hostitele a nechte jej spouštět na jiném hostiteli, aniž byste museli na vzdálený server zadávat SSH.

Výhody používání vzdáleného přístupu k dockeru

Stále přemýšlíte o výhodách tohoto přístupu? Zde je několik z nich:

  • Pro spuštění nebo zastavení služby není třeba se přihlašovat k serveru. Vše lze provést na dálku.
  • Mnoho monitorovacích nástrojů, jako je Portainer, potřebuje přístup ke koncovému bodu rozhraní Docker API, aby bylo možné sledovat podrobnosti, jako jsou sítě, spuštěné kontejnery atd. Chcete-li přidat server do seznamu koncových bodů, musíte na server nasadit agenta Portainer. nejprve a navázat nějaký port z kontejneru na hostitele. Místo toho byste mu mohli povolit přímý přístup k démonu dockeru, což by ušetřilo spoustu vašich zdrojů.
  • Přímo v místním počítači můžete napsat různé automatizační skripty pro ovládání/správu jednoho nebo více vzdálených dockerových serverů. Vzhledem k tomu, že nemusíte používat SSH na vzdálený server, není potřeba udržovat stabilní připojení. Toto může být dobrá volba, pokud máte nestabilní nebo pomalé připojení k internetu.
  • Pokud váš místní systém není dostatečně výkonný na to, aby spouštěl kontejnery, nebo říkáte, že nemáte dostatek úložiště, můžete pro hostitele dokovacího zařízení použít vzdálený server a ovládat jej vzdáleně přes port TCP nebo SSH.
  • li>
  • Rozšíříme-li předchozí bod, servery v cloudu jsou dnes velmi škálovatelné. Dokud budete s náklady v pořádku, můžete hostitele dockeru škálovat podle potřeby, aniž byste se museli starat o nákup novějšího SSD nebo HDD (pokud je stále používáte).

Samotné výhody lze škálovat nahoru nebo dolů, záleží na tom, zda to dotyčný opravdu potřebuje nebo ne. Pokud ne, je to v pořádku. Ale pokud ano, jste na správném místě.

Je vzdálený přístup Docker bezpečný?

Přátelé v dockeru už o tom uvažovali. Použití SSH pro meziprotokol je stejně bezpečné jako vaše relace SSH. Více o tom v další části tohoto tutoriálu.

Pokud nemáte zájem o používání SSH, odhalení API prostřednictvím veřejného portu, bez jakékoli formy autentizace, není teď zrovna nejlepší nápad, že?

Proto máme ověřování TLS. Pokud někdo jiný nemá certifikát podepsaný vaší CA (spolu s certifikátem CA), neměl by vám ublížit.

Následující diagram to vysvětluje:

Nejprve budu mluvit o tom, jak můžete nakonfigurovat místní a vzdálené servery pro toto nastavení pomocí SSH. Je to mnohem jednodušší a doporučuji vám jít touto cestou, pokud se vám druhá metoda zdá trochu složitá.

Co potřebujete pro toto nastavení?

Než budete pokračovat, potřebujete pár věcí, některé povinné, některé volitelné.

  • Jak už je to docela jasné, budete potřebovat server v cloudu, osobně doporučuji Linode.
  • Na tomto vzdáleném serveru musí být nainstalován Docker. Můžete nahlédnout do našeho průvodce instalací Dockeru na Ubuntu a CentOS.
  • Volitelně určitá znalost openssl může být užitečné, pokud plánujete používat metodu TCP port.
  • Přístup k serveru prostřednictvím ověřování pomocí veřejného klíče SSH.

Metoda 1:Nastavení vzdáleného přístupu k dockeru pomocí SSH

Jedna z nejlepších věcí na používání SSH je, že vyžaduje mnohem méně práce než druhá metoda. Pokud již máte SSH klíče nastavené, je to doslova jednokrokový proces.

Než pokročíte vpřed, chci, abyste měli tento mentální obrázek na místě, abyste pochopili, jak tato metoda SSH funguje a proč je nakonfigurována tak, jak je nakonfigurována.

Při použití protokolu SSH pro vzdálený přístup do dockeru se stane, že klient dockeru ve skutečnosti spustí příkaz ssh na místním hostiteli se skrytým příkazem docker (docker system dial-stdio) na vzdáleném hostiteli, který naváže spojení se vzdáleným hostitelem. dockerd koncový bod, který je téměř vždy /var/run/docker.sock, a předá spojení na příkazy stdio.

Chcete-li potvrdit výše uvedené prohlášení, spusťte jakýkoli docker příkaz na konci této sekce (během testování) s -l debug vlajka. Tím se vytiskne přesný příkaz, který se provádí na vašem místním počítači.

Předpoklady

Předpoklady pro tuto konfiguraci jsou následující:

1. Ověření pomocí veřejného klíče SSH

Mezi zúčastněnými počítači musíte mít povoleno ověřování pomocí veřejného klíče SSH. Zde je stručná rekapitulace toho, jak to můžete udělat,

  1. Použijte příkaz ssh-keygen k vygenerování páru veřejného a soukromého klíče.
  2. Použijte ssh-copy-id [email protected] příkaz pro zkopírování veřejného klíče na vzdálený server.
  3. Ujistěte se, že PubKeyAuthentication je nastaveno na yes ve vzdáleném konfiguračním souboru SSHD. Dále doporučuji vypnout ověřování heslem (nastavte PasswordAuthentication na no ).
Jak přidat veřejný klíč SSH na server autentizace pomocí veřejného klíče umožňuje přístup k serveru přes SSH bez hesla. Zde jsou dva způsoby, jak zkopírovat veřejný klíč ssh na server. Linux HandbookAbhishek Prakash

2. Přihlašující se uživatel musí být ve skupině dockeru

Protože se vlastně přihlašujete jako nějaký uživatel a požadujete docker server nějaké informace nebo něco udělat, musí mít vzdálený uživatel (jakožto se přihlašujete) dostatečná oprávnění k odeslání požadavku přes "místní DOCKER_HOST" vzdáleného uživatele (což je, jak bylo uvedeno dříve, většinou /var/run/docker.sock ). Toto oprávnění můžete získat přidáním tohoto vzdáleného uživatele do docker skupina.

Tím "vzdálený místní DOCKER_HOST" myslím místní DOCKER_HOST vzdáleného serveru.

To může být pro mnohé, jako jsem já, problém, protože já osobně nemám rád používání docker skupina pro sudo -méně provedení.

Pomocí příkazu usermod můžete přidat existujícího uživatele do docker skupina.

sudo usermod -aG docker [username]

Změny konfigurace ve vašem místním systému

Zde jsou věci, které potřebujete vyladit na vašem místním osobním systému, odkud budete ovládat docker servery.

1. Změňte DOCKER_HOST v místním systému

Věřte nebo ne, ale tady se dá dělat jen jedna věc. Nastavte proměnnou prostředí DOCKER_HOST na správnou kombinaci vzdáleného uživatelského jména, IP serveru a portu, na kterém běží sshd. Takhle:

DOCKER_HOST=ssh://[email protected]:22

Případně můžete také použít -H příznak, jako jsem to udělal zde pomocí docker příkaz

docker -H ssh://[email protected] info

Místo toho můžete v Linuxu přidat alias takto:

alias docker="docker -H ssh://[email protected]:22"

Otestujte konfiguraci

Nezáleží na tom, pro kterou metodu jste se rozhodli (proměnná prostředí nebo alias), otestování je jen otázkou spuštění jednoduchého příkazu dockeru, jako je docker info .

Zkuste také spustit docker -l debug info a všimněte si provádění příkazu.

Metoda 2:Použití veřejného portu TCP s ověřováním TLS

Tato metoda je složitější než předchozí, ale má své výhody, jako je, že nemusíte používat docker skupina vůbec.

Myšlenka je jednoduchá, vytvoříte si vlastní certifikáty a soukromé klíče a poté použijete port TCP pro přístup k docker démona přes ne prostý HTTP, ale zabezpečený HTTPS kanál.

Je to obdoba webové stránky. V případě webové stránky jej nakonfigurujete s webovým serverem tak, aby používal různé klíče a certifikáty, které později prohlížeč potvrdí, že jsou platné, a jsou ověřeny nějakou důvěryhodnou organizací (jako je Let's Encrypt nebo DigiCert). Jakmile je toto ověření provedeno, zašifrované požadavky HTTP jsou odeslány na webový server, aby získal potřebná data.

Podobně zde namísto tradičního webového serveru budete konfigurovat docker server démona používat určité certifikáty a soukromé klíče. Proto, kdykoli se někdo chystá odeslat požadavek na server démona, prvním krokem je zajistit, aby účastníci byli důvěryhodní, pokud má klient stejný certifikát CA a certifikáty jsou podepsány touto CA, bude navázáno spojení. a klient bude moci odesílat [šifrované] požadavky na server.

Příprava certifikátů a klíčů

V následujících krocích vygenerujete certifikáty a soukromé klíče pro váš server a klienta.

Certifikační autorita

Aby byly transakce jednoduché, budu k generování všech souborů používat svůj klientský počítač. V případě potřeby k tomu můžete použít samostatný stroj. Certifikát CA není nic jiného než certifikát s vlastním podpisem.

Nejprve však musíte vygenerovat soukromý klíč vaší CA. Použijte k tomu následující příkaz

openssl genrsa -aes256 -out ca-key.pem 4096

Rozeberme si příkaz:

  • genrsa :Tato možnost říká openssl vygenerovat soukromý klíč na základě algoritmu RSA.
  • -aes256 :Toto zašifruje soukromý klíč pomocí uživatelského hesla pomocí 256bitového AES. AES je jednoduše šifrovací technika (Advanced Encryption Standard).
  • -out :Určuje název výstupního souboru.
  • Nakonec jsem uvedl délku klíče (v bitech).

Zadejte heslo pro zabezpečení klíče. Dále vytvoříte certifikát pro vaši CA, který bude podepsán klíčem, který jste právě vytvořili. Vytvořte jej pomocí následujícího příkazu:

openssl req -x509 -new -key ca-key.pem -days 365 -subj '/CN=CertificateAuthority' -out ca-cert.pem

Mnohým se to může zdát jako záhada, jako co přesně to dělá? Dovolte mi to pro vás rozebrat:

  • požadavek :Tato možnost se používá především pro vytváření CSR. Zde jej používáme k vytvoření certifikátu s vlastním podpisem.
  • -x509 :Toto říká openssl vygenerovat podepsaný certifikát namísto CSR.
  • nové :Toto vytvoří nový požadavek na certifikát a požádá uživatele o příslušné hodnoty polí.
  • -klíč :Klíč, který bude použit.
  • -dny :Platnost certifikátu ve dnech.
  • -subj :Místo toho, abychom byli vyzváni k zadání každého jednotlivého detailu, přiřadíme příslušné hodnoty polí přímo pomocí této možnosti. Zde jsem nastavil pouze Common Name. Tento příznak můžete vynechat a budete dotázáni na každý jednotlivý detail.
  • -out :Výstupní název souboru.

Po zobrazení výzvy zadejte přístupovou frázi pro klíč.

Docker server

Dále musíte vygenerovat certifikáty a soukromé klíče vašeho serveru.

Za tímto účelem nejprve vytvoříte CSR, žádost o podpis certifikátu a poté bude podepsána CA. Nejprve vygenerujte soukromý klíč:

openssl genrsa -out server-key.pem 2048

Syntaxe je stejná, jako jste použili dříve, s výjimkami. Za prvé, tentokrát nešifrování klíče. Protože ostatní programy budou muset číst tento soubor bez dozoru, pokud je zašifrován, budete čelit některým chybám. Za druhé, délka klíče je zde 256 bajtů. Rozhodl jsem se pro delší klíč pro CA. Stejnou délku můžete použít i pro tento, to vám ukáže různé možnosti, které máte k dispozici.

Dále vygenerujte CSR:

openssl req -new -key server-key.pem -subj '/CN=docker-host' -out server.csr
Upravte /etc/hosts a přidejte IP hostitele Docker s konstantním názvem hostitele. Toto budete muset přidat všem svým klientům, kteří chtějí získat přístup k tomuto hostiteli. Pokud má tento hostitel ke své IP přiřazený úplný název domény, můžete jej použít. Plně kvalifikovaný název domény FQDN je název domény, který je přidružen k vaší IP na serverech DNS. Toto není váš místní název hostitele. FQDN se překládá na vaši IP nejen ve vaší LAN, ale kdekoli na světě, pokud je součástí veřejného DNS záznamu a překladač používá tento DNS server.

Příznaky jsou stejné, jaké jste použili při generování certifikátu CA. Zde nemám -x509 příznak, protože se nejedná o certifikát podepsaný svým držitelem, vaše CA tento certifikát podepíše. Proto to podepište,

openssl x509 -req -days 365 -in server.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile <(echo "extendedKeyUsage = serverAuth") -out server-cert.pem
  • x509 :Tato možnost se používá k podepisování CSR.
  • -req :Tato možnost je k dispozici pro openssl očekávat CSR.
  • -in :Předá soubor CSR.
  • Možnosti -CA , -CAkey bere certifikát CA a klíč CA jako argumenty.
  • -CAcreateserial :S touto volbou openssl vytvoří soubor se sériovým číslem CA, pokud ještě neexistuje.
  • -extfile :Předá soubor obsahující přípony certifikátu k použití. Zde jsem použil extendedKeyUsage rozšíření.

Nyní byste měli mít serverový certifikát podepsaný CA server-cert.pem a soukromý klíč serveru server-key.pem .

Klient Docker

Nyní musíte nastavit svého dockerového klienta. Postup je trochu stejný jako předtím. Vytvořte soukromý klíč> vygenerujte CSR> podepište toto CSR pomocí vaší CA.

Pro přehlednost je zde ještě zdokumentuji. Vygenerujte soukromý klíč:

openssl genrsa -out client-key.pem 2048   

Dále vygenerujte CSR:

openssl req -new -key client-key.pem -subj '/CN=docker-client' -out client.csr

Zde zadejte název hostitele vašeho klienta pro hodnotu CN. Nakonec podepište CSR:

openssl x509 -req -days 365 -in client.csr -CA ca-cert.pem -CAkey ca-key.pem -CAcreateserial -extfile <(echo "extendedKeyUsage = clientAuth") -out client-cert.pem

Zde je jediným rozdílem hodnota rozšíření „extended key use“. Mám clientAuth místo serverAuth . Po zobrazení výzvy zadejte své přístupové heslo.

Nastavení prostředí

Jakmile jsou certifikáty a soukromé klíče připraveny, musíte o nich svému dockerovému enginu a klientovi sdělit a zároveň vystavit rozhraní API enginu veřejnému portu TCP a nechat klienta používat dokovací stroj, který není umístěn na místním počítači.

Následující kroky projdou přesně tím.

Hostitel dokovacího zařízení

Nejprve zkopírujte tři soubory z počítače správce, certifikát CA (ca-cert.pem ), soukromý klíč tohoto hostitele (server-key.pem ) a certifikát podepsaný CA (server-cert.pem). ). Vytvořte adresář /etc/docker/certs pro uchování těchto souborů.

sudo mkdir /etc/docker/certs

Dále otevřete konfigurační soubor démona a přidejte následující (konfiguraci najdete v /etc/docker/daemon.json ):

{
    "tlsverify": true,
    "tlscacert": "/etc/docker/certs/ca-cert.pem",
    "tlscert": "/etc/docker/certs/server-cert.pem",
    "tlskey": "/etc/docker/certs/server-key.pem",
    "host": "tcp://0.0.0.0:2376"
}

Poslední možnost říká démonovi, aby naslouchal TCP portu 2376. Uložte soubor a restartujte docker.

sudo systemctl restart docker
Zatímco tým stojí za docker doporučuje k tomu použít port 2376, teoreticky můžete použít jakýkoli jiný nepoužívaný/nerezervovaný port.

Klient

Nastavení na straně klienta je pravděpodobně jednodušší. Vytvořte adresář ~/.docker :

mkdir ~/.docker

Uvnitř tohoto adresáře umístěte tři soubory se správnými názvy, jako níže (jména, která jsme použili dříve v tomto článku, jsou umístěna uvnitř těchto závorek)

  • ca.pem :Certifikát CA (ca-cert.pem ).
  • key.pem :Soukromý klíč klienta (client-key.pem ).
  • cert.pem :Certifikát klienta (client-cert.pem ).

Dále nastavte dvě proměnné prostředí

  • DOCKER_HOST Nastavte hodnotu této proměnné na tcp://docker-host:2376 . Použijte název hostitele, který jste nastavili v /etc/hosts soubor pro odpovídající hostitele/ip.
  • DOCKER_TLS_VERIFY Nastavte toto na 1.

Můžete použít ~/.bashrc pro automatickou konfiguraci. Pomocí příkazu export nastavte tyto proměnné:

export DOCKER_HOST=tcp://docker-host:2376
export DOCKER_TLS_VERIFY=1
Pro název hostitele použijte opět příslušnou hodnotu z /etc/hosts . Máte-li pro tuto IP adresu FQDN, použijte ji.

Otestujte nastavení

Nyní, když je vše hotovo, můžete to otestovat spuštěním docker info nebo spusťte libovolný náhodný kontejner, podle toho, co vás napadne. Můžete také použít curl to otestovat (Pamatujete si? ​​Toto jsou jednoduché HTTP požadavky). Následující použijte jako alternativu k docker info

curl https://docker-host:2376/info --cert ~/.docker/cert.pem --key ~/.docker/key.pem --cacert ~/.docker/ca.pem

Výsledkem bude objekt JSON, který můžete analyzovat pomocí něčeho jako jq . Můžete také zkusit spustit server Nginx s dockerem a zjistit, na kterém systému je spuštěn. Protože se vizuálně zdá, že na vašem místním systému běží docker, toto je ukázkový příklad/test, který můžete provést. Jednoduše spusťte

docker run -d --rm --name remote_nginx -p 8080:80 nginx:latest

Nyní použijte curl zkontrolovat localhost i vzdálenou IP. První localhost,

curl http://localhost:8080

Měli byste vidět výstup jako tento

curl: (7) Failed to connect to localhost port 8080: Connection refused

Nyní zkuste to samé se vzdálenou IP,

curl http://docker-host:8080

Měli byste tam vidět web šablony nginx. Můžete také jednoduše použít prohlížeč k procházení těchto umístění, místního hostitele a vzdáleného hostitele.

Jakou metodu použít? TCP nebo SSH?

Obě metody mají své výhody. Metoda SSH je jednodušší, pokud nechcete procházet mnoha obručemi. Některé aplikace jako Portainer však nebudou pracovat s metodou SSH pro vzdálený přístup k démonu. Použití metody TCP také eliminuje problémy s "používáním nebo nepoužíváním skupiny dockerů" ve výchozím nastavení. Vyberte metodu, která vyhovuje vašemu účelu.

Doufám, že tento tutoriál byl užitečný a informativní. Pokud máte nějaké dotazy, dejte mi vědět v komentářích níže.


Docker
  1. Jak udržet kontejnery Docker v chodu, když se démon zastaví

  2. Jak a proč používat vzdáleného hostitele dockeru

  3. Jak hodnotit zabezpečení Docker Engine

  1. Jak nastavit OpenCL pro GPU na Linuxu a Dockeru [Kompletní průvodce]

  2. Jak nastavit vzdálený přístup k Docker Daemon

  3. Jak získat přístup k síťovému jmennému prostoru Docker Container z hostitele

  1. Jak používat možnosti vzdáleného přístupu GNOME Boxes

  2. Jak nastavit VPN pro vzdálený přístup Bare Metal Cloud

  3. Jak nastavit Docker v systému Windows pro Linux (WSL2) v systému Windows 10