Pokud jsou kontejnery izolované, jak mohou komunikovat s hostitelským počítačem, třeba kvůli ukládání dat? Protože když vytvoříme kontejner z obrázku, všechna vygenerovaná data se při odstranění kontejneru ztratí.
Takže potřebujeme způsob, jak mít trvalé úložiště.
Můžeme tak učinit pomocí Bind Mounts a Svazky .
Mezi těmito dvěma není velký rozdíl, kromě toho, že Bind Mounts může ukazovat na libovolnou složku na hostitelském počítači a nejsou spravovány přímo Dockerem.
Začněme s nimi. Jedním z klasických příkladů jsou protokoly. Předpokládejme, že vaše aplikace vytvoří soubor protokolu v kontejneru v /usr/src/app/logs
. Můžete to namapovat do složky na hostitelském počítači pomocí -v
(stejné jako --volume
) příznak při spuštění kontejneru pomocí docker run
, například takto:-v ~/logs:/usr/src/app/logs
Tím se tato složka namapuje na podsložku logs v domovském adresáři uživatele.
Uzel:
-m
nebo--mount
flag funguje velmi podobným způsobem
Toto je příznak používaný s examplenode
obrázek, který jsme vytvořili dříve:
docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode
Nyní tedy můžeme spustit naši aplikaci Node a jakýkoli protokol bude uložen v hostitelském počítači, nikoli v kontejneru Docker.
Všimněte si, že
examplenode
aplikace negeneruje žádné přihlášení/usr/src/app/logs
, je to jen příklad a toto přihlašování byste museli nejprve nastavit.
Podrobnosti o svazku budou uvedeny, když spustíte docker inspect
u názvu kontejneru v části „Mounts“:
"Mounts": [
{
"Type": "bind",
"Source": "/Users/flavio/logs",
"Destination": "/usr/src/app/logs",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
Vidíte "Type": "bind"
? To znamená, že jsme vytvořili bind mount .
Nyní si promluvme o svazcích .
Rozdíl mezi Bind Mounts a Volumes spočívá v tom, že vytvořením svazků bude Docker ukládat data do složky, kterou spravuje, což znamená, že se bude starat o oprávnění k souborům a vlastnictví, a poskytne vám nástroje pro správu těchto svazků. Zatímco připojení připojení jsou založena na cestách souborového systému a Docker kolem nich nemůže poskytnout nástroje.
Docker vám například umožňuje odstranit všechny nepoužívané svazky spuštěním docker volume prune
nebo docker system prune --volumes
.
Chcete-li vytvořit svazek, musíme nejprve spustit docker volume create
:
docker volume create logs
Nyní můžete použít docker volume ls
a docker volume inspect
Chcete-li získat další data o systémových svazcích:
Nyní spusťte docker run
s volbou -v logs:/usr/src/app/logs
(sdělte název svazku místo složky)
docker run -d -p 80:3000 -v logs:/usr/src/app/logs --name node-app examplenode
Nyní běží docker inspect
na obrázku se zobrazí připojený svazek:
"Mounts": [
{
"Type": "volume",
"Name": "logs",
"Source": "/var/lib/docker/volumes/logs/_data",
"Destination": "/usr/src/app/logs",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],
Vidět? Nyní budou protokoly uloženy v /var/lib/docker/volumes/logs/_data
složka.
Objemy budou zásadní, když bude čas například nasadit kontejner v cloudové službě.
Svazek se spuštěným docker volume rm <name>
můžete odebrat .