Megosztás a következőn keresztül:


Oktatóanyag: Adatok megőrzése tárolóalkalmazásban kötetek használatával a VS Code-ban

Ebben az oktatóanyagban megtanulhatja, hogyan őrizheti meg az adatokat egy tárolóalkalmazásban. Futtatáskor vagy frissítésekor az adatok továbbra is elérhetők maradnak. Az adatok megőrzéséhez két fő kötettípus használható. Ez az oktatóanyag a elnevezett kötetekre összpontosít.

Megismerheti a kötött csatolásokatis, amelyek a gazdagép pontos csatolási pontját szabályozzák. Kötéseket használhat, hogy megőrizze az adatokat, de ezzel több adatot is hozzáadhat a tárolókhoz. Amikor egy alkalmazáson dolgozik, egy kötési pontot használhat, hogy a forráskódot a tárolóba csatolja, így a tároló érzékelheti a kód módosításait, válaszolhat rájuk, és ön azonnal láthatja a változásokat.

Ez az oktatóanyag a képrétegezést, a réteg gyorsítótárazását és a többfázisú buildeket is bemutatja.

Ebben az oktatóanyagban a következőket sajátíthatja el:

  • A tárolók közötti adatok megértése.
  • Adatok megőrzése elnevezett kötetek használatával.
  • Használjon kötéstartókat.
  • Képréteg megtekintése.
  • Gyorsítótár-függőségek.
  • A többfázisú buildek ismertetése.

Előfeltételek

Ez az oktatóanyag folytatja az előző oktatóanyagot, amely egy tárolóalkalmazás létrehozása és megosztása a Visual Studio Code-tal. Kezdje ezzel az előfeltételekkel.

A tárolókon belüli adatok ismertetése

Ebben a szakaszban két tárolót indít el, és mindegyikben létrehoz egy fájlt. Az egyik tárolóban létrehozott fájlok nem érhetők el egy másik tárolóban.

  1. Indítsa el a ubuntu tárolót a következő paranccsal:

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

    Ez a parancs két parancsot indít el a &&használatával. Az első rész egyetlen véletlenszerű számot választ ki, és beírja /data.txt. A második parancs egy fájlt figyel a tároló futásának fenntartásához.

  2. A VS Code Tárolókezelőjében kattintson a jobb gombbal az ubuntu tárolóra, és válassza a Shell csatolása lehetőséget.

    Képernyőkép a Container Tools bővítményről egy kijelölt tárolóval és egy helyi menüvel, amelyen a Shell csatolása elem van kiválasztva.

    Megnyílik egy terminál, amely egy parancssori héjat futtat az Ubuntu-konténerben.

  3. Futtassa a következő parancsot a /data.txt fájl tartalmának megtekintéséhez.

    cat /data.txt
    

    A terminál 1 és 10000 közötti számot jelenít meg.

    Ha a parancssort szeretné használni az eredmény megtekintéséhez, kérje le a tárolóazonosítót a docker ps paranccsal, és futtassa a következő parancsot.

    docker exec <container-id> cat /data.txt
    
  4. Indítsa el a másik ubuntu tárolót.

    docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
    
  5. Ezzel a paranccsal megtekintheti a mappa tartalmát.

    docker run -it ubuntu ls /
    

    Nem lehet ott data.txt fájl, mert csak az első tároló üres területére lett megírva.

  6. Válassza ki ezt a két Ubuntu-tárolót. Kattintson a jobb gombbal, és válassza az eltávolítását. A parancssorból a docker rm -f paranccsal távolíthatja el őket.

A todo-adatok megőrzése elnevezett kötetek használatával

A todo alkalmazás alapértelmezés szerint egy SQLite-adatbázisban tárolja az adatait,/etc/todos/todo.db. A SQLite Database egy relációs adatbázis, amely egyetlen fájlban tárolja az adatokat. Ez a megközelítés kis projektek esetében működik.

Az egyetlen fájlt a gazdagépen is megőrizheti. Amikor elérhetővé teszi a következő tároló számára, az alkalmazás ott folytathatja, ahol abbahagyta. Ha kötetet hoz létre, és csatolja vagy csatlakoztatja, azt a mappába, amelyben az adatokat tárolja, megőrizheti az adatokat. A tároló a todo.db fájlba ír, és az adatok megmaradnak a kötet gazdagépe számára.

