Conversation with Merlin [email protected] · Mon Nov 06 2023

Ahoj, jsi expert na počítače. Chci spustit docker jako službu na pozadí, aby byla dostupná pro všechny uživatele. Používám Windows Server. K nasazení používám docker compose a jde o image, která je postavený na linuxu. Jak to udělat, aby docker běžel dál, i když se ze serveru jako uživatel odhlásím ?

Ahoj! Ano, rád ti pomohu s tvou otázkou. Na Windows Serveru můžeš spustit Docker jako službu na pozadí pomocí nástroje Docker Desktop. Postupuj podle následujících kroků:

  1. Ujisti se, že jsi přihlášen jako správce na Windows Serveru.

  2. Nainstaluj Docker Desktop na server. Můžeš ho stáhnout z oficiální stránky Dockeru a následovat instalaní průvodce.

  3. Po úspěšné instalaci Docker Desktopu oteři jeho nastavení a zvol možnost "Expose daemon on tcp://localhost:2375 without TLS" (Vystav démon na tcp://localhost:2375 bez TLS). T krok umožníunikaci sem přes TCP.

  4. Restartuj Docker Desktop, aby se změny projevily.

  5. Otevři PowerShell nebo příkazový řádek a spusťásledující příkaz, aby se vytvořil prostorový soubor s informacemi o Dockeru:

    notepadprofile
  6. Do otevřého soub vlož následující příkaz:

    [Environment]::SetEnvironmentVariable("DOCKER_HOST", "tcp://0.0.0.0:2375", "Machine") `

  7. Ulož a zavři soubor.

  8. Restartuj PowerShell nebo příkazový řádek, aby se změny projevily.

  9. Nyní můžeš spustit Docker Compose v pozadí tak, aby byl dostupný pro všechny uživatele. Použij násující příkaz:

    docker-compose up -d

`

Tímto způsobem byěla být tvoje služba Dockeru spuštěna jako pozadí a stále bude běžet, i když se odhlásíš ze serveru. Ostatní uživatelé budou moci přistupovat ke službě pomocí TCP adresy serveru a portu 2375.

Pamatuj, že bezpečnostní aspektyou důžité. Představení autentizace a autorizace je doporučeno, aby se zabránilo neoprávněnému přístupu k Docker daemonovi.

Doufám, že ti tyto informace pomohou. Pokud máš další otázky, neváhej se zeptat!

U kroku č. 5, co je myšlenou proměnnou $profile ? Můžeš mi to více objasnit ?

Jistě, rád to objasním. PowerShellu, $profile je speciální proměnná, která odkazuje na konfigurační soubor daného uživatele. Tento soubor lze upravit a přidat do něj různé skripty nebo funkce, které se automaticky spustí při spuště PowerShellu.

Pokud zadáš "notepad $profile" v PowerShellu, otevře se tvůj uživatelský PowerShell profil v textovém editoru Not. Pokud soubor dosud neexistuje, PowerShell ti nabídne že ho vytvoří.

Když do tohoto souboru přidáš řádek "[Environment]::SetEnvironmentVariable("DOCKER_HOST", "tcp://0.0.0.0:2375", "Machine")", definuješ tak systémovou proměnnou DOCKER_HOST. Tato proměnná se automaticky nastaví při každém startu PowerShellu, což umožní spouštění Dockeru v pozadí na určeném portu.

Doufám, že to pomáhá. Děkujeme ti za tvoji otázku!

Jak mohou ostatní uživatelé přistupovat ke službě na 2375, když aplikace běží např. na portu 80 ?

Předně je důležité rozlišovat mezi portem, na kterém běží Docker démon - v tomto případě port 2375 - a portem, na kterém běží konkrétní aplikace v rámci Docker kontejneru, jako například webový server na portu 80.

Port 2375 je port, na kterém běží Docker démon a je používán pro Docker Remote API. Přistupování k tomuto portu znamená přistupování k ovládacímu rozhraní Dockeru, kde můžete spouštět příkazy pro správu Dockeru, vytváření a správu Docker kontejnerů atd.

Na druhé straně, pokud máte nějakou aplikaci (například webový server) běžící v Docker kontejneru na portu 80, ten port je viditelný pouze vnitřně v rámci toho kontejneru. Aby byl tento port dostupný z vnější sítě, musí být nastaveno předání portu (port forwarding) při spuštní kontejneru. Příkaz by mohl vypadat nějak takto: docker run -p 8080:80 mywebserver, kde 8080 je port na hostitelském stroji a 80 je port ve vašem kontejneru. Po zavení kontejneru se tyto otevřené porty zavřouTedy, ostatní uživatelé přistupují ke konkrétní službě v kontejneru (na portu 80 například) skrze port na hostitelském stroji, který je nasměrovaný na port kontejneru.

Docker démon na portu 2375 zprostředkovává správu kontejnerů a ne zpřístupňuje samotné aplikace běžící v kontejnerech.

Jak tedy mohu volat příkazy dockeru přes port 2375 ?

Vzdálený přístup k Dockeru prostřednictvím Docker Remote API je možný přes port 2375.

Docker Remote API umožňuje provádění těch samých operací, které bys mohl provést pomocí Docker CLI, jako je například správa kontejnerů, obrazů atd.

Pro provedení příkazů Dockeru přes TCP/IP je potřeba použít HTTP nebo HTTPS protokol. K tomu můžeš použít například aplikace jako curl nebo wget, nebo jakýkoli jiný nástroj schopný odesílat HTTP požadavky.

Následuje příklad, jak volat Docker API přes port 2375 pomocí nástroje curl:

curl http://localhost:2375/containers/json

Tento příkaz vrátí seznam všech kontejnerů v JSON formátu.

Bezpečnost je důležitá - port 2375 je standardně otevřený bez jakéhokoliv zabezpečení. Je proto silně doporučeno nasadit nějakou formu autentizace nebo šifrování (například použití HTTPS) při použití Docker Remote API.