EP1 — How to install Podman on MacOS

Chan
4 min readMay 11, 2021

--

หลายคนเมื่อเริ่มศึกษา Container ก็น่าจะเริ่มจาก Docker ไม่ว่าจะเคยได้ยินหรือเคยลองใช้งานกันมาบ้างแล้ว หรือบ่อยครั้งก็จะมักเรียก Container ติดปากว่า Docker แบบเดียวกับสมัยหนึ่งเราเรียกผงซักฟอกว่า “แฟ้บ”

แต่เราจะเห็นได้ว่าหลายปีผ่านมา หลายๆอย่างถูกผลักดันและปรับเปลี่ยนให้เป็นมาตรฐานกลางมากยิ่งขึ้น เช่น Docker ที่เป็น platform หนึ่งสำหรับจัดการและรัน Container ก็หันมาอ้างอิง OCI spec และใช้ runc เป็น runtime, Kubernetes ก็ deprecated Dockershim/Docker ไปแล้วตั้งแต่ version 1.20 โดยหันมาสนับสนุน runtime ที่รองรับ CRI (Container Runtime Interface) เพื่อให้มีตัวเลือกในการใช้งาน container runtime มากขึ้นและแก้ปัญหาหลายๆเรื่องที่เจอใน Dockershim [link]

วันนี้ผมเลยลองมาศึกษา Podman ชุดเครื่องมืออีกตัวหนึ่งที่สามารถเอามาใช้แทน Docker ได้ โดยหลักๆเจ้า Podman จะต่างกับ Docker ที่ไม่มี daemon มาเป็นตัวกลางคอยรับคำสั่งไปจัดการต่อ แต่ Podman จะจัดการตามคำสั่งต่างๆโดยตรงเลย

Docker (ref: redhat.com)
Podman (ref: redhat.com)

ซึ่งมันก็ช่วยตอบโจทย์ปัญหาหลายๆเรื่องที่เราเจอกับ Docker อีกอย่างถ้าใครคุ้นเคยกับ Docker command อยู่แล้วก็สามารถเอา command เหล่านั้นมาใช้กับ Podman ได้เลย

นอกจากนี้เจ้า Podman ยังมีเพื่อนซี้อีกสองตัวคือ Buildah กับ Skopeo ที่จะเข้ามาช่วยเพิ่มความสามารถที่ละเอียดขึ้นในด้านของการ Build container image และการจัดการ container image กับ container repository/registry แต่วันนี้เอาที่ Podman ก่อนละกัน อิอิ

โดยปกติถ้าเราจะลองเรียนรู้ใช้งานเจ้า Podman ก็ต้องใช้รันบน Linux เหมือนเจ้า Docker นั้นแหล่ะครับ แต่ผมเชื่อว่าเครื่องของหลายๆคนจะเป็น Windows หรือไม่ก็ MacOS กัน(ผมเป็น MacOS) ทำให้เราต้องมีตัว Remote client เป็นสื่อกลางครับ

ดังนั้นวันนี้เราจะมาลองติดตั้ง Podman บน MacOS กันครับ โดยแนวคิดคือเราจะใช้ Vagrant เป็นตัวจัดการ Virtualization ซึ่งในที่นี่ผมจะใช้ Vagrant จัดการ VirtualBox ซึ่ง VirtualBox นี้มีผู้ใหญ่ใจดีเขียน Ansible Playbook ไว้สำหรับติดตั้ง Podman บน VirtulBox ให้แล้ว จากนั้นจะติดตั้ง podman remote client บน Mac เพื่อต่อไปยัง Podman ตัวจริงใน VirtualBox ครับ

  1. Clone Podman-Machine Git

git clone https://github.com/kameshsampath/podman-machine

cd podman-machine

2. ติดตั้ง Podman Remote Client

brew update

brew install podman

podman -v

3. ติดตั้ง VirtualBox

เข้าไป download dmg file สำหรับ OS X hosts จาก https://www.virtualbox.org/wiki/Downloads โดยในตอนที่ผมติดตั้งนั้นผมใช้ version 6.1.18 [link]นะครับ ผมทดสอบกับ 6.1.20 แล้วติดปัญหาเรื่องไม่มี privacy alert แสดงขึ้นมาให้เรากด allows :(

โดยหลังจากติดตั้ง VirtualBox แล้วอย่างลืมไปเข้าไปจัดการ allow privacy ด้วยนะครับ