Ebben a szakaszban használjon egy nevű kötetet. A Docker fenntartja a kötet fizikai helyét a lemezen. Tekintse meg a kötet nevét, és a Docker biztosítja a megfelelő adatokat.

  1. Hozzon létre egy kötetet a docker volume create paranccsal.

    docker volume create todo-db
    
  2. A TÁROLÓKalatt válassza a getting-started lehetőséget, majd kattintson a jobb gombbal. Az alkalmazástároló leállításához válassza a Leállítás lehetőséget.

    A tároló parancssorból való leállításához használja a docker stop parancsot.

  3. Indítsa el a kezdő konténert az alábbi paranccsal.

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

    A kötetparaméter megadja a csatlakoztatni kívánt kötetet és a helyet, /etc/todos.

  4. Frissítse a böngészőt az alkalmazás újratöltéséhez. Ha bezárta a böngészőablakot, lépjen a http://localhost:3000/. Adjon hozzá néhány elemet a teendőlistához.

    Képernyőkép a mintaalkalmazásról, amely több elemet is hozzáad a listához.

  5. Távolítsa el a "bevezető" tárolót a feladatkezelő alkalmazáshoz. Kattintson a jobb gombbal a tárolóra a Tárolókezelőben, és válassza az Eltávolítás vagy a docker stopdocker rm parancsok használata lehetőséget.

  6. Indítsa el az új tárolót ugyanazzal a paranccsal:

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

    Ez a parancs ugyanazt a meghajtót csatlakoztatja, mint korábban. Frissítse a böngészőt. A hozzáadott elemek továbbra is szerepelnek a listában.

  7. Távolítsa el újra a getting-started tárolót.

Az alábbiakban ismertetett elnevezett kötetek és kötési csatlakoztatások az alapértelmezett Docker-motortelepítés által támogatott kötetek fő típusai.

Ingatlan Elnevezett kötetek Kötési csatlakoztatások
Hoszt helye Docker kiválasztja Ön szabályozhatja
Példa csatlakoztatása (-vhasználatával ) saját kötet:/usr/local/data /path/to/data:/usr/local/data
Az új kötet feltöltése a konténer tartalmával Igen Nem
Támogatja a kötetillesztőprogramokat Igen Nem

Számos kötetillesztő beépülő modul érhető el az NFS, az SFTP, a NetApp stb. támogatásához. Ezek a beépülő modulok különösen fontosak a tárolók több gazdagépen való futtatásához egy klaszterezett környezetben, mint például a Swarm vagy a Kubernetes.

Ha kíváncsi arra, hogy a Docker hol ténylegesen tárolni az adatokat, futtassa a következő parancsot.

docker volume inspect todo-db

Nézze meg a kimenetet, hasonlóan ehhez az eredményhez.

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

A Mountpoint az adatok tárolásának tényleges helye. A legtöbb számítógépen gyökérszintű hozzáférésre van szükség a könyvtár gazdagépről való eléréséhez.

Kötési csatlakoztatások használata

A bind mountokhasználatával szabályozhatja a gazdagép pontos csatolási pontját. Ez a megközelítés megőrzi az adatokat, de gyakran használják több adat tárolókba való biztosítására. A kötéses csatolás használatával csatolhatja a forráskódot a tárolóba, hogy az lássa a kódbeli módosításokat, reagáljon, és Ön azonnal láthassa ezeket a változtatásokat.

Ha futtatni szeretné a tárolót egy fejlesztési munkafolyamat támogatásához, hajtsa végre a következő lépéseket:

  1. Távolítsa el a getting-started tárolókat.

  2. A app mappában futtassa a következő parancsot.

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

    Ez a parancs a következő paramétereket tartalmazza.

    • -dp 3000:3000 ugyanaz, mint korábban. Futtassa leválasztott módban, és hozzon létre egy portleképezést.
    • -w /app munkakönyvtár van a tárolóban.
    • -v ${PWD}:/app" Kötés csatlakoztatja az aktuális könyvtárat a tároló gazdagépéről a /app könyvtárba.
    • node:lts-alpine a használni kívánt képet. Ez a kép az alkalmazás alapértelmezett képe a Dockerfile.
    • sh -c "yarn install && yarn run dev" A parancsot. Egy rendszerhéjat indít el a sh használatával, és futtatja a yarn install-et az összes függőség telepítéséhez. Ezután yarn run devfut. Ha a package.json-ba néz, a dev szkript elindul nodemon.
  3. A naplókat docker logshasználatával tekintheti meg.

    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
    

    Amikor megjelenik a lista utolsó bejegyzése, az alkalmazás fut.

    Ha befejezte a naplók megtekintését, válasszon egy billentyűt a terminálablakban, vagy válassza a Ctrl+C külső ablakban.

  4. A VS Code-ban nyissa meg src/static/js/app.js. Módosítsa az Elem hozzáadása gomb szövegét a 109. sorban.

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

    Mentse el a változtatást.

  5. Frissítse a böngészőt. Látnia kell a módosítást.

    Képernyőkép a mintaalkalmazásról, amelyen az új szöveg látható a gombon.

  6. Távolítsa el a node:lts-alpine tárolót.

  7. app A mappában futtassa a következő parancsot az node_modules előző lépésekben létrehozott mappa eltávolításához.

    rm -r node_modules
    

Képrétegek megtekintése

Megtekintheti a képeket alkotó rétegeket. Futtassa a docker image history parancsot a rendszerkép egyes rétegeinek létrehozásához használt parancs megtekintéséhez.

  1. A docker image history használatával megtekintheti a korábban az oktatóanyag során létrehozott kezdő kép rétegeit.

    docker image history getting-started
    

    Az eredménynek ehhez a kimenethez kell hasonlítania.

    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   
    

    Az egyes vonalak a kép egy rétegét jelölik. A kimenet azt mutatja, hogy alul van az alap, felül pedig a legújabb réteg. Ezen információk segítségével megtekintheti az egyes rétegek méretét, és segíthet a nagyméretű képek diagnosztizálásában.

  2. Több sor levágott. Ha hozzáadja a --no-trunc paramétert, a teljes kimenetet megkapja.

    docker image history --no-trunc getting-started
    

Gyorsítótár-függőségek

Ha egy réteg megváltozik, az összes alsó réteget újra létre kell hozni. Íme ismét a Dockerfile:

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

A Dockerfile minden parancsa új réteget hoz létre a képben. A rétegek számának minimalizálása érdekében a Dockerfile átstrukturálásával lehetővé teheti a függőségek gyorsítótárazását. Csomópontalapú alkalmazások esetén ezek a függőségek a package.json fájlban vannak definiálva.

A módszer az, hogy először csak ezt a fájlt másolja, telepítse a függőségeket, majd majd másoljon minden mást. A folyamat csak akkor hozza létre újra a fonalfüggőségeket, ha történt módosítás a package.json-ban.

  1. Frissítse a Dockerfile fájlt úgy, hogy először másolja a package.json elemet, telepítse a függőségeket, majd másoljon mindent mást. Az új fájl a következő:

    FROM node:lts-alpine
    WORKDIR /app
    COPY package.json yarn.lock ./
    RUN yarn install --production
    COPY . .
    CMD ["node", "/app/src/index.js"]
    
  2. Új kép létrehozása docker buildhasználatával.

    docker build -t getting-started .
    

    A kimenetnek a következő eredményekhez hasonlóan kell megjelennie:

    Sending build context to Docker daemon  219.1kB
    Step 1/6 : FROM node:lts-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
    

    Minden réteg újjá lett építve. Ez az eredmény azért várható, mert megváltoztatta a Dockerfile.

  3. Módosítsa a src/static/index.html. Például módosítsa a címet úgy, hogy "The Awesome Todo App".

  4. Hozza létre a Docker-rendszerképet most újra docker build használatával. Ezúttal a kimenetnek egy kicsit másnak kell kinéznie.

    Sending build context to Docker daemon  219.1kB
    Step 1/6 : FROM node:lts-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
    

    Mivel a build gyorsítótárat használja, ennek sokkal gyorsabban kell mennie.

Többfázisú buildek

A többfázisú építések hihetetlenül hatékony eszközök, amely több szakasz használatát teszi lehetővé a rendszerkép létrehozásához. Számos előnye van számukra:

  • Build-time függőségek elkülönítése a futtatókörnyezeti függőségektől
  • Csökkentse az általános képméretet úgy, hogy csak azt szállítja, amit az alkalmazásnak futtatnia kell

Ez a szakasz rövid példákat tartalmaz.

Maven/Tomcat-példa

Java-alapú alkalmazások létrehozásakor JDK-ra van szükség a forráskód Java-bájtkódra való fordításához. A JDK-ra nincs szükség az éles környezetben. Előfordulhat, hogy olyan eszközöket használ, mint a Maven vagy a Gradle az alkalmazás létrehozásához. Ezekre az eszközökre a végső képen sincs szükség.

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

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

Ez a példa egy szakaszt használ, builda tényleges Java-build végrehajtásához a Maven használatával. A második szakasz, a "FROM tomcat" kezdetű, fájlokat másol a build szakaszból. A végső kép csak az utolsó fázis, amelyet felül lehet bírálni a --target paraméterrel.

React példa

A React-alkalmazások létrehozásakor node-környezetre van szükség a JavaScript-kód, a Sass-stíluslapok és egyebek statikus HTML-, JavaScript- és CSS-fájlba való fordításához. Ha nem végez kiszolgálóoldali renderelést, akkor még Node környezetre sincs szüksége az éles buildhez.

FROM node:lts-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

Ez a példa egy node:lts-alpine rendszerképet használ a build végrehajtásához, amely maximalizálja a réteg gyorsítótárazását, majd átmásolja a kimenetet egy nginx tárolóba.

Erőforrások törlése

Az oktatóanyagok sorozatának folytatásához tartsa meg az eddig elvégzett feladatokat.

Következő lépések

Megismerhette a tárolóalkalmazások adatainak megőrzésének lehetőségeit.

Mi a következő lépés?