Kurz: Uchování dat v aplikaci kontejneru pomocí svazků ve VS Code

V tomto kurzu se naučíte uchovávat data v kontejnerové aplikaci. Když je spustíte nebo aktualizujete, budou data stále k dispozici. Existují dva hlavní typy svazků, které slouží k uchování dat. Tento kurz se zaměřuje na pojmenované svazky.

Dozvíte se také o připojeních vazby, které řídí přesný přípojný bod na hostiteli. Připojení vazby můžete použít k zachování dat, ale do kontejnerů může také přidat další data. Při práci na aplikaci můžete pomocí připojení vazby připojit zdrojový kód ke kontejneru, abyste viděli změny kódu, odpověděli a okamžitě viděli změny.

Tento kurz také představuje vrstvení obrázků, ukládání vrstev do mezipaměti a vícefázové sestavení.

V tomto kurzu se naučíte:

  • Seznamte se s daty napříč kontejnery.
  • Zachování dat pomocí pojmenovaných svazků
  • Použijte připojení vazby.
  • Zobrazit vrstvu obrázku
  • Závislosti mezipaměti.
  • Seznamte se s vícefázovým sestavením.

Požadavky

Tento kurz pokračuje v předchozím kurzu: Vytvoření a sdílení aplikace Dockeru pomocí editoru Visual Studio Code. Začněte s tím, co zahrnuje požadavky.

Principy dat napříč kontejnery

V této části spustíte dva kontejnery a v každé z nich vytvoříte soubor. Soubory vytvořené v jednom kontejneru nejsou dostupné v jiném.

  1. Spuštění kontejneru ubuntu pomocí tohoto příkazu:

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

    Tento příkaz spustí dva příkazy pomocí .&& První část vybere jedno náhodné číslo a zapíše ho do /data.txt. Druhý příkaz sleduje soubor, aby kontejner zůstal spuštěný.

  2. V editoru VS Code klikněte v oblasti Dockeru pravým tlačítkem na kontejner Ubuntu a vyberte Připojit prostředí.

    Screenshot shows the Docker extension with a container selected and a context menu with Attach Shell selected.

    Otevře se terminál se spuštěným prostředím v kontejneru Ubuntu.

  3. Spuštěním následujícího příkazu zobrazte obsah /data.txt souboru.

    cat /data.txt
    

    V terminálu je číslo od 1 do 1 0000.

    Pokud chcete tento výsledek zobrazit pomocí příkazového řádku, získejte ID kontejneru docker ps pomocí příkazu a spusťte následující příkaz.

    docker exec <container-id> cat /data.txt
    
  4. Spusťte jiný ubuntu kontejner.

    docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
    
  5. Pomocí tohoto příkazu se můžete podívat na obsah složky.

    docker run -it ubuntu ls /
    

    Soubor by tam neměl být data.txt , protože byl zapsán do pomocného prostoru pouze pro první kontejner.

  6. Vyberte tyto dva kontejnery Ubuntu. Klikněte pravým tlačítkem myši a vyberte Odebrat. Z příkazového řádku je můžete odebrat pomocí docker rm -f příkazu.

Zachování dat úkolů pomocí pojmenovaných svazků

Ve výchozím nastavení aplikace todo ukládá data do databáze SQLite na adrese /etc/todos/todo.db. SQLite Database je relační databáze, která ukládá data do jednoho souboru. Tento přístup funguje u malých projektů.

Jeden soubor můžete zachovat na hostiteli. Když ho zpřístupníte dalšímu kontejneru, může aplikace vyzvednout místo, kde skončila. Když vytvoříte svazek a připojíte ho nebo připojíte ke složce, ve které jsou data uložená, můžete data zachovat. Kontejner zapíše do souboru todo.db a tato data se uchovávají na hostiteli ve svazku.

