ค้นหาเว็บไซต์

วิธีจัดการคอนเทนเนอร์โดยใช้ Podman และ Skopeo ใน RHEL 8


หนึ่งในความท้าทายที่นักพัฒนาต้องเผชิญในอดีตคือการทำให้แอปพลิเคชันทำงานได้อย่างน่าเชื่อถือในสภาพแวดล้อมการประมวลผลที่หลากหลาย บ่อยครั้ง แอปพลิเคชันไม่ทำงานตามที่คาดไว้หรือพบข้อผิดพลาดและล้มเหลวโดยสิ้นเชิง และนั่นคือที่มาของแนวคิดเรื่องคอนเทนเนอร์

คอนเทนเนอร์อิมเมจคืออะไร?

รูปภาพ คอนเทนเนอร์ คือไฟล์คงที่ที่มาพร้อมกับโค้ดปฏิบัติการที่ทำงานในสภาพแวดล้อมที่แยกจากกัน อิมเมจคอนเทนเนอร์ประกอบด้วยไลบรารีระบบ การขึ้นต่อกัน และการตั้งค่าแพลตฟอร์มอื่นๆ ที่จำเป็นสำหรับแอปพลิเคชันเพื่อทำงานในสภาพแวดล้อมที่หลากหลาย

Red Hat Linux มีชุดเครื่องมือคอนเทนเนอร์ที่มีประโยชน์ซึ่งคุณสามารถใช้ทำงานโดยตรงกับคอนเทนเนอร์ Linux โดยใช้คำสั่งนักเทียบท่า ซึ่งรวมถึง:

  • Podman – นี่คือ daemon น้อยกว่าเอ็นจิ้นคอนเทนเนอร์สำหรับการรันและจัดการคอนเทนเนอร์ OCI ในโหมดรูทหรือโหมดไร้รูท Podman คล้ายกับ Docker และมีตัวเลือกคำสั่งเดียวกัน ยกเว้นว่า Docker นั้นเป็น daemon คุณสามารถดึง เรียกใช้ และจัดการคอนเทนเนอร์อิมเมจโดยใช้ podman ได้ในลักษณะเดียวกับที่คุณใช้ Docker Podman มาพร้อมกับคุณลักษณะขั้นสูงมากมาย ผสานรวมกับ ระบบ ได้อย่างสมบูรณ์ และให้การสนับสนุน Namespace ของผู้ใช้ ซึ่งรวมถึงการเรียกใช้คอนเทนเนอร์โดยไม่จำเป็นต้องใช้ผู้ใช้รูท
  • Skopeo: นี่คือเครื่องมือบรรทัดคำสั่งที่ใช้สำหรับการคัดลอกอิมเมจคอนเทนเนอร์จากรีจิสตรีหนึ่งไปยังอีกรีจิสตรีหนึ่ง คุณสามารถใช้ Skopeo เพื่อคัดลอกรูปภาพไปยังและจากโฮสต์ใดโฮสต์หนึ่ง ตลอดจนคัดลอกรูปภาพไปยังรีจิสตรีคอนเทนเนอร์หรือสภาพแวดล้อมอื่น นอกเหนือจากการคัดลอกรูปภาพแล้ว คุณยังสามารถใช้ตรวจสอบรูปภาพจากรีจิสตรีต่างๆ และใช้ลายเซ็นเพื่อสร้างและตรวจสอบรูปภาพได้
  • Buildah: นี่คือชุดเครื่องมือบรรทัดคำสั่งที่ใช้สำหรับสร้างและจัดการอิมเมจ OCI คอนเทนเนอร์โดยใช้ไฟล์ Docker

ในบทความนี้ เราจะเน้นไปที่การจัดการคอนเทนเนอร์โดยใช้ podman และ Skopeo

การค้นหาอิมเมจคอนเทนเนอร์จากรีจิสตรีระยะไกล

คำสั่ง การค้นหา podman ช่วยให้คุณสามารถค้นหารีจีสทรีระยะไกลที่เลือกสำหรับคอนเทนเนอร์อิมเมจได้ รายการรีจิสทรีเริ่มต้นถูกกำหนดไว้ในไฟล์ registries.conf ที่อยู่ในไดเรกทอรี /etc/containers/

