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.
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ý.V editoru VS Code klikněte v oblasti Dockeru pravým tlačítkem na kontejner Ubuntu a vyberte Připojit prostředí.
Otevře se terminál se spuštěným prostředím v kontejneru Ubuntu.
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
Spusťte jiný
ubuntu
kontejner.docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
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.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.
Vytvořte svazek pomocí
docker volume create
příkazu.docker volume create todo-db
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.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
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.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
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.
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ě:
Odeberte všechny
getting-started
kontejnery.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 souborupackage.json
,dev
skript se spustínodemon
.
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.
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.
Aktualizujte si stránku v prohlížeči. Měla by se zobrazit změna.
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.
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.
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
.
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"]
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.
Proveďte změnu src/static/index.html. Změňte například název na "The Awesome Todo App".
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 build
provedení 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?
Práce s více kontejnery pomocí Docker Compose:
Vytváření vícekontejnerových aplikací pomocí MySQL a Docker Compose
Nasazení do Azure Container Apps:
Nasazení do Azure App Service
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro