Zachování dat

Pokud jste si toho nevšimli, seznam úkolů se při každém spuštění kontejneru vymaže. Proč? Pojďme se se ponořit do toho, jak kontejner funguje.

Systém souborů kontejneru

Při spuštění kontejneru používá různé vrstvy z image pro svůj systém souborů. Každý kontejner také získá vlastní "pomocné místo" pro vytváření, aktualizaci nebo odebírání souborů. Žádné změny se v jiném kontejneru nezískaou, ani když používají stejnou image.

Podívejte se na tento postup v praxi.

Abyste to viděli v akci, spustíte dva kontejnery a v každém z nich vytvoříte soubor. Uvidíte, že soubory vytvořené v jednom kontejneru nejsou dostupné v jiném kontejneru.

  1. Spusťte ubuntu kontejner, který vytvoří soubor s náhodným číslem v rozmezí od 1 do /data.txt 10 000.

    docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
    

    V případě, že vás příkaz zajímá, spouštíte prostředí Bash a vyvoláte dva příkazy (proč má && ). První část vybere jedno náhodné číslo a zapíše ho do /data.txt . Druhým příkazem je jednoduše sledovat soubor, aby kontejner běžel.

  2. Ověřte, že se výstup zobrazí pomocí exec příkazu , abyste se mohli dostat do kontejneru. Pokud to chcete udělat, otevřete VS Code a klikněte na možnost Attach Shell (Připojit prostředí). Tento příkaz použije exec k otevření prostředí v kontejneru v VS Code terminálu.

    VS Code rozhraní příkazového řádku v kontejneru Ubuntu

    Zobrazí se terminál s prostředím v kontejneru Ubuntu. Spuštěním následujícího příkazu zobrazte obsah /data.txt souboru. Zavřete tento terminál znovu.

    cat /data.txt
    

    Pokud dáváte přednost příkazovému řádku, můžete k tomu použít docker exec příkaz . Pomocí následujícího příkazu potřebujete získat ID kontejneru (použijte k jeho získání) a docker ps obsah.

    docker exec <container-id> cat /data.txt
    

    Mělo by se zobrazit náhodné číslo.

  3. Teď spusťte další kontejner (stejnou image) a uvidíte, že ubuntu nemáte stejný soubor.

    docker run -it ubuntu ls /
    

    A podívejte se! Není tam žádný data.txt soubor! Je to proto, že byla zapsána do pomocného prostoru pouze pro první kontejner.

  4. Pokračujte odebráním prvního kontejneru pomocí docker rm -f příkazu .

Svazky kontejnerů

U předchozího experimentu jste viděli, že každý kontejner začíná při každém spuštění z definice image. Kontejnery sice mohou vytvářet, aktualizovat a odstraňovat soubory, ale při odebrání kontejneru se tyto změny ztratí a všechny změny jsou v tomto kontejneru izolované. U svazků to všechno můžete změnit.

Svazky umožňují připojit konkrétní cesty systému souborů kontejneru zpět k hostitelskému počítači. Pokud je adresář v kontejneru připojen, změny v tomto adresáři se také prohlédněte na hostitelském počítači. Pokud k restartování kontejneru připojíte stejný adresář, zobrazí se stejné soubory.

Existují dva hlavní typy svazků. Nakonec použijete oba svazky, ale začnete s pojmenovaných svazků.

Zachování dat seznamu todo

Ve výchozím nastavení aplikace seznamu obsahuje data v databázi SQLite na /etc/todos/todo.db adrese . Pokud NEJSTE obeznámeni s SQLite, nemusíte mít obavy! Je to jednoduše relační databáze, ve které jsou všechna data uložená v jednom souboru. I když to není to nejlepší pro rozsáhlé aplikace, funguje pro malé ukázky. O přepnutí na skutečný databázový stroj se budeme mluvit později.