การลงทะเบียนถูกกำหนดโดย 3 ส่วน

  • [registries.search] – ส่วนนี้ระบุรีจิสทรีเริ่มต้นที่ podman สามารถค้นหาอิมเมจคอนเทนเนอร์ได้ โดยจะค้นหารูปภาพที่ร้องขอในรีจิสทรี registry.access.redhat.com, registry.redhat.io และ docker.io

  • [registries.insecure]– ส่วนนี้จะระบุรีจิสทรีที่ไม่ได้ใช้การเข้ารหัส TLS เช่น รีจิสทรีที่ไม่ปลอดภัย โดยค่าเริ่มต้น ไม่มีการระบุรายการใดๆ

  • [registries.block] – เป็นการบล็อกหรือปฏิเสธการเข้าถึงรีจิสทรีที่ระบุจากระบบในเครื่องของคุณ โดยค่าเริ่มต้น ไม่มีการระบุรายการใดๆ

ในฐานะผู้ใช้ทั่วไป (ไม่ใช่รูท) ที่รันคำสั่ง podman คุณสามารถกำหนดไฟล์ registries.conf ของคุณเองในโฮมไดเร็กตอรี่ของคุณได้ ($HOME/.config /containers/registries.conf) เพื่อแทนที่การตั้งค่าทั้งระบบ

กฎเมื่อระบุการลงทะเบียน

เมื่อคุณระบุรีจิสทรี โปรดคำนึงถึงสิ่งต่อไปนี้:

  • ทุกการลงทะเบียนควรอยู่ในเครื่องหมายคำพูดเดี่ยว
  • สามารถระบุการลงทะเบียนได้โดยใช้ชื่อโฮสต์หรือที่อยู่ IP
  • หากมีการระบุรีจิสทรีหลายรายการ ควรคั่นรายการเหล่านั้นด้วยเครื่องหมายจุลภาค
  • หากรีจิสทรีใช้พอร์ตที่ไม่ได้มาตรฐาน – พอร์ต TCP พอร์ต 443 สำหรับความปลอดภัยและ 80 สำหรับพอร์ตที่ไม่ปลอดภัย ควรระบุหมายเลขพอร์ตข้างชื่อรีจิสทรี เช่น registry.example.com:5566

หากต้องการค้นหารีจิสตรีสำหรับอิมเมจคอนเทนเนอร์โดยใช้ไวยากรณ์ ให้ทำดังนี้

podman search registry/container_image

ตัวอย่างเช่น หากต้องการค้นหารูปภาพ Redis ในรีจิสทรี registry.redhat.io ให้เรียกใช้คำสั่ง:

podman search registry.redhat.io/redis

หากต้องการค้นหาอิมเมจคอนเทนเนอร์ MariaDB ให้เรียกใช้

podman search registry.redhat.io/mariadb

หากต้องการคำอธิบายโดยละเอียดของอิมเมจคอนเทนเนอร์ ให้ใช้ตัวเลือก --no-trunc ก่อนชื่อของอิมเมจคอนเทนเนอร์จากผลลัพธ์ที่คุณได้รับ ตัวอย่างเช่น เราจะพยายามรับคำอธิบายโดยละเอียดของอิมเมจคอนเทนเนอร์ MariaDB ดังที่แสดง:

podman search --no-trunc registry.redhat.io/rhel8/mariadb-103

การดึงอิมเมจคอนเทนเนอร์

การดึงหรือเรียกข้อมูลอิมเมจคอนเทนเนอร์จากรีจีสทรีระยะไกลนั้น คุณจะต้องตรวจสอบสิทธิ์ก่อนสิ่งอื่นใด ตัวอย่างเช่น หากต้องการดึงข้อมูลอิมเมจคอนเทนเนอร์ MariaDB ให้เข้าสู่ระบบรีจิสทรี Redhat ก่อน:

podman login

ระบุชื่อผู้ใช้และรหัสผ่านของคุณแล้วกด 'ENTER' บนแป้นพิมพ์ของคุณ หากทุกอย่างเป็นไปด้วยดี คุณควรได้รับข้อความยืนยันว่าการเข้าสู่ระบบรีจิสทรีสำเร็จ

Login Succeeded!

ตอนนี้คุณสามารถดึงภาพโดยใช้ไวยากรณ์ที่แสดง:

podman pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

<registry> หมายถึงโฮสต์ระยะไกลหรือรีจิสทรีที่จัดเตรียมพื้นที่เก็บข้อมูลอิมเมจคอนเทนเนอร์บน TCP <port> <namespace> และ <name> ร่วมกันระบุคอนเทนเนอร์อิมเมจโดยยึดตาม <namespace> ที่รีจิสทรี สุดท้าย ตัวเลือก <tag> จะระบุเวอร์ชันของคอนเทนเนอร์อิมเมจ หากไม่มีการระบุ ระบบจะใช้แท็กเริ่มต้น - ล่าสุด -

