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,
- Použijte příkaz
ssh-keygen
k vygenerování páru veřejného a soukromého klíče. - Použijte
ssh-copy-id [email protected]
příkaz pro zkopírování veřejného klíče na vzdálený server. - Ujistěte se, že
PubKeyAuthentication
je nastaveno nayes
ve vzdáleném konfiguračním souboru SSHD. Dále doporučuji vypnout ověřování heslem (nastavtePasswordAuthentication
nano
).
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.