Buildah là một công cụ chứa mã nguồn mở có khả năng tạo hình ảnh từ đầu, Dockerfiles hoặc Containerfiles. Nó cũng tuân theo các thông số kỹ thuật của Sáng kiến chứa mở (OCI), giúp hình ảnh Buildah vừa linh hoạt vừa mở.
Tìm hiểu cách cài đặt và bắt đầu sử dụng Buildah trong hướng dẫn này. Dưới đây là các bước để tạo container và hiển thị các container đó thành hình ảnh.
Trước khi bạn bắt đầu
- Làm quen với hướng dẫn Bắt đầu với Linode của chúng tôi và hoàn tất các bước để thiết lập tên máy chủ và múi giờ cho Linode của bạn.
- Hướng dẫn này sử dụng
sudo
bất cứ nơi nào có thể. Hoàn thành các phần trong hướng dẫn Cách bảo mật máy chủ của chúng tôi để tạo tài khoản người dùng chuẩn, tăng cường quyền truy cập SSH và xóa các dịch vụ mạng không cần thiết. - Cập nhật hệ thống của bạn.
AlmaLinux , CentOS Stream , Fedora hoặc Rocky Linux :
sudo dnf upgrade
Ubuntu :
sudo apt update && sudo apt upgrade
Ghi chú: Hướng dẫn này được viết cho người dùng không phải root. Các lệnh yêu cầu quyền nâng cao được thêm tiền tố sudo
. Nếu bạn không quen với sudo
lệnh này, hãy xem hướng dẫn Người dùng và Nhóm .
Buildah là gì?
Buildah là một công cụ mã nguồn mở để xây dựng hình ảnh container tuân thủ OCI.
OCI tìm cách tạo ra một tiêu chuẩn mở cho container hóa. Để đạt được mục đích đó, OCI xác định các thông số kỹ thuật cho thời gian chạy container và hình ảnh. Một mục tiêu khác của OCI là giúp bảo mật và hợp lý hóa ảo hóa hệ điều hành.
Buildah cung cấp các công cụ mạnh mẽ để tạo và duy trì hình ảnh tuân thủ OCI. Bạn có thể quen thuộc với Dockerfiles, một trong những định dạng phổ biến nhất cho hình ảnh container. Buildah hỗ trợ đầy đủ các định dạng này và có thể tạo hình ảnh trực tiếp từ chúng.
Nhưng Buildah cũng có thể tạo hình ảnh container từ đầu. Buildah cho phép bạn sử dụng dòng lệnh để xây dựng container từ một bảng trắng hoàn chỉnh, chỉ cung cấp cho nó nội dung bạn cần. Sau đó, Buildah có thể kết xuất và xuất hình ảnh container OCI từ tác phẩm của bạn.
Buildah so với Docker
Nhìn chung, Buildah có chức năng tương tự như Docker. Vậy điều gì làm nó khác biệt? Tại sao nên sử dụng Buildah thay vì Docker?
Một trong những lợi thế chính của Buildah là nó tránh được các rủi ro bảo mật của Docker daemon. Docker daemon chạy trên socket có quyền truy cập cấp root và điều này có khả năng gây ra các rủi ro bảo mật. Buildah tránh được rủi ro này bằng cách chạy mà không cần daemon, cho phép các container thực sự không có root.
Với Buildah, người dùng cũng có khả năng tạo hình ảnh container từ đầu. Buildah có thể gắn một container rỗng và cho phép người dùng chỉ thêm những gì họ cần. Tính năng này có thể cực kỳ hữu ích khi bạn cần một hình ảnh nhẹ.
Buildah cũng cung cấp cho người dùng khả năng kiểm soát chính xác hình ảnh và đặc biệt là các lớp hình ảnh. Đối với những người muốn có nhiều khả năng hơn trong các công cụ chứa của họ, Buildah có xu hướng cung cấp những gì họ cần.
Tuy nhiên, Buildah không hữu ích khi chạy và triển khai container image. Nó có thể chạy chúng, nhưng thiếu một số tính năng có trong các công cụ khác. Thay vào đó, Buildah tập trung phần lớn vào việc tạo container và xây dựng container image.
Vì lý do đó, người dùng thường xây dựng hình ảnh OCI của họ trong Buildah và chạy chúng bằng Podman, một công cụ để chạy và quản lý container. Bạn có thể tìm hiểu thêm về Podman trong hướng dẫn Podman so với Docker: So sánh hai công cụ chứa container của chúng tôi .
Cách cài đặt Buildah
1.Cài đặt Buildah bằng trình quản lý gói của bản phân phối của bạn.
AlmaLinux , CentOS Stream (phiên bản 8 trở lên), Fedora hoặc Rocky Linux :
sudo dnf install buildah
Ubuntu (20.10 trở lên):
sudo apt install buildah
2.Xác minh cài đặt của bạn bằng cách kiểm tra phiên bản Buildah đã cài đặt bằng lệnh bên dưới:
buildah -v
Đầu ra của bạn có thể khác với những gì hiển thị ở đây, nhưng bạn chỉ cần kiểm tra xem Buildah đã được cài đặt thành công chưa:
buildah version 1.26.1 (image-spec 1.0.2-dev, runtime-spec 1.0.2-dev)
Cấu hình Buildah để sử dụng không cần root
Theo mặc định, lệnh Buildah được thực thi với quyền root, được mở đầu bằng sudo
lệnh. Tuy nhiên, một trong những tính năng hấp dẫn nhất của Buildah là khả năng chạy container ở chế độ không cần root. Điều này cho phép người dùng hạn chế làm việc an toàn với Buildah.
Trong khi Docker cũng cho phép bạn chạy lệnh với tư cách là người dùng bị giới hạn, thì daemon Docker vẫn chạy với tư cách là root. Đây là một vấn đề bảo mật tiềm ẩn với Docker, một vấn đề có thể cho phép người dùng bị giới hạn thực thi các lệnh đặc quyền thông qua daemon.
Chế độ không cần root của Buildah giải quyết vấn đề này vì nó chạy container hoàn toàn trong môi trường không cần root, không cần root daemon. Tìm các bước cần thiết để thiết lập phiên bản Buildah của bạn để sử dụng không cần root bên dưới.
1.Cài đặt slirp4netns
các fuse-overlayfs
công cụ để hỗ trợ hoạt động Buildah không cần root của bạn.
AlmaLinux , CentOS Stream , Fedora hoặc Rocky Linux :
sudo dnf install slirp4netns fuse-overlayfs
Ubuntu :
sudo apt install slirp4netns fuse-overlayfs
2.Thêm subuids
và subgids
phạm vi cho người dùng giới hạn của bạn. Ví dụ này thực hiện như vậy đối với người dùng example_user
. Nó cung cấp cho người dùng đó một UID phụ và GID phụ là 100000
, mỗi UID phụ có một phạm vi 65535
ID:
sudo usermod --add-subuids 100000-165535 --add-subgids 100000-165535 example_user
Cách sử dụng Buildah
Buildah chủ yếu được sử dụng để tạo hình ảnh container. Giống như Docker, Buildah có thể xây dựng container từ Dockerfiles, nhưng Buildah nổi bật hơn vì cho phép bạn tạo hình ảnh từ đầu.
Hai phần tiếp theo sẽ hướng dẫn bạn cách xây dựng hình ảnh container bằng từng phương pháp này.
Tạo một hình ảnh từ Dockerfile
Dockerfiles cung cấp một cách tiếp cận dễ dàng để tạo container bằng Buildah, đặc biệt đối với những người dùng đã quen thuộc với Docker hoặc Dockerfiles.
Buildah có đầy đủ khả năng diễn giải tập lệnh Dockerfile, giúp bạn dễ dàng xây dựng hình ảnh container Docker bằng Buildah.
Hướng dẫn này sử dụng một ví dụ Dockerfile được cung cấp trong một trong những hướng dẫn chính thức của Buildah. Dockerfile này tạo ra một container với phiên bản mới nhất của Fedora và máy chủ HTTP Apache ( httpd
). Nó cũng “phơi bày” máy chủ HTTP qua cổng 80
.
1.Tạo một tệp mới có tên Dockerfile
trong thư mục gốc của người dùng:
nano Dockerfile
2.Điền các nội dung sau vào:
# Base on the most recently released Fedora
FROM fedora:latest
MAINTAINER ipbabble email buildahboy@redhat.com # not a real email
# Install updates and httpd
RUN echo "Updating all fedora packages"; dnf -y update; dnf -y clean all
RUN echo "Installing httpd"; dnf -y install httpd && dnf -y clean all
# Expose the default httpd port 80
EXPOSE 80
# Run the httpd
CMD ["/usr/sbin/httpd", "-DFOREGROUND"]
3.Nhấn CTRL+X để thoát, Y để lưu và Enter để thoát nano
.
Giả sử bạn vẫn đang ở trong thư mục chứa Dockerfile này (thư mục gốc của người dùng), bạn có thể ngay lập tức xây dựng hình ảnh của container.
4.Ví dụ này đặt tên cho hình ảnh mới fedora-http-server
:
buildah build -t fedora-http-server
Kết quả đầu ra sẽ trông như sau:
STEP 1/6: FROM fedora:latest
Resolved "fedora" as an alias (/etc/containers/registries.conf.d/000-shortnames.conf)
Trying to pull registry.fedoraproject.org/fedora:latest...
Getting image source signatures
Copying blob 75f075168a24 done
Copying config 3a66698e60 done
Writing manifest to image destination
Storing signatures
STEP 2/6: MAINTAINER ipbabble email buildahboy@redhat.com # not a real email
STEP 3/6: RUN echo "Updating all fedora packages"; dnf -y update; dnf -y clean all
[...]
Bây giờ bạn có thể chạy hình ảnh bằng Podman, một công cụ làm việc với container thường được sử dụng để bổ sung cho Buildah.
5.Đầu tiên, cài đặt Podman:
AlmaLinux , CentOS Stream , Fedora hoặc Rocky Linux :
sudo dnf install podman
Ubuntu :
sudo apt install podman
6.Trong lệnh bên dưới, -p
tùy chọn “xuất bản” một cổng nhất định, ở đây định tuyến cổng của container 80
đến cổng của máy cục bộ 8080
. --rm
Tùy chọn này tự động xóa container khi nó chạy xong, một giải pháp phù hợp cho một bài kiểm tra nhanh như thế này.
podman run -p 8080:80 --rm fedora-http-server
7.Bây giờ bạn có thể mở một phiên Terminal khác trên máy đang chạy hình ảnh và sử dụng lệnh cURL để xác minh trang mặc định đang được phục vụ trên cổng 8080
:
curl localhost:8080
Bạn sẽ thấy HTML thô của trang kiểm tra Máy chủ HTTP Fedora được hiển thị như sau:
<!doctype html>
<html>
<head>
<meta charset='utf-8'>
<meta name='viewport' content='width=device-width, initial-scale=1'>
<title>Test Page for the HTTP Server on Fedora</title>
<style type="text/css">
/*<![CDATA[*/
html {
height: 100%;
width: 100%;
}
body {
[...]
8.Khi hoàn tất, hãy dừng container, nhưng trước tiên, hãy xác định ID hoặc tên container của bạn:
podman ps
Bạn sẽ thấy kết quả như thế này:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
daadb647b880 localhost/fedora-http-server:latest /usr/sbin/httpd -... 8 seconds ago Up 8 seconds ago 0.0.0.0:8080->80/tcp suspicious_goodall
9.Bây giờ hãy dừng container. Thay thế container-name-or-id
bằng tên container hoặc ID của bạn:
podman stop container-name-or-id
Vì chúng ta thiết lập vùng chứa mẫu này tự động xóa khi sử dụng xong --rm
cờ, nên việc dừng nó cũng xóa luôn cờ đó.
10.Bây giờ bạn có thể đăng xuất, đóng phiên Terminal thứ hai và quay lại Terminal ban đầu:
exit
Tìm hiểu thêm về Podman trong hướng dẫn Cách cài đặt Podman để chạy Container của chúng tôi .
Bạn cũng có thể tìm hiểu thêm về cách tạo Dockerfile trong hướng dẫn Cách sử dụng Dockerfile để xây dựng Docker Image của chúng tôi . Hướng dẫn này cũng bao gồm các liên kết đến các hướng dẫn khác có nội dung chi tiết hơn về Dockerfile.
Tạo một hình ảnh từ đầu
Như đã lưu ý ở trên, Buildah nổi bật với khả năng tạo hình ảnh container từ đầu. Phần này hướng dẫn bạn qua một ví dụ về cách bạn có thể thực hiện điều đó.
Ghi chú
Các lệnh của Buildah để làm việc với container có thể bao gồm một vài từ khóa, vì vậy các lệnh này thường được thực thi bằng cách sử dụng các biến môi trường. Ví dụ, để tạo một container mới bằng Fedora, bạn có thể thấy nội dung như sau:
fedoracontainer=$(buildah from fedora)
Tìm hiểu thêm về cách hoạt động của biến môi trường trong hướng dẫn Cách sử dụng và thiết lập biến môi trường của chúng tôi .
Ví dụ về container sau đây bắt đầu bằng một container rỗng. Sau đó, nó thêm Bash và một số tiện ích cốt lõi khác vào container đó để chứng minh cách bạn có thể thêm chương trình để tạo một hình ảnh container tối thiểu.
Ghi chú
Phần này giả định rằng bạn muốn chạy Buildah ở chế độ không cần root, vì đây là điểm thu hút chính của nó so với Docker. Thật không may, trình quản lý gói Ubuntu, APT, lại gặp vấn đề khi cài đặt các gói vào một vùng chứa không phải root. Vì vậy, các hướng dẫn sau đây dành cho các bản phân phối có nguồn gốc từ RHEL như AlmaLinux, CentOS Stream, Fedora và Rocky Linux.
Nếu bạn muốn chạy Buildah trên Ubuntu ở chế độ root thông thường, chỉ cần thêm . vào trước mỗi buildah
lệnh theo sau sudo
.
Đối với hoạt động không có gốc, trước tiên bạn cần thực hiện unshare
lệnh. Lệnh này đưa bạn vào một shell trong không gian tên người dùng. Một số bước tiếp theo giả định rằng bạn đang ở trong shell không gian tên người dùng cho đến khi được ghi chú, nếu không buildah mount
lệnh bên dưới sẽ không thành công.
1.Nhập shell không gian tên người dùng:
buildah unshare
2.Tạo một container trống bằng cách sử dụng scratch
cơ sở của Buildah:
scratchcontainer=$(buildah from scratch)
3.Gắn container dưới dạng hệ thống tệp ảo:
scratchmnt=$(buildah mount $scratchcontainer)
4.Cài đặt Bash và coreutils
vào container trống.
AlmaLinux , CentOS Stream , Fedora hoặc Rocky Linux :
Thay thế giá trị 36
bên dưới bằng phiên bản phân phối bắt nguồn từ RHEL của bạn:
dnf install --installroot $scratchmnt --releasever 36 bash coreutils --setopt install_weak_deps=false
Debian hoặc Ubuntu :
Thay thế giá trị bullseye
bên dưới bằng tên mã của bản phân phối dựa trên Debian của bạn:
sudo apt install debootstrap
sudo debootstrap bullseye $scratchmnt
5.Bây giờ bạn có thể kiểm tra Bash trên container. Lệnh sau đưa bạn vào một shell Bash trong container:
buildah run $scratchcontainer bash
6.Sau đó bạn có thể thoát khỏi shell Bash bằng cách sử dụng:
exit
7.Bây giờ bạn có thể vận hành container một cách an toàn từ bên ngoài shell không gian tên người dùng được khởi tạo bằng unshare
:
exit
Từ đây trở đi, chúng ta thay thế $scratchcontainer
bằng tên của container, có thể là working-container
. Tuy nhiên, nếu bạn có nhiều hơn một container, tên của container có thể khác nhau. Bạn có thể xác minh tên container thông qua buildah containers
lệnh.
8.Bây giờ chúng ta hãy tạo lại tệp tập lệnh thử nghiệm. Từ thư mục home của người dùng, hãy tạo thư script-files
mục và example-script.sh
tệp trong script-files
thư mục:
mkdir script-files
nano script-files/example-script.sh
Cung cấp cho nó những nội dung sau:
#!/bin/bash
echo "This is an example script."
Khi hoàn tất, nhấn CTRL+X để thoát, Y để lưu và Enter để thoát.
9.Lệnh bên dưới sao chép tệp đó vào /usr/bin
thư mục của vùng chứa:
buildah copy working-container ~/script-files/example-script.sh /usr/bin
10.Xác minh việc phân phối tệp bằng cách chạy ls
lệnh trên vùng chứa của /usr/bin
thư mục:
buildah run working-container ls /usr/bin
Tệp tin của bạn example-script.sh
phải nằm trong số các tệp tin được liệt kê:
[...]
example-script.sh
[...]
11.Để biết ví dụ thực tế về cách thực thi các tập lệnh trên vùng chứa Buildah, hãy cấp cho tệp này quyền thực thi:
buildah run working-container chmod +x /usr/bin/example-script.sh
12.Bây giờ bạn có thể chạy tập lệnh thông qua run
lệnh:
buildah run working-container /usr/bin/example-script.sh
Đầu ra của bạn phải giống hệt như sau:
This is an example script.
13.Khi bạn đã hài lòng với vùng chứa, bạn có thể cam kết thay đổi vào một hình ảnh:
buildah commit working-container bash-core-image
Đầu ra của bạn sẽ trông giống như thế này:
Getting image source signatures
Copying blob a0282af9505e done
Copying config 9ea7958840 done
Writing manifest to image destination
Storing signatures
9ea79588405b48ff7b0572438a81a888c2eb25d95e6526b75b1020108ac11c10
14.Bây giờ bạn có thể ngắt kết nối và xóa vùng chứa:
buildah unmount working-container
buildah rm working-container
Quản lý hình ảnh và vùng chứa
Buildah hướng đến việc tạo ra các hình ảnh container, nhưng nó có một số tính năng để xem xét các container và hình ảnh có sẵn. Sau đây là danh sách tóm tắt các lệnh liên quan cho các tính năng này.
Để xem danh sách các hình ảnh được xây dựng bằng phiên bản Buildah của bạn, hãy chạy lệnh sau:
buildah images
Nếu bạn theo dõi các phần trên về cách tạo hình ảnh Buildah, bạn có thể có danh sách hình ảnh như thế này:
REPOSITORY TAG IMAGE ID CREATED SIZE
localhost/fedora-http-server latest c313b363840d 8 minutes ago 314 MB
localhost/bash-core-image latest 9ea79588405b 20 minutes ago 108 MB
registry.fedoraproject.org/fedora latest 3a66698e6040 2 months ago 169 MB
Để liệt kê các container hiện đang chạy dưới Buildah, hãy sử dụng lệnh sau:
buildah containers
Nếu bạn sử dụng lệnh này trong khi container vẫn đang chạy từ phần trên về cách xây dựng hình ảnh từ đầu, bạn có thể nhận được kết quả như sau:
CONTAINER ID BUILDER IMAGE ID IMAGE NAME CONTAINER NAME
68a1cc02025d * scratch working-container
Bạn có thể lấy thông tin chi tiết của một hình ảnh cụ thể bằng lệnh như sau, thay thế 9ea79588405b
bằng ID của hình ảnh. Bạn có thể lấy ID của hình ảnh khi hình ảnh được dựng hoặc từ buildah images
lệnh show ở trên:
buildah inspect 9ea79588405b
Chi tiết hình ảnh thực sự bao gồm tài liệu JSON thể hiện đầy đủ nội dung của hình ảnh. Tất cả hình ảnh chứa chỉ là: tài liệu JSON có hướng dẫn xây dựng các vùng chứa tương ứng.
Sau đây là ví dụ về phần đầu tiên của JSON hình ảnh chứa kết quả từ phần trên về cách tạo hình ảnh từ đầu:
{
"Type": "buildah 0.0.1",
"FromImage": "localhost/bash-core-image:latest",
"FromImageID": "9ea79588405b48ff7b0572438a81a888c2eb25d95e6526b75b1020108ac11c10",
"FromImageDigest": "sha256:beee0e0603e62647addab15341f1a52361a9684934d8d6ecbe1571fabd083dca",
"Config": "{\"created\":\"2022-07-20T17:34:55.16639723Z\",\"architecture\":\"amd64\",\"os\":\"linux\",\"config\":{\"Labels\":{\"io.buildah.version\":\"1.26.1\"}},\"rootfs\":{\"type\":\"layers\",\"diff_ids\":[\"sha256:a0282af9505ed0545c7fb82e1408e1b130cad13a9c3393870c7c4a0d5cf06a62\"]},\"history\":[{\"created\":\"2022-07-20T17:34:55.72288433Z\",\"created_by\":\"/bin/sh\"}]}",
"Manifest": "{\"schemaVersion\":2,\"mediaType\":\"application/vnd.oci.image.manifest.v1+json\",\"config\":{\"mediaType\":\"application/vnd.oci.image.config.v1+json\",\"digest\":\"sha256:9ea79588405b48ff7b0572438a81a888c2eb25d95e6526b75b1020108ac11c10\",\"size\":324},\"layers\":[{\"mediaType\":\"application/vnd.oci.image.layer.v1.tar\",\"digest\":\"sha256:a0282af9505ed0545c7fb82e1408e1b130cad13a9c3393870c7c4a0d5cf06a62\",\"size\":108421632}],\"annotations\":{\"org.opencontainers.image.base.digest\":\"\",\"org.opencontainers.image.base.name\":\"\"}}",
"Container": "",
"ContainerID": "",
"MountPoint": "",
"ProcessLabel": "",
"MountLabel": "",
"ImageAnnotations": {
"org.opencontainers.image.base.digest": "",
"org.opencontainers.image.base.name": ""
},
[...]
Phần kết luận
Buildah cung cấp cho bạn một công cụ đơn giản nhưng mạnh mẽ để tạo hình ảnh container. Nó không chỉ là một giải pháp thay thế cho Docker. Buildah là một công cụ container hóa để tạo container mở và hình ảnh container một cách an toàn. Với hướng dẫn này, bạn có mọi thứ cần thiết để bắt đầu xây dựng hình ảnh của riêng mình và sử dụng Buildah một cách tối đa.
Thông tin thêm
Bạn có thể muốn tham khảo các nguồn sau để biết thêm thông tin về chủ đề này. Mặc dù chúng tôi cung cấp với hy vọng rằng chúng sẽ hữu ích, nhưng xin lưu ý rằng chúng tôi không thể đảm bảo tính chính xác hoặc tính kịp thời của các tài liệu được lưu trữ bên ngoài.
- GitHub – Buildah: Hướng dẫn Buildah
- Red Hat: Xây dựng với Buildah – Dockerfiles, Dòng lệnh hoặc Scripts
- Nhà phát triển Red Hat: Các phương pháp hay nhất để chạy Buildah trong Container
- Máy tính cho dân chuyên nghiệp: Cách xây dựng OCI & Docker Container Images với Buildah
Nguồn: https://www.linode.com/docs/guides/using-buildah-oci-images/