ขอแนะนำให้เพิ่มรีจิสทรีที่เชื่อถือได้เสมอ ซึ่งเป็นรายการที่มีการเข้ารหัสและไม่อนุญาตให้ผู้ใช้ที่ไม่ระบุชื่อสร้างบัญชีด้วยชื่อแบบสุ่ม

หากต้องการดึงอิมเมจ MariaDB ให้รันคำสั่ง:

podman pull registry.redhat.io/rhel8/mariadb-103
  • <รหัส><รีจิสทรี> – register.redhat.io
  • <รหัส><เนมสเปซ> – rhel8
  • <รหัส><ชื่อ> – MariaDB
  • <รหัส><แท็ก> – 103

สำหรับการดึงอิมเมจคอนเทนเนอร์ครั้งต่อๆ ไป ไม่จำเป็นต้องเข้าสู่ระบบเพิ่มเติมเนื่องจากคุณได้รับการรับรองความถูกต้องแล้ว หากต้องการดึงอิมเมจคอนเทนเนอร์ Redis เพียงเรียกใช้:

podman pull registry.redhat.io/rhscl/redis-5-rhel7

การแสดงรายการอิมเมจคอนเทนเนอร์

เมื่อคุณดึงรูปภาพเสร็จแล้ว คุณจะสามารถดูรูปภาพที่มีอยู่ในโฮสต์ของคุณในปัจจุบันได้โดยการรันคำสั่ง podman images

podman images

การตรวจสอบอิมเมจคอนเทนเนอร์

ก่อนที่จะใช้งานคอนเทนเนอร์ เป็นความคิดที่ดีเสมอที่จะตรวจสอบอิมเมจและทำความเข้าใจว่าคอนเทนเนอร์ทำหน้าที่อะไร คำสั่ง podman inspect จะพิมพ์ข้อมูลเมตามากมายเกี่ยวกับคอนเทนเนอร์ เช่น ระบบปฏิบัติการและสถาปัตยกรรม

หากต้องการตรวจสอบรูปภาพ ให้รันคำสั่ง podman inspect ตามด้วยรหัสรูปภาพหรือที่เก็บ

podman inspect IMAGE ID
OR
podman inspect REPOSITORY

ในตัวอย่างด้านล่าง เรากำลังตรวจสอบคอนเทนเนอร์ MariaDB

podman inspect registry.redhat.io/rhel8/mariadb-103

หากต้องการดึงข้อมูลเมตาเฉพาะสำหรับคอนเทนเนอร์ ให้ผ่านตัวเลือก --format ตามด้วยข้อมูลเมตาและข้อมูลประจำตัวของคอนเทนเนอร์ ( Image ID หรือ name )

ในตัวอย่างด้านล่าง เรากำลังดึงข้อมูลเกี่ยวกับสถาปัตยกรรมและคำอธิบายของคอนเทนเนอร์ฐาน RHEL 8 ซึ่งอยู่ภายใต้ส่วน "ป้ายกำกับ"

podman inspect --format=’{{.Labels.architecture}}’ image ID
podman inspect --format=’{{.Labels.description}}’ image ID

หากต้องการตรวจสอบอิมเมจระยะไกลจากรีจิสตรีอื่น ให้ใช้คำสั่ง skopeo inspect ในตัวอย่างด้านล่าง เรากำลังตรวจสอบอิมเมจเริ่มต้น RHEL 8 ที่โฮสต์บน นักเทียบท่า

skopeo inspect docker://registry.redhat.io/rhel8-beta/rhel-init

การแท็กรูปภาพคอนเทนเนอร์

ดังที่คุณอาจสังเกตเห็นแล้ว ชื่อรูปภาพมักจะมีลักษณะทั่วไป ตัวอย่างเช่น รูปภาพ Redis มีป้ายกำกับ:

registry.redhat.io/rhscl/redis-5-rhel7

การแท็กรูปภาพทำให้มีชื่อที่เข้าใจง่ายขึ้นเพื่อให้เข้าใจได้ดีขึ้นว่ารูปภาพประกอบด้วยอะไร เมื่อใช้คำสั่ง แท็ก podman คุณสามารถสร้างแท็กรูปภาพซึ่งโดยพื้นฐานแล้วจะเป็นนามแฝงของชื่อรูปภาพที่ประกอบด้วยส่วนต่างๆ

เหล่านี้คือ:

registry/username/NAME:tag

ตัวอย่างเช่น หากต้องการเปลี่ยนชื่อทั่วไปของอิมเมจ Redis ซึ่งมี ID เป็น 646f2730318c เราจะดำเนินการคำสั่ง:

podman tag 646f2730318c myredis

