Rumah >Operasi dan penyelenggaraan >Docker >Anda boleh mempelajari idea penggunaan semula berlapis dengan Docker dalam sepuluh minit

Anda boleh mempelajari idea penggunaan semula berlapis dengan Docker dalam sepuluh minit

WBOY
WBOYke hadapan
2022-01-19 17:37:322633semak imbas

Artikel ini membawakan anda isu yang berkaitan dengan lapisan imej, lapisan bekas dan ruang cakera yang diduduki oleh bekas dalam Docker saya harap ia akan membantu anda.

Anda boleh mempelajari idea penggunaan semula berlapis dengan Docker dalam sepuluh minit

Cara Docker mengatur storan

Dokcer bijak menggunakan idea penggunaan semula hierarki semasa mengatur kandungan storan. Jadi kita boleh menggunakan ini sebagai kes untuk mempelajari idea ini.

1. Lapisan imej

Imej Docker dibahagikan kepada banyak lapisan semasa proses pembinaan, dan setiap lapisan adalah baca sahaja. Mari kita ilustrasikan dengan contoh berikut:

# syntax=docker/dockerfile:1
FROM ubuntu:18.04
LABEL org.opencontainers.image.authors="org@example.com"
COPY . /app
RUN make /app
RUN rm -r $HOME/.cache
CMD python /app/app.py

Akan ada 4 arahan dalam Dockerfile ini yang menukar sistem fail dan mencipta lapisan baharu. Arahan

  • FROM mencipta lapisan asas daripada imej ubuntu:18.04. Perintah
  • LABEL hanya mengubah suai metadata imej dan tidak mencipta lapisan baharu. Perintah
  • COPY akan menambah kandungan direktori semasa di mana binaan ini dilaksanakan pada imej, dan lapisan baharu akan dibuat untuk merekodkan perubahan.
  • Arahan RUN pertama, yang membina atur cara dan mengeluarkan hasil kepada imej, mencipta lapisan baharu untuk merekodkan perubahan.
  • Perintah RUN kedua memadamkan direktori cache dan mencipta lapisan baharu untuk merekodkan perubahan. Arahan
  • CMD mentakrifkan arahan untuk dijalankan dalam bekas Ia hanya mengubah suai metadata imej dan tidak mencipta lapisan baharu.

Di sini setiap lapisan hanya merekodkan perbezaan daripada lapisan sebelumnya. Apabila kita mencipta bekas, lapisan boleh tulis dicipta, juga dipanggil lapisan bekas. Perubahan kepada kandungan bekas yang sedang berjalan direkodkan dalam lapisan ini. Rajah berikut menerangkan perhubungan ini:

2. Lapisan bekas

Perbezaan utama antara bekas dan imej ialah peringkat atas Lapisan tulis adalah berbeza Semua operasi tulis ke bekas akan direkodkan dalam lapisan ini Jika bekas itu dipadamkan, lapisan boleh tulis juga akan dipadamkan, tetapi imej akan dikekalkan.

Nota: Jika anda mahu berbilang bekas berkongsi data yang sama, anda boleh menggunakan Jilid Docker.

Setiap bekas mempunyai lapisan boleh tulis sendiri, tempat semua transformasi disimpan, jadi berbilang bekas boleh berkongsi imej yang sama. Angka berikut menerangkan perhubungan ini:

Nota: Terdapat butiran lain di sini berbilang cermin mungkin berkongsi lapisan yang sama, seperti dua cermin lapisan yang sama ditemui secara tempatan apabila membina atau menarik, ia tidak akan dibina atau ditarik lagi. Oleh itu, apabila mengira saiz imej, anda tidak boleh menjumlahkannya hanya dengan saiz yang dipaparkan oleh perintah docker images Nilai mungkin lebih besar daripada nilai sebenar.

3. Ruang yang diduduki oleh bekas pada cakera