Pro tuto část použijte pojmenovaný svazek. Docker udržuje fyzické umístění svazku na disku. Přečtěte si název svazku a Docker poskytuje správná data.

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

    docker volume create todo-db
    
  2. V části KONTEJNERY vyberte začínáme a klikněte pravým tlačítkem myši. Vyberte Zastavit a zastavte kontejner aplikace.

    Pokud chcete kontejner zastavit z příkazového řádku, použijte docker stop tento příkaz.

  3. Spusťte kontejner Getting-Started pomocí následujícího příkazu.

    docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
    

    Parametr svazku určuje svazek, který se má připojit, a umístění. /etc/todos

  4. Aktualizujte prohlížeč, aby se aplikace znovu načítá. Pokud jste zavřeli okno prohlížeče, přejděte na http://localhost:3000/stránku . Přidejte do seznamu úkolů některé položky.

    Screenshot shows the sample app with several items added to the list.

  5. Odeberte kontejner Začínáme pro aplikaci úkolů. Buď klikněte pravým tlačítkem na kontejner v oblasti Dockeru a vyberte Odebrat nebo použijte docker stop příkazy.docker rm

  6. Spuštění nového kontejneru pomocí stejného příkazu:

    docker run -dp 3000:3000 -v todo-db:/etc/todos getting-started
    

    Tento příkaz připojí stejnou jednotku jako předtím. Aktualizujte si stránku v prohlížeči. Položky, které jste přidali, jsou stále ve vašem seznamu.

  7. Znovu odeberte kontejner Začínáme.

Pojmenované svazky a připojení vazby, které jsou popsány níže, jsou hlavními typy svazků podporovaných výchozí instalací modulu Dockeru.

Vlastnost Pojmenované svazky Připojení vazby
Umístění hostitele Docker si vybere Řídíte
Příklad připojení (pomocí -v) my-volume:/usr/local/data /path/to/data:/usr/local/data
Naplní nový svazek obsahem kontejneru. Yes No
Podporuje ovladače svazků. Yes No

K dispozici je mnoho modulů plug-in ovladačů svazků, které podporují NFS, SFTP, NetApp a další. Tyto moduly plug-in jsou zvlášť důležité ke spouštění kontejnerů na více hostitelích v clusterovém prostředí, jako je Swarm nebo Kubernetes.

Pokud vás zajímá, kde Docker ve skutečnosti ukládá vaše data, spusťte následující příkaz.

docker volume inspect todo-db

Podívejte se na výstup podobný tomuto výsledku.

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

Jedná se Mountpoint o skutečné umístění, kam se data ukládají. Na většině počítačů potřebujete kořenový přístup pro přístup k tomuto adresáři z hostitele.

Použití připojení vazeb

Pomocí připojení vazby řídíte přesnou přípojnou bod na hostiteli. Tento přístup zachovává data, ale často se používá k poskytování dalších dat do kontejnerů. Připojení vazby můžete použít k připojení zdrojového kódu do kontejneru, abyste viděli změny kódu, odpověděli a okamžitě viděli změny.

Pokud chcete kontejner spustit pro podporu vývojového pracovního postupu, postupujte následovně:

  1. Odeberte všechny getting-started kontejnery.

  2. app Ve složce spusťte následující příkaz.

    docker run -dp 3000:3000 -w /app -v ${PWD}:/app node:20-alpine sh -c "yarn install && yarn run dev"
    

    Tento příkaz obsahuje následující parametry.

    • -dp 3000:3000 Stejné jako předtím. Spusťte v odpojeném režimu a vytvořte mapování portů.
    • -w /app Pracovní adresář uvnitř kontejneru.
    • -v ${PWD}:/app" Vytvořte vazbu připojení aktuálního adresáře z hostitele v kontejneru /app do adresáře.
    • node:20-alpine Obrázek, který se má použít. Tato image je základní image vaší aplikace ze souboru Dockerfile.
    • sh -c "yarn install && yarn run dev" Příkaz. Spustí prostředí, které používá sh a spouští yarn install , aby se nainstalovaly všechny závislosti. Pak se spustí yarn run dev. Pokud se podíváte do souboru package.json, dev skript se spustí nodemon.
  3. Protokoly můžete sledovat pomocí docker logs.

    docker logs -f <container-id>
    
    $ nodemon src/index.js
    [nodemon] 2.0.20
    [nodemon] to restart at any time, enter `rs`
    [nodemon] watching path(s): *.*
    [nodemon] watching extensions: js,mjs,json
    [nodemon] starting `node src/index.js`
    Using sqlite database at /etc/todos/todo.db
    Listening on port 3000
    

    Když se v tomto seznamu zobrazí poslední položka, aplikace je spuštěná.

    Až budete hotovi sledovat protokoly, vyberte v okně terminálu libovolnou klávesu nebo v externím okně vyberte Ctrl+C.

  4. Ve VS Code otevřete soubor src/static/js/app.js. Změňte text tlačítka Přidat položku na řádku 109.

    - {submitting ? 'Adding...' : 'Add Item'}
    + {submitting ? 'Adding...' : 'Add'}
    

    Uložte změnu.

  5. Aktualizujte si stránku v prohlížeči. Měla by se zobrazit změna.

    Screenshot shows the sample app with the new text on the button.

