Aracılığıyla paylaş


Öğretici: VS Code'da birimleri kullanarak kapsayıcı uygulamasında verileri kalıcı hale getirme

Bu öğreticide, kapsayıcı uygulamasında verileri kalıcı hale almayı öğreneceksiniz. Çalıştırdığınızda veya güncelleştirdiğinizde veriler hala kullanılabilir durumda olur. Verileri kalıcı hale getirmek için kullanılan iki ana birim türü vardır. Bu öğretici, adlı birimlereodaklanır.

Ayrıca bağlama bağlamaları hakkında da bilgi edineceksiniz. Bu, konakta tam bağlama noktasını denetler. Bağlamaları kullanarak verileri kalıcı hale getirebilirsiniz, ancak kapsayıcılara daha fazla veri de ekleyebilirsiniz. Bir uygulama üzerinde çalışırken, kod değişikliklerini kapsayıcıya yansıtmak ve bu değişikliklere hemen tepki verip görmenizi sağlamak için bağlı bir bağlama kullanarak kaynak kodunu kapsayıcıya monte edebilirsiniz.

Bu öğreticide ayrıca görüntü katmanlama, katman önbelleğe alma ve çok aşamalı derlemeler tanıtılmaktadır.

Bu öğreticide şunların nasıl yapılacağını öğreneceksiniz:

  • Kapsayıcılar genelinde verileri anlamak.
  • Adlandırılmış birimler kullanarak verileri kalıcı hâle getirin.
  • Bind montları kullanın.
  • Görüntü katmanını görüntüleme.
  • Önbellek bağımlılıkları.
  • Çok aşamalı derlemeleri anlamak.

Önkoşullar

Bu öğretici, Visual Studio Code ile kapsayıcı uygulaması oluşturma ve paylaşma adlı önceki öğreticiye devam eder. Önkoşulları içeren bununla başlayın.

Kapsayıcılar arasında verileri anlama

Bu bölümde iki kapsayıcı başlatacak ve her birinde bir dosya oluşturacaksınız. Bir kapsayıcıda oluşturulan dosyalar başka bir kapsayıcıda kullanılamaz.

  1. Şu komutu kullanarak bir ubuntu kapsayıcısı başlatın:

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

    Bu komut, &&kullanarak iki komutu başlatır. İlk bölüm, tek bir rastgele sayı seçer ve bunu /data.txt’a yazar. İkinci komut, kapsayıcıyı çalışır durumda tutmak için bir dosyayı izlemek.

  2. VS Code'da, Kapsayıcı Gezgini'nde ubuntu kapsayıcısını sağ tıklatın ve Kabuk Ekle'yi seçin.

    Bir kapsayıcının seçili olduğu Kapsayıcı Araçları uzantısını ve Kabuk Ekle'nin seçili olduğu bağlam menüsünü gösteren ekran görüntüsü.

    Ubuntu kapsayıcısında komut satırı çalıştıran bir terminal açılır.

  3. /data.txt dosyasının içeriğini görmek için aşağıdaki komutu çalıştırın.

    cat /data.txt
    

    Terminalde 1 ile 10000 arasında bir sayı gösterilir.

    Bu sonucu görmek için komut satırını kullanmak için docker ps komutunu kullanarak kapsayıcı kimliğini alın ve aşağıdaki komutu çalıştırın.

    docker exec <container-id> cat /data.txt
    
  4. Başka bir ubuntu kapsayıcısı başlat.

    docker run -d ubuntu bash -c "shuf -i 1-10000 -n 1 -o /data.txt && tail -f /dev/null"
    
  5. Klasör içeriğine bakmak için bu komutu kullanın.

    docker run -it ubuntu ls /
    

    Yalnızca ilk kapsayıcı için geçici alana yazıldığı için orada data.txt dosyası olmamalıdır.

  6. Bu iki Ubuntu kapsayıcısı seçin. Sağ tıklayın ve kaldırseçin. Komut satırından, docker rm -f komutunu kullanarak bunları kaldırabilirsiniz.

