I když je Docker užitečný nástroj pro balení a správu aplikací, představuje také mnoho jedinečných výzev, jako je například zacházení s uloženými daty. Obvykle přidáváte svazky do kontejnerů ve skriptu pro vytváření, ale co když potřebujete vytvořit nové?
Přidání svazku do běžícího kontejneru dockeru
Bohužel to není tak jednoduché, jako pouhé přidání nového svazku. Kontejnery musí mít své svazky nakonfigurovány při spuštění, což znamená, že chcete-li přidat nový svazek, musíte kontejner restartovat. I když existuje osvědčené řešení (více o něm níže), důrazně se doporučuje restart kontejneru provést tak jako tak.
Je to z několika důvodů. Restartování kontejneru je poměrně snadné a většina aktualizací kódu stejně vyžaduje restart služby. Sledování aktualizací v Gitu je dalším velkým faktorem, zvláště pokud používáte Docker Compose, a úprava spouštěcího skriptu je mnohem lepší než ruční přidávání svazku do běžícího kontejneru.
Pokud je vaše služba dostatečně velká, abyste se obávali několika minut (maximálně) možného plánovaného výpadku pro restartování kontejneru, pravděpodobně byste měli spustit škálovací nasazení s více instancemi, které lze aktualizovat nezávisle. Moderní systémy automatického škálování by měly být navrženy tak, aby to zvládly, protože k nasazování kódu dochází často.
Pokud chcete přidat svazek, budete muset zastavit běžící kontejner:
docker stop my_container
Vytvořte nový svazek, pokud potřebujete:
docker volume create nginx-config
A pak jej spusťte pomocí aktualizovaného příkazu spuštění, který přidá --mount
příznak pro konfiguraci zdrojového svazku a cílového cíle.
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx nginx:latest
Pokud používáte Docker Compose, můžete tento proces automatizovat a sledovat snadněji, protože konfigurace svazku je řešena prostřednictvím souboru nastavení. budete muset přidat svazek do docker-compose.yml
soubor:
version: "3.0" services: web: image: nginx:latest ports: - "80:80" volumes: - /docker/nginx-config/:/etc/nginx/
Poté můžete restartovat služby Docker Compose. Compose má příkaz „restart“, ale ve skutečnosti slouží pouze k obnovení běžící služby bez jakýchkoli změn konfigurace. Pokud chcete obrázky aktualizovat, budete muset spustit docker-compose up
pomocí --build
příznak:
docker-compose up -d --build
Můžete také ručně spustit docker-compose down
předem zastavit služby, ale ve většině případů to není nutné, pokud je nechcete spouštět pomocí -v
příznak zničit existující svazky.
SOUVISEJÍCÍ: Co je Docker Compose a jak jej používáte?
Klonování ze stávajícího kontejneru
Téměř ve všech případech byste neměli být závislí na aktuálním provozním stavu kontejneru. Vše, na čem vám záleží, jako jsou data aplikací, by mělo být uloženo na svazku, aby to bylo možné přetrvávat při restartování a přestavbě kontejneru.
Tato metoda pravděpodobně není pro většinu lidí dobrý nápad, protože vyžaduje, abyste pokaždé, když to chcete udělat, vytvořili nový obrázek, a stále to vyžaduje prostoje. Pokud však potřebujete přidat svazek do běžícího kontejneru, můžete použít docker commit
vytvořit nový obrázek založený na tomto kontejneru a poté jej naklonovat s novým svazkem.
Získejte ID kontejneru z docker ps
:
docker ps
A poté jej naklonujte pomocí commit
:
docker commit f88f33c918d2 imagename
Poté můžete spustit nový obraz a nahradit starý obraz klonovaným.
docker run -d --name devtest --mount source=nginx-config,target=/etc/nginx imagename
Hacky řešení
Svazky Dockeru jsou ve skutečnosti jen triky, které runtime Docker používá k vystavení hostitelských adresářů kontejnerům, a vše závisí na konfiguraci. Z tohoto důvodu můžete skutečně upravit tuto konfiguraci přímo a restartovat celého démona Docker pro váš systém, aby se tyto změny použily, aniž byste museli restartovat.
To je samozřejmě mnohem složitější než pouhé řešení restartu kontejneru, takže pokud zvládnete minutu výpadku, důrazně doporučujeme udělat to.
Budete muset přejít do adresáře úložiště Docker:
cd /var/lib/docker/containers
Zde bude mnoho složek odpovídajících ID kontejnerů Docker, které můžete najít pomocí docker ps
. Otevřete ten pro kontejner, který chcete upravit.
Konfigurační soubor je config.v2.json
, ale je v kompaktním formátu a těžko se upravuje. Můžete nainstalovat jq
pěkně vytiskněte JSON na příkazovém řádku a přeneste jej do nového souboru pro úpravy:
jq . config.v2.json > tmp.json
Budete se muset posunout dolů a najít „MountPoints“, který obsahuje konfiguraci pro všechny svazky a připojení připojení. Zde můžete přidat nový, který by měl být v následujícím formátu:
"MountPoints": { "/home/container": { "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Destination": "/home/container", "RW": true, "Name": "", "Driver": "", "Type": "bind", "Propagation": "rprivate", "Spec": { "Type": "bind", "Source": "/var/lib/pterodactyl/volumes/c7fb3a04-e540-48a7-9704-13987f52e933", "Target": "/home/container" }, "SkipMountpointCreation": true } },
Poté, jakmile to bude hotové, můžete JSON znovu minifikovat zpět do konfiguračního souboru:
jq -c . tmp.json > config.v2.json
jq
je výkonný nástroj, takže pokud byste chtěli tento proces zcela automatizovat, můžete to udělat.
SOUVISEJÍCÍ: Jak pracovat s JSON na příkazovém řádku
Poté jednoduše restartujte službu Docker, abyste použili změny:
sudo service docker restart