หากต้องการเพิ่มแท็กที่ส่วนท้าย ให้เพิ่มโคลอนเต็มตามด้วยหมายเลขแท็ก:

podman tag 646f2730318c myredis:5.0

โดยไม่ต้องเพิ่มหมายเลขแท็ก ระบบจะกำหนดแอตทริบิวต์ล่าสุดเท่านั้น

การรันอิมเมจคอนเทนเนอร์

หากต้องการเรียกใช้คอนเทนเนอร์ ให้ใช้คำสั่ง podman run ตัวอย่างเช่น:

podman run image_id

หากต้องการรันคอนเทนเนอร์โดยไม่โต้ตอบในพื้นหลังเป็นบริการ daemon ให้ใช้ตัวเลือก -d ตามที่แสดง

podman run -d image_id

ตัวอย่างเช่น หากต้องการเรียกใช้อิมเมจ redis ด้วย ID 646f2730318c เราจะเรียกใช้คำสั่ง:

podman run -d 646f2730318c

หากคุณใช้งานคอนเทนเนอร์ตามระบบปฏิบัติการ เช่น อิมเมจพื้นฐาน RHEL 8 คุณสามารถเข้าถึงเชลล์ได้โดยใช้คำสั่ง -it ตัวเลือก -i จะสร้างเซสชันแบบโต้ตอบในขณะที่ -t จะสร้างเซสชันเทอร์มินัล ตัวเลือก --name ตั้งชื่อคอนเทนเนอร์เป็น mybash ในขณะที่เป็น ecbc6f53bba0 id รูปภาพของอิมเมจพื้นฐาน

podman run -it --name=mybash ecbc6f53bba0

หลังจากนั้น คุณสามารถรันคำสั่งเชลล์ใดก็ได้ ในตัวอย่างด้านล่าง เรากำลังตรวจสอบเวอร์ชันระบบปฏิบัติการของอิมเมจคอนเทนเนอร์

cat /etc/os-release

หากต้องการออกจากคอนเทนเนอร์ เพียงเรียกใช้คำสั่ง exit

exit

เมื่อออกจากคอนเทนเนอร์แล้ว คอนเทนเนอร์จะหยุดโดยอัตโนมัติ หากต้องการเริ่มคอนเทนเนอร์อีกครั้ง ให้ใช้คำสั่ง podman start พร้อมด้วยแฟล็ก -ai ตามที่แสดง

podman start -ai mybash

นี่เป็นการให้คุณเข้าถึงเชลล์ได้อีกครั้ง

การแสดงรายการอิมเมจคอนเทนเนอร์ที่ใช้งานอยู่

หากต้องการแสดงรายการคอนเทนเนอร์ที่กำลังทำงานอยู่ ให้ใช้คำสั่ง podman ps ตามที่แสดง

podman ps

หากต้องการดูคอนเทนเนอร์ทั้งหมดรวมถึงคอนเทนเนอร์ที่ออกหลังจากรันแล้ว ให้ใช้คำสั่ง:

podman ps -a

กำหนดค่าอิมเมจคอนเทนเนอร์ให้เริ่มอัตโนมัติภายใต้บริการ Systemd

ในส่วนนี้ เรามุ่งเน้นไปที่วิธีกำหนดค่าคอนเทนเนอร์ให้ทำงานโดยตรงบนระบบ RHEL ในรูปแบบบริการ systemd

ขั้นแรกให้ได้ภาพที่คุณต้องการ ในกรณีนี้ เราได้ดึงอิมเมจ Redis จาก Docker Hub แล้ว:

podman pull docker.io/redis

หากคุณมี SELinux ทำงานอยู่บนระบบของคุณ คุณจะต้องเปิดใช้งาน container_manage_cgroup บูลีนเพื่อรันคอนเทนเนอร์ด้วย systemd

setsebool -p container_manage_cgroup on

หลังจากนั้น ให้เรียกใช้อิมเมจคอนเทนเนอร์ในพื้นหลัง และกำหนดให้กับชื่อรูปภาพที่คุณต้องการ ในตัวอย่างนี้ เราได้ตั้งชื่ออิมเมจของเราว่า redis_server และแมปพอร์ต 6379 จากคอนเทนเนอร์ไปยังโฮสต์ RHEL 8 ของเรา

podman run -d --name redis_server -p 6379:6379 redis

ต่อไป เราจะสร้างไฟล์การกำหนดค่าหน่วย systemd สำหรับ Redis ในไดเรกทอรี /etc/systemd/system/

vim /etc/systemd/system/redis-container.service

วางเนื้อหาด้านล่างลงในไฟล์