Adlandırılmış birimleri kullanarak yapılacaklar verilerinizi kalıcı olarak depolayın.

Varsayılan olarak, todo uygulaması verilerini bir SQLite Veritabanı içinde /etc/todos/todo.dbkonumunda depolar. SQLite Veritabanı, verileri tek bir dosyada depolayan ilişkisel bir veritabanıdır. Bu yaklaşım küçük projelerde çalışır.

Tek dosyayı konakta kalıcı hale gelebilirsiniz. Bir sonraki kapsayıcı için kullanılabilir hale getirdiğinizde, uygulama kaldığı yerden devam edebilir. birim oluşturup ekleyerek ya dabağlayarak bu birimi verilerin depolandığı klasöre monte edip verileri kalıcı hale getirebilirsiniz. Kapsayıcı todo.db dosyasına yazar ve bu veriler depolama birimindeki ana makinede saklanır.

Bu bölüm için, adlı birbirimi kullanın. Docker disk üzerindeki birimin fiziksel konumunu korur. Hacmin adına bakın ve Docker doğru verileri sağlar.

  1. docker volume create komutunu kullanarak birim oluşturun.

    docker volume create todo-db
    
  2. KAPSAYICILARaltında getting-started seçin ve sağ tıklayın. Durdur'u seçerek uygulama kapsayıcısını durdurun.

    Kapsayıcıyı komut satırından durdurmak için docker stop komutunu kullanın.

  3. Aşağıdaki komutu kullanarak başlangıç kapsayıcısını başlatın.

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

    volume parametresi, bağlanacak birimi ve konumu /etc/todosbelirtir.

  4. Uygulamayı yeniden yüklemek için tarayıcınızı yenileyin. Tarayıcı penceresini kapattıysanız http://localhost:3000/'a gidin. Yapılacaklar listenize bazı öğeler ekleyin.

    Listeye birkaç öğe eklenmiş örnek uygulamayı gösteren ekran görüntüsü.

  5. Todo uygulaması için başlangıç kapsayıcısını kaldırın. Kapsayıcı Gezgini'nde kapsayıcıya sağ tıklayın ve Kaldır'ı seçin veya docker stop ve docker rm komutlarını kullanın.

  6. Aynı komutu kullanarak yeni bir kapsayıcı başlatın:

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

    Bu komut, öncekiyle aynı sürücüyü bağlar. Tarayıcınızı yenileyin. Eklediğiniz öğeler listenizde kalır.

  7. başlatma kapsayıcısını yeniden kaldırın.

Aşağıda açıklanan adlandırılmış birimler ve bağlamalı birimler, varsayılan Docker motoru tarafından desteklenen ana birim türleridir.

Mülk Adlandırılmış Birimler Bağlama Bağlantıları
Konak Konumu Docker seçer Denetimi siz sağlarsınız
Montaj Örneği (-vkullanarak) my-volume:/usr/local/data /path/to/data:/usr/local/data
Yeni bir hacmi kapsayıcının içeriğiyle doldurur. Evet Hayır
Birim Sürücülerine destek verir Evet Hayır

NFS, SFTP, NetApp ve daha fazlasını destekleyen birçok birim sürücüsü eklentisi vardır. Bu eklentiler, Swarm veya Kubernetes gibi kümelenmiş bir ortamda birden fazla konakta kapsayıcıları çalıştırmak için özel bir önem taşır.

Docker verilerinizi nerede depoladığı merak ediyorsanız aşağıdaki komutu çalıştırın.

docker volume inspect todo-db

Bu sonuca benzer şekilde çıktıya bakın.

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

Mountpoint, verilerin depolandığı gerçek konumdur. Çoğu bilgisayarda, bu dizine ana bilgisayardan erişmek için kök erişiminiz olmalıdır.

