ສ້າງຄອນເທນເນີດ້ວຍ Containerfile

ການສ້າງ Containerfile

ຖ້າຫາກຍັງບໍ່ມີຄອນເທນເນີສຳລັບແອັບພລິເຄຊັນຂອງທ່ານ, ທ່ານສາມາດສ້າງມັນຂຶ້ນມາສຳລັບອຸປະກອນຂອງທ່ານໄດ້.

ໂດຍທົ່ວໄປແລ້ວແມ່ນຈະສ້າງອິເມຈ (image) ຈາກໄດເຣັກທໍຣີເຮັດວຽກທີ່ບັນຈຸ Containerfile ແລະ ໄຟລ໌ເສີມຕ່າງໆ. ນີ້ອາດຈະເປັນໄດເຣັກທໍຣີທີ່ມີການຄວບຄຸມເວີຊັນ (version controlled) ເພື່ອໃຫ້ງ່າຍຕໍ່ການແບ່ງປັນ.

$ mkdir container-demo && cd container-demo

ມີຕົວຢ່າງຫຼາຍຢ່າງໃນການສ້າງຄອນເທນເນີໂດຍໃຊ້ Containerfile. Containerfile ແບບພື້ນຖານຈະປະກອບມີບາງອົງປະກອບດັ່ງຕໍ່ໄປນີ້:

  • ແຖວ FROM ຈະລະບຸຖານ (base) ຫຼື ຈຸດເລີ່ມຕົ້ນຂອງຄອນເທນເນີ, ເຊັ່ນ ອິເມຈ Fedora ລຸ້ນຫຼ້າສຸດ. ອິເມຈນີ້ຈະຖືກດຶງ (pull) ລົງມາ ຖ້າຍັງບໍ່ມີຢູ່ໃນເຄື່ອງ. ການລະບຸລາຍລະອຽດຂອງອິເມຈແມ່ນໃຊ້ຮູບແບບດຽວກັນກັບຄຳສັ່ງ podman pull.

  • ສ້າງເລເຢີ (layer) ດ້ວຍແຕ່ລະຄຳສັ່ງ RUN. ພະຍາຍາມຫຼຸດຈຳນວນເລເຢີໂດຍການໃຊ້ຫຼາຍຄຳສັ່ງໃນແຖວດຽວກັນດ້ວຍການໃຊ້ && ລະຫວ່າງຄຳສັ່ງ. ນອກຈາກນີ້ຄວນລວມເອົາຄຳສັ່ງທຳຄວາມສະອາດ ເຊັ່ນ dnf clean all ເພື່ອຫຼຸດຂະໜາດຂອງອິເມຈສຸດທ້າຍ.

  • ຄັດລອກເນື້ອຫາຈາກໄດເຣັກທໍຣີເຮັດວຽກເຂົ້າໄປໃນຄອນເທນເນີ.

  • ລະບຸພອດ (port) ທີ່ຕ້ອງການໃຫ້ລໍຖ້າການເຊື່ອມຕໍ່ດ້ວຍ EXPOSE

  • ເລີ່ມຕົ້ນແອັບພລິເຄຊັນຂອງທ່ານ

    • CMD ສາມາດຖືກຂຽນທັບໄດ້ດ້ວຍຄຳສັ່ງ podman run

    • ENTRYPOINT ມັກຈະເປັນຄຳສັ່ງຫຼັກ ແລະ ຕົວເລືອກເລີ່ມຕົ້ນ. ສາມາດໃຊ້ຮ່ວມກັບ CMD ສຳລັບຕົວເລືອກເພີ່ມເຕີມ.

ຕົວຢ່າງ: ເວັບແອັບພລິເຄຊັນ

ສ້າງໄດເຣັກທໍຣີເຮັດວຽກພ້ອມກັບເນື້ອຫາບາງຢ່າງສຳລັບເວັບເຊີເວີ:

$ mkdir demo-httpd && cd demo-httpd && echo 'sample container' > index.html

ເລີ່ມຕົ້ນ Containerfile ດ້ວຍຄຳສັ່ງ FROM ເພື່ອລະບຸອິເມຈພື້ນຖານ:

$ echo 'FROM fedora:latest' >> Containerfile