Anda boleh menggunakan perintah docker ps -s untuk melihat ruang yang diduduki oleh bekas yang sedang berjalan (nilai separa) . Kandungan berbeza yang diwakili oleh dua lajur:

  • saiz: Saiz cakera yang diduduki oleh lapisan boleh tulis bekas
  • saiz maya: Mengandungi saiz lapisan boleh tulis bekas dan baca sahaja gambar .

Cara lain bekas mengisi ruang cakera:

  • Log fail yang dijana oleh bekas.
  • Kandungan dipasang menggunakan Kelantangan dan pelekap bind.
  • Fail konfigurasi kontena
  • Kandungan dalam ingatan (jika pertukaran didayakan)
  • Tempat semak (jika ciri ini digunakan)

4.Strategi Copy-on-Write (CoW)

Pemacu storan dalam Docker semuanya menggunakan strategi ini.

Strategi CoW boleh berkongsi dan menyalin fail dengan kecekapan maksimum. Jika fail wujud dalam lapisan bawah imej, maka lapisan atasnya (termasuk lapisan boleh tulis) perlu membaca kandungan dan boleh menggunakan fail secara terus. Apabila ia perlu diubah suai, fail disalin ke lapisan ini dan diubah suai. Ini meminimumkan IO dan saiz setiap lapisan berikutnya.

4.1 Perkongsian menjadikan imej lebih kecil

Apabila kita menggunakan docker pull untuk menarik imej atau mencipta bekas menggunakan imej yang tidak tersedia secara setempat, imej itu akan menjadi storan berperingkat ke dalam kawasan storan Dockers tempatan. Dalam linux selalunya /var/lib/docker.

Kita boleh pergi ke direktori /var/lib/docker/<storage-driver></storage-driver> untuk melihat bahawa kita telah menarik imej setiap lapisan. Contohnya, gunakan pemacu storan overlay2.

Dengan begitu banyak lapisan, kita boleh menggunakan docker image inspect untuk melihat lapisan mana yang mengandungi imej tertentu

docker image inspect --format "{{json .RootFS.Layers}}" redis

docker image inspect --format "{{json .RootFS.Layers}}" mysql:5.7

Anda boleh mempelajari idea penggunaan semula berlapis dengan Docker dalam sepuluh minit

Melalui semakan di atas, kita dapat melihat bahawa redis dan mysql5.7 menggunakan lapisan yang sama Berkongsi lapisan yang sama sangat menjimatkan ruang untuk menyimpan imej, dan juga meningkatkan kelajuan menarik imej .

我们可以通过 docker image history命令来查看镜像分层情况,以redis为例

docker history redis

注意 :

  • 有些步骤的大小为0,是因为他们只改变了元数据,并不会产生新层,也不会占用额外的空间(除元数据本身)。所以上述redis镜像中包含了5层。

  • <missing></missing>步骤,这些步骤可能是以下情况中的一种

    • 在另一个系统上构建的
    • 从Docker Hub中提取的
    • 使用BuildKit作为构建器构建的。

4.2复制让容器更有效率

当我们启动一个容器的时候,会添加一个可写层在镜像之上,用于存储所有的变化。当对已有文件进行修改的时候采用CoW策略。首先会到各层寻找到该文件,然后复制该文件到可写层,然后进行修改并存储。

这么做能够让我们最大限度地减少I/O操作。

但是,很明显的是当一个容器中的应用需要进行频繁的写操作,那么会造成可写层越来越庞大,此时我们可以通过Volume来帮助我们分担压力。

容器的元数据和日志是单独存放的,一般是存放在 /var/lib/docker/containers中,我们可以使用 du -sh /var/lib/docker/containers/*来查看各个容器占用多少。(容器ID其实就是文件夹名称的前12位)。

推荐学习:《docker视频教程

Atas ialah kandungan terperinci Anda boleh mempelajari idea penggunaan semula berlapis dengan Docker dalam sepuluh minit. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Artikel ini dikembalikan pada:csdn.net. Jika ada pelanggaran, sila hubungi admin@php.cn Padam