Zobrazení vrstev obrázků

Můžete se podívat na vrstvy, které tvoří obrázek. Spuštěním docker image history příkazu zobrazte příkaz, který se použil k vytvoření každé vrstvy v rámci image.

  1. Umožňuje docker image history zobrazit vrstvy v úvodní imagi, kterou jste vytvořili dříve v kurzu.

    docker image history getting-started
    

    Výsledek by měl vypadat podobně jako tento výstup.

    IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
    a78a40cbf866        18 seconds ago      /bin/sh -c #(nop)  CMD ["node" "/app/src/ind…   0B                  
    f1d1808565d6        19 seconds ago      /bin/sh -c yarn install --production            85.4MB              
    a2c054d14948        36 seconds ago      /bin/sh -c #(nop) COPY dir:5dc710ad87c789593…   198kB               
    9577ae713121        37 seconds ago      /bin/sh -c #(nop) WORKDIR /app                  0B                  
    b95baba1cfdb        13 days ago         /bin/sh -c #(nop)  CMD ["node"]                 0B                  
    <missing>           13 days ago         /bin/sh -c #(nop)  ENTRYPOINT ["docker-entry…   0B                  
    <missing>           13 days ago         /bin/sh -c #(nop) COPY file:238737301d473041…   116B                
    <missing>           13 days ago         /bin/sh -c apk add --no-cache --virtual .bui…   5.35MB              
    <missing>           13 days ago         /bin/sh -c #(nop)  ENV YARN_VERSION=1.21.1      0B                  
    <missing>           13 days ago         /bin/sh -c addgroup -g 1000 node     && addu…   74.3MB              
    <missing>           13 days ago         /bin/sh -c #(nop)  ENV NODE_VERSION=12.14.1     0B                  
    <missing>           13 days ago         /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                  
    <missing>           13 days ago         /bin/sh -c #(nop) ADD file:e69d441d729412d24…   5.59MB   
    

    Každý řádek představuje vrstvu v obrázku. Výstup zobrazuje základ v dolní části s nejnovější vrstvou nahoře. Pomocí těchto informací můžete zobrazit velikost každé vrstvy, což pomáhá diagnostikovat velké obrázky.

  2. Několik řádků je zkráceno. Pokud přidáte --no-trunc parametr, získáte úplný výstup.

    docker image history --no-trunc getting-started
    

Závislosti mezipaměti

Jakmile se vrstva změní, musí se také znovu vytvořit všechny podřízené vrstvy. Tady je soubor Dockerfile znovu:

FROM node:20-alpine
WORKDIR /app
COPY . .
RUN yarn install --production
CMD ["node", "/app/src/index.js"]

Každý příkaz v souboru Dockerfile se stane novou vrstvou v imagi. Pokud chcete minimalizovat počet vrstev, můžete změnit strukturu souboru Dockerfile tak, aby podporoval ukládání závislostí do mezipaměti. U aplikací založených na uzlech jsou tyto závislosti definovány v package.json souboru.