Když je databáze jediným souborem, pokud můžete tento soubor zachovat na hostiteli a zajistit jeho přístup k dalšímu kontejneru, měla by být schopná najít poslední soubor. Vytvořením svazku a jeho připojením (často nazývaným "připojení") k adresáři, ve které jsou data uložená, můžete data zachovat. Když kontejner zapisuje do souboru , zachová se na todo.db hostiteli ve svazku.

Jak už bylo zmíněno, použijete pojmenovaný svazek. Pojmenovaný svazek si představte jednoduše jako kbelík dat. Docker udržuje fyzické umístění na disku a potřebujete si pamatovat pouze název svazku. Pokaždé, když svazek použijete, Docker zajišťuje, aby byla poskytnuta správná data.

  1. Vytvořte svazek pomocí docker volume create příkazu .

    docker volume create todo-db
    
  2. V zobrazení Dockeru (nebo s ) znovu zastavte kontejner aplikace seznamu todo, protože je stále spuštěný bez docker rm -f <id> použití trvalého svazku.

  3. Spusťte kontejner aplikace seznamu todo, ale přidejte -v příznak pro určení připojení svazku. Použijete pojmenovaný svazek a připojíte ho k , který zachytí /etc/todos všechny soubory vytvořené v cestě.

    docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
    
  4. Po spuštění kontejneru otevřete aplikaci a přidejte do seznamu úkolů několik položek.

    Položky přidané do seznamu úkolů

  5. Odeberte kontejner pro aplikaci todo. Pomocí zobrazení Dockeru nebo docker ps získejte ID a pak docker rm -f <id> ho odeberte.

  6. Pomocí stejného příkazu výše spusťte nový kontejner.

  7. Spusťte aplikaci. Položky by se měly stále zobrazit v seznamu.

  8. Až se seznamem skončíte, odeberte kontejner.

Hurá! Naučili jste se, jak zachovat data.

Tip

Zatímco pojmenované svazky a připojení vazeb (o kterých se budeme za minutu mluvit) jsou dva hlavní typy svazků, které podporuje výchozí instalace modulu Dockeru, existuje mnoho modulů plug-in pro ovladače svazků, které podporují NFS, SFTP, NetApp a další. To bude zvlášť důležité, jakmile začnete s provozem kontejnerů na více hostitelích v clusterovaném prostředí se Swarmem, Kubernetes atd.

Ponořte se do objemu

Spousta lidí se často ptá: "Kde Docker ve skutečnosti ukládá moje data, když používám pojmenovaný svazek?" Pokud chcete vědět, můžete použít docker volume inspect příkaz .

docker volume inspect todo-db
[
    {
        "CreatedAt": "2019-09-26T02:18:36Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/todo-db/_data",
        "Name": "todo-db",
        "Options": {},
        "Scope": "local"
    }
]

Mountpointje skutečné umístění na disku, kde jsou data uložena. Všimněte si, že na většině počítačů budete potřebovat přístup uživatele root, abyste k tomuto adresáři měli přístup z hostitele. Ale tady to je!

Poznámka

Přímý přístup k datům svazku v Docker Desktopu Při spouštění v Docker Desktopu se příkazy Dockeru ve skutečnosti schová v malém virtuálním počítači na vašem počítači. Pokud byste se chtěli podívat na skutečný obsah adresáře Mountpoint, musíte se nejprve dostat do virtuálního počítače. Ve WSL 2 se nachází uvnitř distribuce WSL 2 a je přístupný prostřednictvím Průzkumník souborů.

Rekapitulace

V tuto chvíli máte funkční aplikaci, která dokáže restartování vytrvat. Můžete to ukázat investoři a doufáme, že vaši vizi zachytí!

Už jste ale viděli, že opětovné sestavení obrázků pro každou změnu trvá poměrně dlouho. Musí být lepší způsob, jak provádět změny, že? S připojeními vazby (které jsme naznačili dříve) existuje lepší způsob! Pojďme se na to podívat!

Další kroky

Pokračujte kurzem!