ไม่งั้นจะมีปัญหาในขั้นตอนติดตั้ง Podman บน VirtualBox เช่น

4. ติดตั้ง Vagrant

ผม download .dmg file จาก https://www.vagrantup.com/downloads มาติดตั้งนะครับ เนื่องจากเครื่องผมใช้คำสั่ง brew ตามที่เค้าแนะนำไม่ผ่าน (ในตอนติดตั้งผมใช้ version 2.2.16 64 bits ครับ

ติดตั้งเสร็จแล้วลองเรียกใช้งานดู

vagrant — version
Vagrant 2.2.16

5. ติดตั้ง Python 3 เนื่องจาก Ansible Galaxy จำเป็นต้องใช้งาน

brew install python

python3 — version

Python 3.9.4

6. ติดตั้ง poetry เพื่อมาจัดการ package ของ python ด้วยเดี๋ยวมีหลาย version มันจะตีกัน

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python -

poetry env use python3

poetry install

7. ติดตั้ง Ansible collections ที่ต้องใช้งาน (requirements.yml จาก git)

ansible-galaxy collection install -r requirements.yml

8. Provision Podman บน VirtualBox โดยใช้ Vagrant

export VAGRANT_EXPERIMENTAL=”1"

export VAGRANT_DEFAULT_PROVIDER=”virtualbox”

vagrant up

ซึ่ง vagrant จะอ่านค่าจาก Vagrantfile ขึ้นมาเพื่อ provision Podman ผ่านการเรียกใช้ ansible “playbook.yml” และกำหนดค่า Host IP เป็น 192.168.33.10

# -*- mode: ruby -*-
# vi: set ft=ruby :

Vagrant.configure(“2”) do |config|
config.vm.box = “fedora/33-cloud-base”
# if you need bigger primary disk
# config.vm.disk :disk, size: “40GB”, primary: true
# for podman to have container storage
config.vm.disk :disk, size: “80GB”, name: “varlib_containers”

config.vm.box_check_update = true
config.vm.network “private_network”, ip: “192.168.33.10

# some common port forwards
# config.vm.network “forwarded_port”, guest: 8080, host: 8080
# config.vm.network “forwarded_port”, guest: 3306, host: 3306
# config.vm.network “forwarded_port”, guest: 5432, host: 5432

config.vm.provider :virtualbox do |vb|
vb.name = “podman-machine”
vb.memory = “4096”
end

config.vm.provision “ansible” do |ansible|
ansible.playbook = “playbook.yml”
# ansible.verbose = true
end

if Vagrant.has_plugin?(“vagrant-vb-gues”)
config.vbguest.auto_update = true
config.vbguest.no_remote = true
end
end

9. ทดสอบการทำงาน

ลอง ssh เข้าไปใน virtualbox ผ่านทาง vagrant จากนั้นดูว่า default registries ของ Podman เป็นที่ไหนบ้าง

vagrant ssh

cat /etc/containers/registries.conf | grep unqualified-search-registries

ลอง podman search เพื่อหา container images ดู

podman search registry.access.redhat.com/rhel

podman search httpd — filter=”is-official” — format=”table {{.Index}} {{.Name}}”

จะเห็น list ของ container images ที่เราค้นก็แสดงว่าทำงานได้

ลอง pull มาแล้วรันเพื่อใช้งานดู เอาแบบง่ายๆช่าย httpd ละกัน

podman run -it -p 8080:80/tcp docker.io/library/httpd

เปิดอีก tab แล้วดูสิว่า process httpd ทำงานอยู่รึป่าวถ้าทำงานก็ลอง curl ดู

podman ps

curl http://192.168.33.10:8080

จะเห็นว่ามี container httpd ทำงานอยู่แล้วเราสามารถ curl เพื่อเรียกใช้งานได้ แต่คำถามคือทำไมต้องเป็น ip 192.168.33.10 ก็เพราะว่ามันคือ Host IP ของ Vagrant/VirtualBox ที่เรากำหนดไว้ใน Vagrantfile ตอนแรกนั้นเองครับ

เดี๋ยวบทความถัดไปเราจะมาลองเล่น Podman กันครับ

สำหรับท่านใดที่อยากจะลองเล่น Podman แต่ไม่อยากจะติดตั้งก็สามารถเข้าไปทดลองที่ Katacoda ตาม link นี้ได้ครับ แต่มันก็จะอยู่ไม่นาน ไม่กี่สิบนาทีก็ปิด session ละครับ

References:

--

--

No responses yet