Přístupem je nejprve zkopírovat pouze tento soubor, nainstalovat závislosti a pak zkopírovat všechno ostatní. Proces znovu vytvoří závislosti yarn pouze v případě, že došlo ke změně objektu package.json.

  1. Aktualizujte soubor Dockerfile tak, aby se zkopíroval v package.json první části, nainstalujte závislosti a pak zkopírujte všechno ostatní. Tady je nový soubor:

    FROM node:20-alpine
    WORKDIR /app
    COPY package.json yarn.lock ./
    RUN yarn install --production
    COPY . .
    CMD ["node", "/app/src/index.js"]
    
  2. Vytvořte novou image pomocí docker build.

    docker build -t getting-started .
    

    Měl by se zobrazit výstup podobný následujícím výsledkům:

    Sending build context to Docker daemon  219.1kB
    Step 1/6 : FROM node:12-alpine
    ---> b0dc3a5e5e9e
    Step 2/6 : WORKDIR /app
    ---> Using cache
    ---> 9577ae713121
    Step 3/6 : COPY package* yarn.lock ./
    ---> bd5306f49fc8
    Step 4/6 : RUN yarn install --production
    ---> Running in d53a06c9e4c2
    yarn install v1.17.3
    [1/4] Resolving packages...
    [2/4] Fetching packages...
    info fsevents@1.2.9: The platform "linux" is incompatible with this module.
    info "fsevents@1.2.9" is an optional dependency and failed compatibility check. Excluding it from installation.
    [3/4] Linking dependencies...
    [4/4] Building fresh packages...
    Done in 10.89s.
    Removing intermediate container d53a06c9e4c2
    ---> 4e68fbc2d704
    Step 5/6 : COPY . .
    ---> a239a11f68d8
    Step 6/6 : CMD ["node", "/app/src/index.js"]
    ---> Running in 49999f68df8f
    Removing intermediate container 49999f68df8f
    ---> e709c03bc597
    Successfully built e709c03bc597
    Successfully tagged getting-started:latest
    

    Všechny vrstvy byly znovu sestaveny. Tento výsledek se očekává, protože jste změnili soubor Dockerfile.

  3. Proveďte změnu src/static/index.html. Změňte například název na "The Awesome Todo App".

  4. Znovu sestavte image Dockeru.docker build Tentokrát by měl výstup vypadat trochu jinak.

    Sending build context to Docker daemon  219.1kB
    Step 1/6 : FROM node:12-alpine
    ---> b0dc3a5e5e9e
    Step 2/6 : WORKDIR /app
    ---> Using cache
    ---> 9577ae713121
    Step 3/6 : COPY package* yarn.lock ./
    ---> Using cache
    ---> bd5306f49fc8
    Step 4/6 : RUN yarn install --production
    ---> Using cache
    ---> 4e68fbc2d704
    Step 5/6 : COPY . .
    ---> cccde25a3d9a
    Step 6/6 : CMD ["node", "/app/src/index.js"]
    ---> Running in 2be75662c150
    Removing intermediate container 2be75662c150
    ---> 458e5c6f080c
    Successfully built 458e5c6f080c
    Successfully tagged getting-started:latest
    

    Protože používáte mezipaměť sestavení, měla by být mnohem rychlejší.

Sestavení s více fázemi

Vícefázové buildy jsou neuvěřitelně výkonný nástroj, který vám pomůže vytvořit image pomocí několika fází. Pro ně existuje několik výhod:

  • Oddělení závislostí času sestavení od závislostí modulu runtime
  • Zmenšení celkové velikosti obrázku odesláním jenom toho, co vaše aplikace potřebuje ke spuštění

Tato část obsahuje stručné příklady.

Příklad Maven/Tomcat

Při vytváření aplikací založených na Javě je potřeba sada JDK ke kompilaci zdrojového kódu do bajtového kódu Javy. V produkčním prostředí není potřeba sada JDK. K sestavení aplikace můžete použít nástroje, jako je Maven nebo Gradle. Tyto nástroje také nejsou potřeba na finálním obrázku.

FROM maven AS build
WORKDIR /app
COPY . .
RUN mvn package

FROM tomcat
COPY --from=build /app/target/file.war /usr/local/tomcat/webapps 

Tento příklad používá jednu fázi k buildprovedení skutečného sestavení Java pomocí Mavenu. Druhá fáze, která začíná na "FROM tomcat", kopíruje soubory z fáze build . Poslední image je pouze poslední fáze, kterou lze přepsat pomocí parametru --target .

Příklad Reactu

Při vytváření aplikací React potřebujete prostředí Node ke kompilaci javascriptového kódu, šablon stylů SASS a dalších funkcí do statického html, JavaScriptu a šablon stylů CSS. Pokud vykreslování na straně serveru neprovádíte, ani pro produkční sestavení nepotřebujete prostředí Node.

FROM node:20-alpine AS build
WORKDIR /app
COPY package* yarn.lock ./
RUN yarn install
COPY public ./public
COPY src ./src
RUN yarn run build

FROM nginx:alpine
COPY --from=build /app/build /usr/share/nginx/html

Tento příklad používá node:20 image k provedení sestavení, které maximalizuje ukládání vrstvy do mezipaměti a potom zkopíruje výstup do kontejneru nginx .

Vyčištění prostředků

Udržujte všechno, co jste zatím udělali, abyste mohli pokračovat v této sérii kurzů.

Další kroky

Dozvěděli jste se o možnostech uchovávání dat pro kontejnerové aplikace.

Co chcete udělat dál?