Bağlantı montajlarını kullanın

bağlama modlarıile ana bilgisayardaki bağlama noktasını tam olarak kontrol edebilirsiniz. Bu yaklaşım verileri kalıcı hale getirse de genellikle kapsayıcılara daha fazla veri sağlamak için kullanılır. Kod değişikliklerini görebilmesi ve yanıt verebilmesi için kaynak kodu kapsayıcıya bağlamak ve siz de değişiklikleri anında görebilmek için bir bağlama noktası kullanabilirsiniz.

Kapsayıcınızı bir geliştirme iş akışını destekleyecek şekilde çalıştırmak için aşağıdaki adımları uygulayacaksınız:

  1. getting-started kapsayıcılarından herhangi birini kaldırın.

  2. app klasöründe aşağıdaki komutu çalıştırın.

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

    Bu komut aşağıdaki parametreleri içerir.

    • -dp 3000:3000 Öncekiyle aynı. Ayrılmış modda çalıştırın ve bir bağlantı noktası eşlemesi oluşturun.
    • -w /app Kapsayıcı içindeki çalışma dizini.
    • -v ${PWD}:/app" Ana bilgisayardaki geçerli dizini, kapsayıcıdaki /app dizinine bağlayın.
    • node:lts-alpine kullanılacak görüntü. Bu görüntü, Dockerfileuygulamanızın temel görüntüsüdür.
    • sh -c "yarn install && yarn run dev" Bir komut. sh kullanarak bir kabuk başlatır ve tüm bağımlılıkları yüklemek için yarn install çalıştırır. Ardından yarn run devçalışır. package.jsonbakarsanız, dev betiği nodemonbaşlıyor.
  3. docker logskullanarak günlükleri izleyebilirsiniz.

    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
    

    Bu listede son girdiyi gördüğünüzde uygulama çalışır durumdadır.

    Günlükleri izlemeyi bitirdiğinizde terminal penceresinden herhangi bir anahtarı seçin veya dış pencerede Ctrl +seçin.

  4. VS Code'da src/static/js/app.jsaçın. 109. satırdaki Öğe Ekle düğmesinin metnini değiştirin.

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

    Değişikliğinizi kaydedin.

  5. Tarayıcınızı yenileyin. Değişikliği görmeniz gerekir.

    Düğmede yeni metin bulunan örnek uygulamayı gösteren ekran görüntüsü.

  6. Kapsayıcıyı node:lts-alpine kaldırın.

  7. app klasöründe aşağıdaki komutu çalıştırarak önceki adımlarda oluşturulan klasörü kaldırınnode_modules.

    rm -r node_modules
    

Görüntü katmanlarını görüntüleme

Bir görüntüyü oluşturan katmanlara bakabilirsiniz. Bir görüntüdeki her katmanı oluşturmak için kullanılan komutu görmek için docker image history komutunu çalıştırın.

  1. Öğreticide daha önce oluşturduğunuz docker image history görüntüsündeki katmanları görmek için kullanın.

    docker image history getting-started
    

    Sonucunuz bu çıkışa benzemelidir.

    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   
    

    Çizgilerin her biri görüntüdeki bir katmanı temsil eder. Çıktı alttaki tabanı, en yeni katman en üstte olacak şekilde gösterir. Bu bilgileri kullanarak her katmanın boyutunu görebilir ve büyük görüntüleri tanılamaya yardımcı olabilirsiniz.

  2. Satırların bazıları kısaltılmış. --no-trunc parametresini eklerseniz, tam çıkışı alırsınız.

    docker image history --no-trunc getting-started
    

Önbellek bağımlılıkları

Bir katman değiştiğinde, tüm aşağı akış katmanlarının da yeniden oluşturulması gerekir. İşte Docker dosyası tekrar:

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

