Server FreeBSD Dengan Linux Containers melalui containerd
Apa itu mesin virtualisasi?, Virtualisasi memanfaatkan sumber daya yang tersedia pada komputer seperti penyimpanan, CPU, RAM, dan jaringan untuk membuat mesin virtual atau kontainer yang beroperasi layaknya komputer biasa. Pada FreeBSD, virtualisasi dapat dicapai melalui penggunaan kontainer Linux atau hypervisor. Hypervisor adalah perangkat lunak yang diinstal pada server host untuk menyediakan lapisan abstraksi yang memfasilitasi pembuatan mesin virtual.
Dengan penggunaan kontainer Linux atau LXC, server FreeBSD dapat menjalankan mesin virtual yang berbagi sumber daya host. Kontainerisasi pada FreeBSD memanfaatkan lingkungan runtime kontainer seperti Docker untuk membuat image aplikasi yang terisolasi dari proses sistem lainnya, namun tetap berbagi kernel sistem operasi host. Dalam hal ini, kontainer lebih ringan dan lebih cepat dibandingkan mesin virtual.
Konsep kontainerisasi bukanlah hal baru, namun metode implementasi dan pengelolaannya mungkin belum banyak digunakan. Pada sistem Linux, kita sudah mengenal platform virtualisasi kontainer populer bernama Docker. Namun, tahukah Anda? Kita dapat mengubah server biasa agar dapat menjalankan kontainer dengan bantuan teknologi LXC (Linux Container) pada FreeBSD.
Perkembangan penerapan kontainer berlangsung sangat pesat karena pada dasarnya kontainer kini mampu melakukan segalanya. Pengembang maupun pengguna akhir dapat mengelola seluruh siklus hidup kontainer pada host, termasuk mentransfer dan menyimpan image kontainer, menjalankan serta mengelola kontainer, hingga membangun jaringan.
Mari kita lihat gambar arsitektur kontainer di bawah ini.
Containerd juga memiliki banyak plugin, termasuk Metadata Plugin, GC Plugin, Snapshot Plugin, Runtime Plugin, dan lain-lain. Semua plugin di containerd berada di dalam modul, dan modul itu sendiri merupakan plugin. Secara umum, containerd terbagi menjadi tiga bagian dasar, yaitu Storage, Metadata, dan Runtime.
Panduan dalam artikel ini akan menunjukkan dasar-dasar menjalankan container Linux secara langsung di FreeBSD, tanpa memerlukan mesin virtual. Open Container Initiative (OCI) yang akan kita instal di FreeBSD akan berjalan dengan container Linux melalui containerd.
1. Instal containerd
Containerd adalah runtime kontainer standar industri yang mengutamakan kesederhanaan, ketangguhan, dan portabilitas. Containerd tersedia sebagai daemon untuk Linux, FreeBSD, dan Windows. Sebelum memulai instalasi containerd, disarankan untuk menginstal "runj" dan "nerdctl".
Runj adalah runtime eksperimental yang kompatibel dengan OCI dan berfungsi sebagai proof-of-concept untuk FreeBSD Jail.
Sebelum menginstal runj, masukkan skrip berikut ke dalam berkas "/etc/make.conf".
NO_CHECKSUM=yes
Jalankan perintah berikut untuk menginstal "runj" dan "nerdctl".
root@ns3:~ # cd /usr/ports/sysutils/runj root@ns3:/usr/ports/sysutils/runj # make install clean
root@ns3:/usr/ports/sysutils/runj # cd /usr/ports/sysutils/nerdctl root@ns3:/usr/ports/sysutils/nerdctl # make install clean
Setelah selesai, Anda dapat melanjutkan dengan menginstal containerd menggunakan perintah berikut.
root@ns3:/usr/ports/sysutils/nerdctl # cd /usr/ports/sysutils/containerd root@ns3:/usr/ports/sysutils/containerd # make install clean
Setelah Anda selesai menginstal containerd, sistem akan secara otomatis menghasilkan sekumpulan file biner yang ditempatkan di direktori /usr/local/bin.
- containerd
- containerd-shim
- containerd-shim-runc-v1
- containerd-shim-runc-v2
- crictl
- ctr
Agar containerd berjalan secara otomatis di FreeBSD, tambahkan skrip di bawah ini ke dalam file /etc/rc.conf.
containerd_enable="YES"
Setelah itu anda mulai jalankan containerd.
root@ns3:~ # service containerd restart
2. Konfigurasi Containerd
Setelah Anda mengaktifkan containerd, buatlah file config.toml. Ikuti langkah-langkah di bawah ini.
root@ns3:~ # cd /etc root@ns3:/etc # mkdir -p containerd root@ns3:/etc # cd containerd root@ns3:/etc/containerd # touch config.toml root@ns3:/etc/containerd # mkdir -p /var/lib/containerd/io.containerd.snapshotter.v1.zfs
File konfigurasi default containerd bernama config.toml; secara default, file ini terletak di direktori /etc/containerd/config.toml. Anda dapat membuat konfigurasi default menggunakan perintah berikut.
root@ns3:~ # containerd config default > /etc/containerd/config.toml
Setelah Anda mengaktifkan containerd, jalankan perintah containerd.
root@ns3:/etc/containerd # containerd
Dengan menjalankan perintah di atas, sistem FreeBSD akan membuat skrip config.toml secara otomatis. Anda dapat melihat contoh skripnya di bawah ini.
disabled_plugins = []
imports = []
oom_score = 0
plugin_dir = ""
required_plugins = []
root = "/var/lib/containerd"
state = "/run/containerd"
temp = ""
version = 2
[cgroup]
path = ""
[debug]
address = "/run/containerd/debug.sock"
format = ""
gid = 0
level = "info"
uid = 0
[grpc]
address = "/run/containerd/containerd.sock"
gid = 0
max_recv_message_size = 16777216
max_send_message_size = 16777216
tcp_address = ""
tcp_tls_ca = ""
tcp_tls_cert = ""
tcp_tls_key = ""
uid = 0
[metrics]
address = ""
grpc_histogram = false
[plugins]
[plugins."io.containerd.gc.v1.scheduler"]
deletion_threshold = 0
mutation_threshold = 100
pause_threshold = 0.02
schedule_delay = "0s"
startup_delay = "100ms"
[plugins."io.containerd.internal.v1.opt"]
path = "/opt/containerd"
[plugins."io.containerd.internal.v1.restart"]
interval = "10s"
[plugins."io.containerd.internal.v1.tracing"]
sampling_ratio = 1.0
service_name = "containerd"
[plugins."io.containerd.metadata.v1.bolt"]
content_sharing_policy = "shared"
[plugins."io.containerd.runtime.v2.task"]
platforms = ["freebsd/amd64"]
sched_core = false
[plugins."io.containerd.service.v1.diff-service"]
default = ["walking"]
[plugins."io.containerd.service.v1.tasks-service"]
rdt_config_file = ""
[plugins."io.containerd.snapshotter.v1.native"]
root_path = ""
[plugins."io.containerd.snapshotter.v1.zfs"]
root_path = ""
[plugins."io.containerd.tracing.processor.v1.otlp"]
endpoint = ""
insecure = false
protocol = ""
[proxy_plugins]
[stream_processors]
[stream_processors."io.containerd.ocicrypt.decoder.v1.tar"]
accepts = ["application/vnd.oci.image.layer.v1.tar+encrypted"]
args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
path = "ctd-decoder"
returns = "application/vnd.oci.image.layer.v1.tar"
[stream_processors."io.containerd.ocicrypt.decoder.v1.tar.gzip"]
accepts = ["application/vnd.oci.image.layer.v1.tar+gzip+encrypted"]
args = ["--decryption-keys-path", "/etc/containerd/ocicrypt/keys"]
env = ["OCICRYPT_KEYPROVIDER_CONFIG=/etc/containerd/ocicrypt/ocicrypt_keyprovider.conf"]
path = "ctd-decoder"
returns = "application/vnd.oci.image.layer.v1.tar+gzip"
[timeouts]
"io.containerd.timeout.bolt.open" = "0s"
"io.containerd.timeout.shim.cleanup" = "5s"
"io.containerd.timeout.shim.load" = "5s"
"io.containerd.timeout.shim.shutdown" = "3s"
"io.containerd.timeout.task.state" = "2s"
[ttrpc]
address = ""
gid = 0
uid = 0
3. Menjalankan Container Linux
Setelah containerd berjalan dengan normal di server FreeBSD Anda, gunakan klien baris perintah ctr untuk berinteraksi dengan daemon dan menjalankan beberapa container.
Langkah pertama yang harus Anda lakukan adalah mengambil image. Anda dapat mengambilnya menggunakan perintah ctr.
root@ns3:~ # ctr image pull --snapshotter zfs public.ecr.aws/samuelkarp/freebsd:13.1-RELEASE public.ecr.aws/samuelkarp/freebsd:13.1-RELEASE: resolved |++++++++++++++++++++++++++++++++++++++| index-sha256:6d39171771533e3702cd67368564d5d2dcf2bebd24003df2ff814aa4c5d889d6: exists |++++++++++++++++++++++++++++++++++++++| manifest-sha256:ea7a4554069ea058b6e6cc495800d24502b8e0cda4feddfd3d116ab297f5ff20: exists |++++++++++++++++++++++++++++++++++++++| config-sha256:a7a23666ec0a322705673e135c52fb468f6997f6ba1a141390617086ba23f0ba: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:46f3d931f5af7f4bd06625cec8f8d8633fc5d21acfd9236b3ca4f2b8f141f433: exists |++++++++++++++++++++++++++++++++++++++| elapsed: 1.5 s total: 0.0 B (0.0 B/s) unpacking freebsd/amd64 sha256:6d39171771533e3702cd67368564d5d2dcf2bebd24003df2ff814aa4c5d889d6... done: 51.037526ms root@ns3:~ #
Menjalankan kontainer dengan containerd memerlukan image, snapshotter, dan runtime kontainer.
Repositori sumber runj menyertakan runtime untuk containerd yang bernama wtf.sbk.runj.v1.
Jalankan containerd menggunakan perintah di bawah ini.
root@ns3:~ # ctr run --snapshotter zfs --runtime wtf.sbk.runj.v1 --rm public.ecr.aws/samuelkarp/freebsd:13.1-RELEASE my-container-id sh -c 'echo "Hello, your FreeBSD Containerd is now active!"' Hello, your FreeBSD Containerd is now active! root@ns3:~ #
Sekarang kita akan mencoba perintah ctr lainnya, yaitu dengan menjalankan kontainer Linux.
root@ns3:~ # ctr image pull --platform=linux docker.io/library/alpine:latest docker.io/library/alpine:latest: resolved |++++++++++++++++++++++++++++++++++++++| index-sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b: exists |++++++++++++++++++++++++++++++++++++++| manifest-sha256:6457d53fb065d6f250e1504b9bc42d5b6c65941d57532c072d929dd0628977d0: exists |++++++++++++++++++++++++++++++++++++++| layer-sha256:4abcf20661432fb2d719aaf90656f55c287f8ca915dc1c92ec14ff61e67fbaf8: exists |++++++++++++++++++++++++++++++++++++++| config-sha256:05455a08881ea9cf0e752bc48e61bbd71a34c029bb13df01e40e3e70e0d007bd: exists |++++++++++++++++++++++++++++++++++++++| elapsed: 2.0 s total: 0.0 B (0.0 B/s) unpacking linux/amd64 sha256:c5b1261d6d3e43071626931fc004f70149baeba2c8ec672bd4f27761f8e1ad6b... done: 19.442453ms root@ns3:~ #
root@ns3:~ # ctr run --rm --tty --runtime wtf.sbk.runj.v1 --snapshotter zfs --platform linux docker.io/library/alpine:latest mylinuxcontainer uname -a Linux 4.4.0 FreeBSD 13.2-RELEASE releng/13.2-n254617-525ecfdad597 GENERIC x86_64 Linux root@ns3:~ #
Jika Anda ingin melihat daftar mirror lokal, gunakan perintah berikut.
root@ns3:~ # ctr i ls
Untuk operasi mirror yang lebih lanjut, Anda dapat menggunakan perintah subkonten seperti online mirror image dan editing bloband.
root@ns3:~ # ctr content ls
Untuk lebih memahami penggunaan containerd, kita akan membuat kontainer baru di FreeBSD. Gunakan perintah berikut untuk mengunduh image mirror.
root@ns3:~ # ctr image pull --platform=linux docker.io/library/nginx:alpine docker.io/library/nginx:alpine: resolved |++++++++++++++++++++++++++++++++++++++| index-sha256:f2802c2a9d09c7aa3ace27445dfc5656ff24355da28e7b958074a0111e3fc076: exists |++++++++++++++++++++++++++++++++++++++| manifest-sha256:b1cfc4e0e01b4dceca3265fd4ca97921569fca1a10919639bedfa8dad9127027: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:efb7d60b16cfcd8e0daecf965b6f5575423bf03ac868cbd7def5803501b311b1: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:9e03973bc8036b5eecce7b2d9996cc16108ad4fe366bafd5e0b972c57339404e: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:a3a550dcd38681a0c4c41afd0f4977260b70ceec241359a0b35f443e865bdaff: done |++++++++++++++++++++++++++++++++++++++| config-sha256:2b70e4aaac6b5370bf3a556f5e13156692351696dd5d7c5530d117aa21772748: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:d18780149b8172369a5d5194091eb33adc7fcbfd32056d7eb3cedde75725bf82: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:619be1103602d98e1963557998c954c892b3872986c27365e9f651f5bc27cab8: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:4ea31a8fb8756a19d3e7710cb8be2b66aea4e678cc836b88c8c8daa4b564d55b: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:6c866301bd2c1af4fb61766a45a078102eedab8c7b910c0796eab6ea99b14577: done |++++++++++++++++++++++++++++++++++++++| layer-sha256:e57ebb3e206791646f52f35d99488b64a61ab4a1d39b7be52b15d82bd3b12988: done |++++++++++++++++++++++++++++++++++++++| elapsed: 8.0 s total: 1.8 Mi (234.1 KiB/s) unpacking linux/amd64 sha256:f2802c2a9d09c7aa3ace27445dfc5656ff24355da28e7b958074a0111e3fc076... done: 7.903605972s root@ns3:~ #
Buat sebuah kontainer.
root@ns3:~ # ctr c create docker.io/library/nginx:alpine nginx
Berikut ini adalah contoh cara hapus kontainer gambar.
root@ns3:~ # ctr image rm docker.io/library/nginx:alpine
Containerd yang berjalan di FreeBSD dan runj sama-sama bersifat eksperimental dan masih dalam tahap pengembangan.
Meskipun fungsionalitas yang ditunjukkan dalam artikel ini dapat berjalan, masih banyak fitur yang belum tersedia.
Anda dapat memantau perkembangan lebih lanjut di repositori containerd dan repositori runj di GitHub.