[Unit]
Description=Redis container

[Service]
Restart=always
ExecStart=/usr/bin/podman start -a redis_server
ExecStop=/usr/bin/podman stop -t 2 redis_server

[Install]
WantedBy=local.target

บันทึกและออกจากไฟล์.

จากนั้น กำหนดค่าคอนเทนเนอร์ให้เริ่มทำงานโดยอัตโนมัติเมื่อบูตเครื่อง

systemctl enable redis-container.service

จากนั้น ให้เริ่มคอนเทนเนอร์และตรวจสอบสถานะการทำงาน

systemctl start redis-container.service
systemctl status redis-container.service

กำหนดค่าพื้นที่เก็บข้อมูลถาวรสำหรับอิมเมจคอนเทนเนอร์

เมื่อใช้งานคอนเทนเนอร์ ควรกำหนดค่าที่จัดเก็บข้อมูลภายนอกแบบถาวรบนโฮสต์อย่างรอบคอบ นี่เป็นการสำรองข้อมูลในกรณีที่คอนเทนเนอร์ล่มหรือถูกลบออกโดยไม่ตั้งใจ

เพื่อคงข้อมูลไว้ เราจะแมปไดเร็กทอรีที่อยู่ในโฮสต์กับไดเร็กทอรีภายในคอนเทนเนอร์

podman run --privileged -it -v /var/lib/containers/backup_storage:/mnt registry.redhat.io/ubi8/ubi /bin/bash

ตัวเลือก --privileged จะถูกส่งผ่านเมื่อตั้งค่า SELinux เป็นบังคับใช้ ตัวเลือก -v ระบุไดรฟ์ข้อมูลภายนอกที่อยู่บนโฮสต์ ปริมาณคอนเทนเนอร์ที่นี่คือไดเร็กทอรี /mnt

เมื่อเราเข้าถึงเชลล์แล้ว เราจะสร้างไฟล์ตัวอย่าง testing.txt ในไดเร็กทอรี /mnt ดังที่แสดง

echo "This tests persistent external storage" > /mnt/testing.txt

จากนั้นเราจะออกจากคอนเทนเนอร์และตรวจสอบว่าไฟล์มีอยู่ในที่จัดเก็บข้อมูลภายนอกที่อยู่บนโฮสต์หรือไม่

exit
cat /var/lib/containers/backup_storage/testing.txt

เอาต์พุตการดำเนินการนี้จะทดสอบที่จัดเก็บข้อมูลภายนอกแบบถาวร

การหยุดและการนำภาชนะออก

เมื่อคุณใช้งานคอนเทนเนอร์เสร็จแล้ว คุณสามารถหยุดได้โดยใช้คำสั่ง podman stop ตามด้วย container-id ซึ่งคุณสามารถหาได้จาก podman ps< /แข็งแกร่ง> คำสั่ง

podman stop container-id

หากต้องการลบคอนเทนเนอร์ที่คุณไม่ต้องการอีกต่อไป ขั้นแรกให้แน่ใจว่าคุณหยุดคอนเทนเนอร์แล้วเรียกใช้คำสั่ง podman rm ตามด้วยรหัสคอนเทนเนอร์หรือชื่อเป็นตัวเลือก

podman rm container-id

หากต้องการลบคอนเทนเนอร์หลายรายการในคำสั่งเดียว ให้ระบุคอนเทนเนอร์ ids โดยคั่นด้วยช่องว่าง

podman rm container-id-1 container-id-2 container-id-3

หากต้องการล้างคอนเทนเนอร์ทั้งหมดของคุณ ให้รันคำสั่ง:

podman rm -a

การลบรูปภาพ

หากต้องการลบรูปภาพ ขั้นแรกตรวจสอบให้แน่ใจว่าคอนเทนเนอร์ทั้งหมดที่สร้างจากรูปภาพนั้นหยุดและถูกลบออกตามที่กล่าวไว้ในหัวข้อย่อยก่อนหน้านี้

จากนั้น ดำเนินการต่อและรันคำสั่ง podman -rmi ตามด้วย ID ของรูปภาพดังที่แสดง:

podman -rmi image-id

บทสรุป

นี่เป็นการสรุปบทนี้เกี่ยวกับการจัดการและการทำงานกับคอนเทนเนอร์ใน RHEL 8 เราหวังว่าคู่มือนี้จะให้ความเข้าใจที่ดีเกี่ยวกับคอนเทนเนอร์ รวมถึงวิธีที่คุณสามารถโต้ตอบและจัดการคอนเทนเนอร์เหล่านั้นบนระบบ RHEL โดยใช้ podman และ Skopeo