Dockerfile içindeki her komut görüntüde yeni bir katmana dönüşür. Katman sayısını en aza indirmek için Dockerfile bağımlılıkların önbelleğe alınmasını destekleyecek şekilde yeniden yapılandırabilirsiniz. Node tabanlı uygulamalar için bu bağımlılıklar package.json dosyasında tanımlanır.

Yaklaşım, önce yalnızca bu dosyayı kopyalamak, bağımlılıkları yüklemek ve sonra diğer her şeyi kopyalamaktır. İşlem, eğer package.jsonüzerinde bir değişiklik olduğunda yalnızca yarn bağımlılıklarını yeniden oluşturur.

  1. Dockerfile dosyasını önce package.json'yi kopyalayacak, bağımlılıkları yükleyecek ve ardından diğer her şeyi kopyalayacak şekilde güncelleyin. Yeni dosya şu şekildedir:

    FROM node:lts-alpine
    WORKDIR /app
    COPY package.json yarn.lock ./
    RUN yarn install --production
    COPY . .
    CMD ["node", "/app/src/index.js"]
    
  2. docker buildkullanarak yeni bir görüntü oluşturun.

    docker build -t getting-started .
    

    Aşağıdaki sonuçlara benzer bir çıktı görmeniz gerekir:

    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
    

    Tüm katmanlar yeniden oluşturulmuştu. Dockerfiledeğiştirdiğinizden bu sonuç beklenir.

  3. src/static/index.htmlüzerinde bir değişiklik yapın. Örneğin, başlığı "The Awesome Todo App" olarak değiştirin.

  4. Docker görüntüsünü yeniden docker build kullanarak oluşturun. Bu kez sonucunuz biraz farklı görünmeli.

    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
    

    Derleme önbelleğini kullandığınız için çok daha hızlı olması gerekir.

Çok aşamalı inşalar

Çok aşamalı derlemeler, görüntü oluşturmak için birden çok aşamanın kullanılmasına yardımcı olan inanılmaz güçlü bir araçtır. Bunlar için çeşitli avantajlar vardır:

  • Derleme zamanı bağımlılıklarını çalışma zamanı bağımlılıklarından ayırma
  • Yalnızca uygulamanızın çalışması için gerekenleri göndererek genel görüntü boyutunu azaltın

Bu bölümde kısa örnekler verilmiştir.

Maven/Tomcat örneği

Java tabanlı uygulamalar oluştururken, kaynak kodu Java bayt koduna derlemek için bir JDK gerekir. Bu JDK üretimde gerekli değildir. Uygulamayı derlemeye yardımcı olmak için Maven veya Gradle gibi araçları kullanıyor olabilirsiniz. Bu araçlar son görüntünüzde de gerekli değildir.

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

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

Bu örnek, Maven kullanarak Java derlemesini gerçekten gerçekleştirmek için bir aşama, build, kullanır. "FROM tomcat" ile başlayan ikinci aşama, dosyaları build aşamasından kopyalar. Son görüntü yalnızca oluşturulan son aşamadır ve --target parametresi kullanılarak geçersiz kılınabilir.

React örneği

React uygulamaları oluştururken JavaScript kodunu, Sass stil sayfalarını ve daha fazlasını statik HTML, JavaScript ve CSS'de derlemek için bir Node ortamına ihtiyacınız vardır. Sunucu tarafı işleme yapmıyorsanız, üretim derlemesi için bir Node ortamına bile ihtiyacınız yoktur.

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

Bu örnek, katman önbelleğini en üst düzeye çıkarmak için bir node:lts-alpine görüntüsü kullanarak derleme işlemini gerçekleştirir ve ardından çıktıyı bir nginx kapsayıcısına kopyalar.

Kaynakları temizleme

Bu öğretici serisine devam etmek için şimdiye kadar yaptığınız her şeyi kaydedin.

Sonraki adımlar

Kapsayıcı uygulamaları için verileri kalıcı hale getirmek için seçenekler hakkında bilgi edindiniz.

Bundan sonra ne yapmak istiyorsunuz?