Membangun Container dengan Containerfile
Membuat Containerfile
Jika container belum ada untuk aplikasi Anda, container dapat dibangun untuk perangkat Anda.
Umumnya untuk membuat image dari direktori kerja yang menyimpan Containerfile dan file pendukung lainnya. Ini mungkin berupa direktori yang dikontrol versi untuk memfasilitasi berbagi.
$ mkdir container-demo && cd container-demo
Ada banyak contoh membangun container menggunakan Containerfile. Containerfile sederhana akan berisi beberapa elemen berikut:
-
Baris FROM menunjukkan container dasar, atau awal, seperti image Fedora terbaru. Image ini akan ditarik jika belum tersedia secara lokal. Tentukan detail untuk image mana yang sama seperti yang Anda lakukan dengan perintah
podman pull. -
Membuat layer dengan setiap perintah RUN. Cobalah untuk meminimalkan jumlah layer dengan beberapa perintah pada baris yang sama menggunakan && di antara perintah. Juga sertakan perintah pembersihan seperti
dnf clean alluntuk mengurangi ukuran image akhir. -
Salin konten dari direktori kerja ke dalam container.
-
Tentukan port apa pun yang akan didengarkan dengan EXPOSE
-
Mulai aplikasi Anda
-
CMD dapat ditimpa dengan perintah podman run
-
ENTRYPOINT sering kali perintah dasar dan opsi default. Dapat digabungkan dengan CMD untuk opsi tambahan.
-
Contoh: Aplikasi web
Buat direktori kerja dengan beberapa konten untuk server web:
$ mkdir demo-httpd && cd demo-httpd && echo 'sample container' > index.html
Mulai Containerfile dengan perintah FROM untuk menunjukkan image dasar:
$ echo 'FROM fedora:latest' >> Containerfile
Tambahkan perintah RUN untuk memperbarui image dan menambahkan aplikasi dan utilitas apa pun:
$ echo 'RUN dnf -y update && dnf -y install httpd git && dnf clean all' >> Containerfile
Contoh di atas menginstal git. Jika konten web Anda dihosting dalam sistem kontrol versi, Anda dapat menambahkan pernyataan RUN untuk mengkloning data tersebut ke container. Jika konten Anda tersedia di direktori kerja build, Anda dapat menggunakan perintah COPY untuk menambahkannya ke container.
Salin ke file contoh index.html ke dalam container:
$ echo 'COPY index.html /var/www/html/index.html' >> Containerfile
Baris EXPOSE menentukan bahwa container mendengarkan pada port jaringan yang ditentukan. Ini digunakan oleh opsi --publish-all pada perintah podman run.
Dokumentasikan port apa yang tersedia untuk dipublikasikan:
$ echo 'EXPOSE 80' >> Containerfile
Tentukan perintah yang akan dijalankan ketika container dimulai:
$ echo 'ENTRYPOINT /usr/sbin/httpd -DFOREGROUND' >> Containerfile
| Pengikatan port belum didukung oleh container rootless. Jika container Anda perlu tersedia di jaringan, bangun di namespace root. Pengikatan port untuk container rootless tersedia dalam pengujian upstream untuk podman 1.1.0 dengan slirp4netns v0.3.0. |
Bangun image dengan tag deskriptif:
$ sudo podman build --tag fedora:myhttpd -f ./Containerfile
Image akan muncul di registry lokal:
$ sudo podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/fedora myhttpd 223534b48a9c 3 minutes ago 474MB docker.io/library/fedora latest 8b38e3af7237 4 weeks ago 315MB
Untuk membuat port aplikasi tersedia untuk perangkat host gunakan opsi --publish atau -p dengan nomor hostPort:containerPort. IP juga dapat ditentukan serta rentang port. Lihat halaman manual untuk opsi lebih lanjut.
Jalankan container dan publikasikan port:
$ sudo podman run -p 8080:80 --name myhttpd --rm fedora:myhttpd
Lihat informasi port:
$ sudo podman port myhttpd 80/tcp -> 0.0.0.0:8080
Akses halaman web dari perangkat host:
$ curl localhost:8080
Akses halaman web dari lokasi remote menggunakan alamat IP perangkat host dan nomor port yang dipublikasikan.
Buka port firewall, layanan, atau sumber sesuai kebutuhan. Image Fedora IoT secara default mengizinkan sumber apa pun di jaringan yang sama melalui opsi interfaces:
$ sudo firewall-cmd --list-all public (active) target: default icmp-block-inversion: no interfaces: eth0 sources: services: dhcpv6-client mdns ssh ports: protocols: masquerade: no forward-ports: source-ports: icmp-blocks: rich rules:
Tambahkan port dengan:
$ sudo firewall-cmd --add-port 8080/tcp
Informasi lebih lanjut tentang perintah firewall-cmd dapat ditemukan di firewalld.org.
Contoh: Interaksi dengan antarmuka GPIO
Untuk berinteraksi dengan antarmuka GPIO, layer paket libgpiod-utils pada image yang ada atau gunakan dengan container.
Untuk melayer paket:
$ sudo rpm-ostree install libgpiod-utils python3-libgpiod $ sudo gpiodetect
Untuk membuat container untuk aplikasi yang bekerja dengan antarmuka GPIO di namespace root.
Mulai Containerfile dengan perintah FROM untuk menunjukkan image dasar:
$ echo 'FROM fedora:latest' >> Containerfile
Tambahkan perintah RUN untuk memperbarui image dan menambahkan aplikasi dan utilitas apa pun:
$ echo 'RUN dnf -y update && dnf -y install git libgpiod-utils python3-libgpiod && dnf clean all' >> Containerfile
Image fedora:latest menyertakan bash sehingga kita dapat melanjutkan dan membangun container tanpa aplikasi spesifik untuk dimulai atau port untuk diekspos. Perintah dapat ditentukan saat kita menjalankan container.
Bangun image dengan tag deskriptif:
$ sudo podman build --tag fedora:gpio -f ./Containerfile
Image akan muncul di registry localhost untuk namespace root:
$ sudo podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/fedora gpio 655abf78e6b9 4 minutes ago 542MB docker.io/library/fedora latest 8b38e3af7237 4 weeks ago 315MB
Untuk mengakses perangkat GPIO host dari container, gunakan opsi --device saat Anda memulai container:
$ sudo podman run -it --name demo-gpio --device=/dev/gpiochip0 localhost/fedora:gpio /bin/bash
Verifikasi Anda dapat melihat perangkat GPIO:
[root@167f31750fdb /]# gpiodetect gpiochip0 [pinctrl-bcm2835] (54 lines)
Sekarang perangkat tersedia dari container, lanjutkan untuk menggunakan alat yang diinstal atau tambahkan aplikasi tambahan.
Contoh untuk menggunakan gpioset dapat ditemukan di artikel Fedora Magazine 2018: How to turn on an LED with Fedora IoT
Otomatiskan langkah tambahan dengan memodifikasi Containerfile dan membangun container baru.
Image tidak harus dibangun dari container Fedora. Containerfile ini menggunakan image raspbian dan mengkloning proyek lightshowpi:
$ cat Containerfile FROM raspbian/stretch:latest RUN apt-get -y update && apt-get -y install git-core && apt-get -y clean WORKDIR / RUN git clone [https://togiles@bitbucket.org/togiles/lightshowpi.git](https://togiles@bitbucket.org/togiles/lightshowpi.git) && \ cd lightshowpi && git fetch && git checkout stable
Dokumentasi Docker menyertakan praktik terbaik Containerfile.
Menggunakan Kembali dan Berbagi Container
Setelah image container dibuat, image dapat diterapkan ke beberapa perangkat dengan mengunggahnya ke registry.
Sebagian besar registry memerlukan konvensi penamaan 'useraccount/description:tag' dan default untuk sebagian besar perintah pull adalah mencari container dengan tag 'latest'. Image dapat memiliki beberapa tag dan tag ini digunakan untuk membantu mengidentifikasi kompatibilitas arsitektur dan kontrol versi.
Untuk mengganti nama atau menambahkan tag ke image lokal:
$ podman tag fedora:myhttpd testuser/fedora-myhttpd:latest $ podman tag fedora:myhttpd quay.io/testuser/fedora-myhttpd:latest
Kedua nama akan muncul dalam daftar image tetapi ID image akan sama untuk masing-masing:
$ podman images REPOSITORY TAG IMAGE ID CREATED SIZE localhost/fedora myhttpd d52cbe4136e8 24 hours ago 428 MB localhost/testuser/fedora-myhttpd latest d52cbe4136e8 24 hours ago 428 MB quay.io/testuser/fedora-myhttpd latest d52cbe4136e8 24 hours ago 428 MB docker.io/library/fedora latest 26ffec5b4a8a 4 weeks ago 283 MB
Anda kemudian dapat mendorong image ke registry dengan podman push imageID destination.
Untuk mengekstrak image ke direktori lokal dalam format docker:
$ podman push quay.io/testuser/fedora-myhttpd dir:/tmp/fedora-myhttpd
Untuk opsi ekspor lebih lanjut, lihat halaman manual podman-push.
Want to help? Learn how to contribute to Fedora Docs ›