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 all untuk 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.