ເພີ່ມຄຳສັ່ງ RUN ເພື່ອອັບເດດອິເມຈ ແລະ ເພີ່ມແອັບພລິເຄຊັນ ຫຼື ເຄື່ອງມືຕ່າງໆ:

$ echo 'RUN dnf -y update && dnf -y install httpd git  && dnf clean all' >> Containerfile

ຕົວຢ່າງຂ້າງເທິງແມ່ນການຕິດຕັ້ງ git. ຖ້າເນື້ອຫາເວັບຂອງທ່ານຖືກເກັບໄວ້ໃນລະບົບຄວບຄຸມເວີຊັນ, ທ່ານສາມາດເພີ່ມຄຳສັ່ງ RUN ເພື່ອໂຄລນ (clone) ຂໍ້ມູນນັ້ນລົງໃນຄອນເທນເນີໄດ້. ຖ້າເນື້ອຫາຂອງທ່ານມີຢູ່ໃນໄດເຣັກທໍຣີເຮັດວຽກແລ້ວ, ທ່ານສາມາດໃຊ້ຄຳສັ່ງ COPY ເພື່ອເພີ່ມມັນເຂົ້າໃນຄອນເທນເນີ.

ຄັດລອກໄຟລ໌ຕົວຢ່າງ index.html ເຂົ້າໄປໃນຄອນເທນເນີ:

$ echo 'COPY index.html /var/www/html/index.html' >> Containerfile

ແຖວ EXPOSE ຈະລະບຸວ່າຄອນເທນເນີລໍຖ້າການເຊື່ອມຕໍ່ຜ່ານພອດເຄືອຂ່າຍໃດແດ່. ມັນຖືກນຳໃຊ້ໂດຍຕົວເລືອກ --publish-all ໃນຄຳສັ່ງ podman run.

ລະບຸວ່າພອດໃດແດ່ທີ່ພ້ອມສຳລັບການເຜີຍແຜ່ (publish):

$ echo 'EXPOSE 80' >> Containerfile

ລະບຸຄຳສັ່ງທີ່ຈະໃຫ້ເຮັດວຽກເມື່ອຄອນເທນເນີເລີ່ມຕົ້ນ:

$ echo 'ENTRYPOINT /usr/sbin/httpd -DFOREGROUND' >> Containerfile
ການເຊື່ອມພອດ (Port bindings) ຍັງບໍ່ຮອງຮັບໃນຄອນເທນເນີແບບ rootless. ຖ້າຄອນເທນເນີຂອງທ່ານຈຳເປັນຕ້ອງໃຊ້ງານຜ່ານເຄືອຂ່າຍ, ໃຫ້ສ້າງມັນໃນ root namespace. ການເຊື່ອມພອດສຳລັບ rootless ແມ່ນມີໃຫ້ທົດລອງແລ້ວໃນ podman 1.1.0 ພ້ອມກັບ slirp4netns v0.3.0.

ສ້າງອິເມຈພ້ອມກັບຕັ້ງແທັກ (tag) ທີ່ອະທິບາຍຊັດເຈນ:

$ sudo podman build --tag fedora:myhttpd -f ./Containerfile

ອິເມຈຈະປະກົດຂຶ້ນໃນເລຈິດທຣີ (registry) ພາຍໃນເຄື່ອງ:

$ 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

ເພື່ອເຮັດໃຫ້ພອດຂອງແອັບພລິເຄຊັນສາມາດເຂົ້າເຖິງໄດ້ຈາກເຄື່ອງໂຮສ (host), ໃຫ້ໃຊ້ຕົວເລືອກ --publish ຫຼື -p ຕາມດ້ວຍໝາຍເລກ hostPort:containerPort. ທ່ານສາມາດລະບຸ IP ຫຼື ລະດັບຂອງພອດໄດ້ເຊັ່ນກັນ. ເບິ່ງລາຍລະອຽດເພີ່ມເຕີມໄດ້ທີ່ [man page].

ສັ່ງໃຫ້ຄອນເທນເນີເຮັດວຽກ ແລະ ເຜີຍແຜ່ພອດ:

$ sudo podman run -p 8080:80 --name myhttpd --rm fedora:myhttpd

ເບິ່ງຂໍ້ມູນຂອງພອດ:

$ sudo podman port myhttpd
80/tcp -> 0.0.0.0:8080

ເຂົ້າເຖິງໜ້າເວັບຈາກເຄື່ອງໂຮສ:

$ curl localhost:8080

ເຂົ້າເຖິງໜ້າເວັບຈາກທາງໄກໂດຍການໃຊ້ IP address ຂອງເຄື່ອງໂຮສ ແລະ ໝາຍເລກພອດທີ່ເຜີຍແຜ່ໄວ້.

ເປີດພອດໄຟວໍ (firewall), ບໍລິການ ຫຼື ແຫຼ່ງຂໍ້ມູນຕາມທີ່ຕ້ອງການ. ອິເມຈ Fedora IoT ຈະຕັ້ງຄ່າເລີ່ມຕົ້ນໃຫ້ອະນຸຍາດທຸກແຫຼ່ງຂໍ້ມູນໃນເຄືອຂ່າຍດຽວກັນຜ່ານຕົວເລືອກ 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:

ເພີ່ມພອດດ້ວຍຄຳສັ່ງ:

$ sudo firewall-cmd --add-port 8080/tcp

ສຶກສາຂໍ້ມູນເພີ່ມເຕີມກ່ຽວກັບຄຳສັ່ງ firewall-cmd ໄດ້ທີ່ firewalld.org.

ຕົວຢ່າງ: ການໂຕ້ຕອບກັບອິນເຕີເຟສ GPIO

ເພື່ອໂຕ້ຕອບກັບອິນເຕີເຟສ GPIO, ໃຫ້ເພີ່ມແພັກເກດ libgpiod-utils ເຂົ້າໃນອິເມຈທີ່ມີຢູ່ ຫຼື ໃຊ້ຮ່ວມກັບຄອນເທນເນີ.

ວິທີການເພີ່ມແພັກເກດ:

$ sudo rpm-ostree install libgpiod-utils python3-libgpiod
$ sudo gpiodetect

ການສ້າງຄອນເທນເນີສຳລັບແອັບພລິເຄຊັນທີ່ເຮັດວຽກຮ່ວມກັບອິນເຕີເຟສ GPIO ໃນ root namespace.

ເລີ່ມຕົ້ນ Containerfile ດ້ວຍຄຳສັ່ງ FROM ເພື່ອລະບຸອິເມຈພື້ນຖານ:

$ echo 'FROM fedora:latest' >> Containerfile

ເພີ່ມຄຳສັ່ງ RUN ເພື່ອອັບເດດອິເມຈ ແລະ ເພີ່ມແອັບພລິເຄຊັນ ຫຼື ເຄື່ອງມືຕ່າງໆ:

$ echo 'RUN dnf -y update && dnf -y install git libgpiod-utils python3-libgpiod && dnf clean all' >> Containerfile

ອິເມຈ fedora:latest ມີ bash ມາໃຫ້ນຳແລ້ວ ດັ່ງນັ້ນພວກເຮົາສາມາດສ້າງຄອນເທນເນີໄດ້ໂດຍບໍ່ຕ້ອງລະບຸແອັບພລິເຄຊັນທີ່ຈະເລີ່ມ ຫຼື ພອດທີ່ຈະເປີດ. ພວກເຮົາສາມາດລະບຸຄຳສັ່ງໄດ້ໃນຕອນທີ່ສັ່ງໃຫ້ຄອນເທນເນີເຮັດວຽກ.

ສ້າງອິເມຈພ້ອມກັບຕັ້ງແທັກ (tag) ທີ່ອະທິບາຍຊັດເຈນ:

$ sudo podman build --tag fedora:gpio -f ./Containerfile

ອິເມຈຈະປະກົດຂຶ້ນໃນ localhost registry ສຳລັບ root namespace:

$ 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

ເພື່ອເຂົ້າເຖິງອຸປະກອນ GPIO ຂອງເຄື່ອງໂຮສຈາກຄອນເທນເນີ, ໃຫ້ໃຊ້ຕົວເລືອກ --device ເມື່ອເລີ່ມຄອນເທນເນີ:

$ sudo podman run -it --name demo-gpio --device=/dev/gpiochip0 localhost/fedora:gpio /bin/bash

ກວດສອບວ່າທ່ານສາມາດເຫັນອຸປະກອນ GPIO ຫຼື ບໍ່:

[root@167f31750fdb /]# gpiodetect
gpiochip0 [pinctrl-bcm2835] (54 lines)

ເມື່ອອຸປະກອນສາມາດໃຊ້ງານໄດ້ຈາກຄອນເທນເນີແລ້ວ, ທ່ານສາມາດໃຊ້ເຄື່ອງມືທີ່ຕິດຕັ້ງໄວ້ ຫຼື ເພີ່ມແອັບພລິເຄຊັນອື່ນໆໄດ້.

ຕົວຢ່າງການນຳໃຊ້ gpioset ສາມາດເບິ່ງໄດ້ຈາກບົດຄວາມໃນ Fedora Magazine ປີ 2018: [ວິທີເປີດໄຟ LED ດ້ວຍ Fedora IoT]

ເຮັດໃຫ້ຂັ້ນຕອນເພີ່ມເຕີມເປັນແບບອັດຕະໂນມັດໂດຍການແກ້ໄຂ Containerfile ແລະ ສ້າງຄອນເທນເນີໃໝ່.

ອິເມຈບໍ່ຈຳເປັນຕ້ອງສ້າງຈາກຄອນເທນເນີ Fedora ສະເໝີໄປ. Containerfile ນີ້ໃຊ້ raspbian image ແລະ ໂຄລນໂປຣເຈັກ 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 && \
  cd lightshowpi && git fetch && git checkout stable

ເອກະສານຂອງ Docker ຍັງໄດ້ລວມເອົາ [ແນວທາງການປະຕິບັດທີ່ດີທີ່ສຸດສຳລັບ Containerfile].

ການນຳມາໃຊ້ຄືນ ແລະ ການແບ່ງປັນຄອນເທນເນີ

ເມື່ອສ້າງຄອນເທນເນີອິເມຈແລ້ວ, ມັນສາມາດຖືກນຳໄປຕິດຕັ້ງໃນຫຼາຍອຸປະກອນໄດ້ໂດຍການອັບໂຫຼດມັນຂຶ້ນເລຈິດທຣີ.

ເລຈິດທຣີສ່ວນໃຫຍ່ຕ້ອງການໃຫ້ຕັ້ງຊື່ຕາມຮູບແບບ 'useraccount/description:tag' ແລະ ຄຳສັ່ງ pull ສ່ວນໃຫຍ່ຈະຊອກຫາແທັກ 'latest' ເປັນຄ່າເລີ່ມຕົ້ນ. ອິເມຈໜຶ່ງສາມາດມີໄດ້ຫຼາຍແທັກ ເຊິ່ງແທັກເຫຼົ່ານີ້ຈະຊ່ວຍລະບຸຄວາມເຂົ້າກັນໄດ້ຂອງສະຖາປັດຕະຍະກຳ ແລະ ການຄວບຄຸມເວີຊັນ.

ວິທີການປ່ຽນຊື່ ຫຼື ເພີ່ມແທັກໃຫ້ກັບອິເມຈພາຍໃນເຄື່ອງ:

$ podman tag fedora:myhttpd testuser/fedora-myhttpd:latest
$ podman tag fedora:myhttpd quay.io/testuser/fedora-myhttpd:latest

ທັງສອງຊື່ຈະປະກົດຢູ່ໃນລາຍຊື່ອິເມຈ ແຕ່ລະຫັດອິເມຈ (image ID) ຈະເປັນອັນດຽວກັນ:

$ 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

ຈາກນັ້ນທ່ານສາມາດສົ່ງ (push) ອິເມຈໄປຍັງເລຈິດທຣີໄດ້ດ້ວຍຄຳສັ່ງ podman push imageID destination.

ວິທີການແຍກອິເມຈອອກໄປຍັງໄດເຣັກທໍຣີພາຍໃນເຄື່ອງໃນຮູບແບບ docker:

$ podman push quay.io/testuser/fedora-myhttpd dir:/tmp/fedora-myhttpd

ສຳລັບຕົວເລືອກການສົ່ງອອກອື່ນໆ, ໃຫ້ເບິ່ງທີ່ man page ຂອງ podman-push.