Meskipun ada banyak blog dan tutorial bagus tentang Podman dan Buildah, pengguna Docker jelas tidak memiliki penjelasan yang jelas dan ringkas tentang bagaimana mereka beralih ke Podman, mengapa Buildah diperlukan dalam masalah lain seperti ini.

Kami akan mencoba menjawab pertanyaan-pertanyaan ini dan memberi tahu Anda cara bermigrasi dengan mulus dari Docker ke Podman.
Cara Kerja Docker
Mari kita mulai dengan menjelaskan cara kerja Docker untuk memahami mengapa Podman dan Buildah muncul. Seperti yang Anda ketahui, perintah Docker hanya berfungsi saat proses daemon Docker sedang berjalan. Gagasan dengan daemon, tampaknya, adalah untuk mengumpulkan di satu tempat semua hal keren yang dilakukan Docker, dan pada saat yang sama mengatur API yang berguna untuk bekerja dengannya di masa depan. Seperti yang ditunjukkan pada gambar di bawah, daemon Docker berisi semua fungsi yang diperlukan untuk melakukan tugas-tugas berikut:
- Tarik dan dorong operasi saat bekerja dengan registri gambar;
- Membuat salinan gambar di penyimpanan wadah lokal dan menambahkan lapisan ke wadah ini;
- Melakukan perubahan pada wadah dan menghapus gambar wadah dari repositori lokal pada host;
- Meminta kernel OS untuk meluncurkan wadah di namespace, cgroup yang sesuai, dll.
Intinya, daemon Docker menangani semua pekerjaan dengan pendaftar, gambar, wadah, dan kernel. Dan Anda hanya memberi tahu dia apa yang harus dilakukan melalui antarmuka baris perintah (CLI).
Di sini kita tidak akan menimbang pro dan kontra dari pendekatan ini, ketika semuanya dikumpulkan dalam satu proses setan. Banyak argumen dapat dibuat untuknya, dan pada saat kemunculan Docker, itu masuk akal. Namun, dengan penggunaan Docker yang aktif, pertanyaan mulai muncul padanya, misalnya, seperti:
- Satu proses berarti satu titik kegagalan;
- Proses daemon memiliki semua proses anak (menjalankan wadah);
- Ketika iblis pergi, proses anak tetap yatim;
- Perakitan kontainer memiliki lubang keamanan;
- Untuk melakukan operasi Docker, pengguna perlu hak akses root penuh.
Ada keluhan lain. Seseorang mungkin tidak setuju dengan ini atau mengatakan bahwa kekurangan ini telah dihilangkan, tetapi kita tidak akan berdebat. Pengembang Podman percaya bahwa mereka telah berhasil menyelesaikan banyak masalah ini, dan jika Anda ingin memanfaatkan Podman, maka artikel ini cocok untuk Anda.
Inti dari Podman adalah untuk berinteraksi dengan registry gambar, dengan wadah dan penyimpanan gambar, serta dengan kernel Linux, bukan melalui daemon, tetapi langsung melalui proses runC, yang bertanggung jawab untuk meluncurkan kontainer.
Sekarang setelah kami mengetahui sebagian motif pengembang Podman, saatnya untuk membahas apa arti transisi ke Podman bagi pengguna. Dan di sini kita perlu memahami dan mengklarifikasi (kami akan melakukannya di bawah) berikut ini:
- Podman menggantikan Docker. Pada saat yang sama, tidak perlu lagi memulai beberapa jenis proses daemon, seperti daemon Docker;
- Perintah Docker yang familier bekerja dengan cara yang sama di Podman;
- Podman tidak menyimpan wadah dan gambar di tempat yang sama dengan Docker;
- Gambar Podman dan Docker kompatibel;
- Di lingkungan Kubernetes, Podman mampu lebih dari Docker;
- Dan juga kita akan menganalisis apa itu Buildah dan mengapa itu diperlukan.
Instalasi Podman
Jika Anda menggunakan Docker, Anda dapat menghapusnya saat Anda memutuskan untuk beralih. Namun, Anda dapat meninggalkan Docker saat mencoba Podman. Ada beberapa
pelajaran bermanfaat dan
demo hebat yang mungkin berguna untuk dibaca dan dilihat sebagai permulaan sehingga Anda dapat lebih memahami proses transisi. Salah satu contoh dalam demo membutuhkan Docker untuk menunjukkan kompatibilitas.
Untuk menginstal Podman di
Red Hat Enterprise Linux 7.6 atau yang lebih baru, gunakan yang berikut ini; jika Anda menggunakan Fedora, ganti yum dengan dnf:
# yum -y install podman
Podman menggunakan perintah yang sama dengan Docker
Podman dirancang agar mudah dipindahkan dari Docker. Karenanya, semua tim yang Anda kenal dari Docker bekerja dengan cara yang sama di Podman. Selain itu, dikatakan bahwa skrip panggilan Docker akan berfungsi dengan baik jika Anda membuat alias yang sesuai, seperti ini: alias docker = podman - coba saja. Tentu saja, sebelum itu Anda perlu menghentikan Docker (systemctl stop docker). Selain itu, Anda dapat menginstal paket podman-docker, yang akan melakukan semua konversi yang diperlukan untuk Anda. Itu hanya menempatkan skrip di / usr / bin / docker yang menjalankan Podman dengan argumen yang sama yang digunakan Docker.
Perintah Docker yang biasa, seperti tarik, dorong, bangun, jalankan, komit, beri tag, dll., Semuanya ada di Podman. Lihat manual Podman untuk informasi lebih lanjut. Perbedaan penting adalah bahwa di Podman beberapa tim telah menambahkan flag kenyamanan, misalnya, flag --all (-a) untuk perintah podman rm dan podman rmi, yang menurut banyak orang akan sangat berguna.
Selain itu, Podman dapat dijalankan sebagai pengguna biasa, tanpa hak akses root. Benar, sejauh ini ini hanya berfungsi di Fedora dan dengan Podman 1.0, dan di RHEL akan muncul mulai dengan versi 7.7 dan 8.1. Ini telah dimungkinkan berkat perbaikan dalam perlindungan pengguna. Berjalan sebagai pengguna biasa berarti bahwa secara default Podman menyimpan gambar dan wadah di direktori home pengguna, kami akan membahas ini secara lebih rinci di bagian selanjutnya. Untuk mempelajari lebih lanjut tentang cara menjalankan Podman tanpa hak akses root, lihat artikel Dan Walsh
Bagaimana cara kerja Podman tanpa root? .
Podman dan gambar kontainer
Saat Anda pertama kali memasukkan perintah gambar podman, Anda kemungkinan besar akan berkecil hati, karena Anda tidak akan melihat gambar Docker yang telah diunduh ke komputer Anda sebelumnya. Faktanya adalah, repositori Podman lokal terletak di folder / var / lib / container, dan bukan di direktori / var / lib / docker. Ini dilakukan tidak hanya seperti itu, tetapi sebagai bagian dari struktur penyimpanan baru yang memenuhi standar OCI (Open Containers Initiative).
Pada 2015, Docker, Red Hat, CoreOS, SUSE, Google, dan penentu tren penampung Linux lainnya menciptakan Open Container Initiative, sebuah badan independen untuk mengelola spesifikasi standar untuk format gambar kontainer dan runtime-nya. Sebagai bagian dari OCI, proyek wadah / gambar dan wadah / penyimpanan dibuat di GitHub.
Karena Podman dapat dijalankan tanpa hak root, ia membutuhkan tempat terpisah untuk merekam gambar. Oleh karena itu, repositori Podman terletak di direktori home user ~ / .local / share / container. Ini membantu menghindari situasi di mana mereka dapat menulis semuanya di / var / lib / container, dan terkait dengan praktik lain yang berbahaya dari sudut pandang keamanan. Selain itu, sekarang setiap pengguna memiliki wadahnya sendiri yang terpisah, sehingga beberapa pengguna dapat bekerja secara bersamaan pada host sekaligus. Setelah selesai bekerja, pengguna dapat mendorong-kirim ke registri umum untuk membuat gambar mereka tersedia untuk orang lain.
Saat beralih dari Docker ke Podman, mengetahui jalur lokasi kontainer baru akan berguna saat debugging, serta ketika Anda ingin menghapus repositori lokal dengan perintah rm -rf / var / lib / wadah untuk memulai dari awal. Namun, dengan beralih ke Podman, Anda kemungkinan besar akan mulai menggunakan opsi -semua baru untuk perintah podman rm dan podman rmi alih-alih perintah ini.
Kompatibilitas kontainer antara Podman dan runtime lainnya
Terlepas dari lokasi berbeda dari repositori lokal, Docker dan Podman membuat gambar kontainer yang kompatibel dengan standar OCI. Podman dapat menggunakan pendaftar kontainer populer, seperti Quay.io atau Docker Hub, serta pendaftar pribadi di kedua arah (dorong dan tarik). Misalnya, dengan Podman, Anda dapat mengunduh dan menjalankan gambar Fedora terbaru dari Docker Hub. Jika Anda tidak menentukan registri, Podman secara default akan mencari pendaftar yang terdaftar di file Registries.conf, mengikuti urutan yang ditentukan dalam file ini. Awalnya, yang pertama dalam file ini adalah registri Docker Hub.
$ podman pull fedora:latest $ podman run -it fedora bash
Gambar yang telah diunggah ke registri menggunakan Docker dapat diunduh dan dijalankan menggunakan Podman. Misalnya, jika kami membuat gambar myfedora menggunakan Docker dan mengunggahnya ke repositori Quay.io kami (ipbabble), maka Anda dapat mengunduhnya menggunakan Podman, berikut caranya:
$ podman pull quay.io/ipbabble/myfedora:latest $ podman run -it myfedora bash
Podman memungkinkan Anda untuk dengan mudah dan elegan memindahkan gambar antara direktori / var / lib / docker dan / var / lib / container menggunakan perintah push dan pull, misalnya:
$ podman push myfedora docker-daemon:myfedora:latest
Jelas bahwa jika Anda menghilangkan docker-daemon dalam contoh ini, pengiriman push akan pergi ke Docker Hub. Jika Anda menentukan quay.io/myquayid/myfedora, gambar akan diunggah ke registri Quay.io (di sini myquayid adalah nama akun kami di Quay.io):
$ podman push myfedora quay.io/myquayid/myfedora:latest
Jika Anda memutuskan bahwa Anda siap untuk meninggalkan Docker, untuk mencopotnya, cukup tutup daemon dan kemudian hapus paket Docker menggunakan manajer paket. Tetapi sebelum itu, pastikan untuk mengunduh semua gambar yang Anda butuhkan menggunakan Docker ke registri eksternal (bukan lokal) sehingga Anda dapat mengunduhnya dari sana nanti. Atau Anda dapat menggunakan Podman untuk mengunduhnya dari repositori Docker lokal ke repositori Podman OCI lokal. Misalnya, di RHEL, transfer gambar fedora dilakukan seperti ini:
# systemctl stop docker # podman pull docker-daemon:fedora:latest # yum -y remove docker # optional
Podman memudahkan untuk beralih ke Kubernetes
Podman menawarkan sejumlah fitur tambahan - dibandingkan dengan Docker - yang berguna bagi pengembang dan operator TI saat bekerja dengan Kubernetes, khususnya, perintah yang berguna yang tidak dimiliki Docker. Jika Anda terbiasa dengan Docker dan mempertimbangkan untuk pindah ke Kubernetes / OpenShift sebagai platform wadah, maka Podman akan berguna.
Podman dapat menghasilkan file YAML Kubernetes berdasarkan wadah yang sedang berjalan menggunakan perintah podman generate kube. Dan ketika men-debug pod yang sedang berjalan, di samping perintah standar untuk bekerja dengan kontainer, Anda juga dapat menggunakan perintah podman pod. Untuk informasi lebih lanjut tentang bagaimana Podman membantu beralih ke Kubernetes, lihat artikel Brent Baude Podman sekarang dapat memudahkan transisi ke Kubernetes dan CRI-O.
Buildah - apa itu dan mengapa
Buildah muncul lebih awal dari Podman. Dan ini kadang-kadang mengecilkan hati pengguna Docker: βMengapa pembela Podman tiba-tiba berbicara tentang Buildah? Podman tidak tahu bagaimana membangun? "
Kami segera meyakinkan, Podman bisa, dan melakukannya seperti Docker. Yaitu, perakitan dapat dilakukan baik menggunakan Dockerfile dan perintah podman build, atau Anda dapat memulai wadah, melakukan perubahan yang diperlukan dan kemudian mengkomitnya (mengeksekusi komit), membuat tag baru dalam gambar wadah. Dalam interpretasi kami, Buildah adalah serangkaian perintah untuk membuat dan mengelola gambar kontainer, dan karenanya memberikan kontrol yang jauh lebih baik ketika bekerja dengan gambar. Perintah build Podman sebagian berisi fungsionalitas Buildah dan menggunakan kode program yang sama untuk build seperti Buildah itu sendiri.
Cara paling efisien untuk menggunakan Buildah adalah dengan menulis skrip Bash untuk membuat gambar, seperti halnya Anda menulis untuk Dockerfile.
Adapun kronologi penampilan Buildah dan Podman, peristiwa terjadi kira-kira sebagai berikut. Ketika Kubernetes belajar untuk bekerja dengan CRI-O berdasarkan pada standar OCI untuk runtime kontainer, daemon Docker tidak lagi diperlukan. Artinya, tidak perlu lagi memasang Docker di semua node cluster Kubernetes untuk menjalankan pod dan kontainer di dalamnya. Kubernetes sekarang dapat memanggil CRI-O, dan yang satu dapat menjalankan RunC secara langsung, yang, pada gilirannya, memulai proses kontainer. Namun, jika pada saat yang sama kami ingin menggunakan cluster Kubernetes yang sama tidak hanya untuk peluncuran, tetapi juga untuk perakitan kontainer (seperti, misalnya, di OpenShift), maka kami memerlukan alat build baru yang tidak akan bergantung pada daemon Docker dan , sebagai akibatnya, tidak akan memerlukan instalasi Docker. Selain itu, alat seperti itu, yang dibuat atas dasar wadah / penyimpanan dan proyek wadah / gambar, akan menghilangkan risiko keamanan yang terkait dengan soket terbuka daemon Docker selama perakitan, dan banyak pengguna Docker khawatir tentang risiko ini.
Dan Buildah menjadi alat yang sangat baru (namanya bertuliskan "membangun" dan meniru aksen Boston dari manajer proyek Dan Walsh sambil mengucapkan kata "pembangun"). Informasi lebih lanjut tentang Buildah dapat ditemukan di buildah.io, serta blog dan panduan tautan di akhir artikel ini.
Ada beberapa detail lainnya untuk dipelajari jika Anda ingin menggunakan Buildah:
- Ini memberikan kontrol yang lebih tepat ketika membuat lapisan gambar. Secara khusus, ini memungkinkan Anda untuk melakukan apa yang ingin dilakukan banyak pengguna wadah - lakukan banyak perubahan sekaligus hanya dengan satu lapisan.
- Lari Buildah dan Lari Podman adalah dua hal yang berbeda. Karena Buildah dirancang untuk membangun gambar, perintah jalankan-nya pada dasarnya sama dengan perintah RUN di Dockerfile. William Henry, salah satu pengembang Buildah, mengenang bagaimana solusi ini muncul: βSaya entah bagaimana mengeluh bahwa beberapa port atau mount tidak berfungsi sama sekali seperti yang saya harapkan. Dan Walsh (@rhatdan) menimbang segalanya dan mengatakan bahwa Buildah seharusnya tidak bekerja dengan wadah dengan cara ini sama sekali. Semua, tidak ada lagi pemetaan port dan tidak ada volume mount. Kami menghapus flag-flag ini dan menggunakan buildah run sebagai gantinya untuk menjalankan perintah yang diperlukan ketika membangun gambar kontainer, misalnya, buildah run dnf -y install nginx. "
- Buildah dapat membuat gambar dari awal (scratch image). Artinya, gambar di mana tidak ada apa-apa, secara harfiah. Memang, jika Anda melihat penyimpanan kontainer yang dibuat sebagai hasil dari buildah dari perintah awal, akan ada direktori kosong. Ini sangat berguna dari sudut pandang membuat gambar super ringan yang hanya berisi paket-paket yang diperlukan untuk menjalankan aplikasi.
Mengapa membangun dari awal? Mari kita bandingkan gambar pengembangan aplikasi Java dengan gambarnya untuk lingkungan produksi atau untuk lingkungan pementasan. Pada tahap pengembangan, gambar mungkin berisi kompiler Java, Maven, dan alat-alat lain yang dibutuhkan pengembang. Tetapi ketika menerjemahkan ke dalam produksi, hanya Java runtime dan paket Anda harus tetap di dalam gambar. Dan omong-omong, untuk menghapus berlebihan, Anda tidak perlu manajer paket sama sekali, seperti DNF / YUM, dan Anda bahkan tidak perlu Bash - Anda dapat melakukan segalanya melalui antarmuka Buildah CLI, seperti yang ditunjukkan pada gambar di bawah ini, di mana wadah multilayer tradisional ada di sebelah kiri dan wadah satu lapis berada di sebelah kanan dan wadah satu lapis berada di sebelah kanan. gambar awal. Lihat
Membangun Gambar Wadah Buildah untuk Kubernet dan
demo pengantar Buildah untuk detail lebih lanjut .
Kembali ke kronologi. Jadi, Kubernetes belajar untuk bekerja dengan CRI-O dan runC, dan untuk build yang kami menumpuk Buildah - semuanya, bisakah Anda menolak dari Docker pada host Kubernet? Tidak, debugging masih ada. Bagaimana mengatasi masalah dengan kontainer jika tuan rumah tidak memiliki alat yang sesuai? Jangan menaruh Docker di atasnya, kalau tidak kita kembali ke setan dan semua upaya sia-sia. Dan kemudian Podman memasuki lokasi.
Artinya, Podman memecahkan dua masalah sekaligus. Pertama, ini memungkinkan operator TI untuk memeriksa wadah dan gambar menggunakan perintah yang sudah dikenal. Dan kedua, dia memberikan alat yang sama ini kepada pengembang. Akibatnya, semua pengguna Docker - baik pengembang maupun operator - dapat beralih ke Podman dan dengan tenang melakukan tugas yang sebelumnya mereka gunakan Docker, serta menyelesaikan serangkaian tugas baru.
Sumber daya yang dibutuhkan:
- Situs web untuk proyek Podman.io dan Buildah.io.
- Proyek di github.com/containers (terhubung, pelajari sumbernya dan lihat apa yang sedang dikembangkan:
- libpod (Podman);
- buildah;
- gambar (kode untuk bekerja dengan wadah gambar OCI);
- penyimpanan (kode untuk penyimpanan gambar kontainer lokal).
Tautan yang bermanfaat: