Rumah > Artikel > Operasi dan penyelenggaraan > Anda boleh mempelajari idea penggunaan semula berlapis dengan Docker dalam sepuluh minit
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.
Dokcer bijak menggunakan idea penggunaan semula hierarki semasa mengatur kandungan storan. Jadi kita boleh menggunakan ini sebagai kes untuk mempelajari idea ini.
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. RUN
pertama, yang membina atur cara dan mengeluarkan hasil kepada imej, mencipta lapisan baharu untuk merekodkan perubahan. 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:
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.
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:
Cara lain bekas mengisi ruang cakera:
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.
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
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>
步骤,这些步骤可能是以下情况中的一种
当我们启动一个容器的时候,会添加一个可写层在镜像之上,用于存储所有的变化。当对已有文件进行修改的时候采用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!