0
0
Lập trình
Hưng Nguyễn Xuân 1
Hưng Nguyễn Xuân 1xuanhungptithcm

Trải Nghiệm Đầu Tiên với Apple Containers trên macOS

Đăng vào 2 ngày trước

• 21 phút đọc

Trải Nghiệm Đầu Tiên với Apple Containers

Giới thiệu

Trong lĩnh vực phát triển phần mềm, khái niệm containerization đã mang lại nhiều thay đổi đáng kể. Trong nhiều năm qua, các nhà phát triển đã phải đối mặt với vấn đề nổi tiếng “chạy trên máy của tôi” — một tình huống khó chịu khi mã hoạt động hoàn hảo trong một môi trường nhưng không thể chạy trong môi trường khác. Containers đã xuất hiện như một giải pháp tối ưu, cung cấp một môi trường nhất quán, cách ly và di động, đóng gói ứng dụng cùng tất cả các phụ thuộc của nó, đảm bảo nó chạy giống nhau ở bất kỳ đâu.

Truyền thống, các nhà phát triển trên macOS thường phải dựa vào các công nghệ ảo hóa để chạy containers, chủ yếu là thông qua các công cụ như Docker Desktop. Mặc dù hiệu quả, lớp ảo hóa này thường gây ra tải trọng hiệu suất và một chút tách biệt với hệ điều hành bản địa. Tuy nhiên, một chương mới đang bắt đầu. Với sự ra mắt của hỗ trợ container gốc trên macOS, Apple đang mang containerization trực tiếp vào lõi của hệ điều hành của mình. Điều này dự kiến sẽ cải thiện đáng kể hiệu suất, tối ưu hóa quy trình làm việc của các nhà phát triển và mở ra một kỷ nguyên mới của phát triển liền mạch và hiệu quả. Sự chuyển mình này có những tác động quan trọng đến cách chúng ta xây dựng, kiểm tra và triển khai ứng dụng trên nền tảng của Apple.

Đáng lưu ý, vì Docker Desktop là phần mềm thương mại, tôi sử dụng Podman / Podman Desktop, công cụ mã nguồn mở mà trong nhiều trường hợp lại tốt hơn Docker Desktop.

Các bước thử nghiệm đầu tiên

Nếu bạn muốn thử nghiệm với Apple “container”, hãy truy cập trang GitHub (liên kết được cung cấp bên dưới) và theo dõi các bước hướng dẫn.

Dưới đây là thông tin từ trang GitHub công khai của Apple:

container là một công cụ mà bạn có thể sử dụng để tạo và chạy các container Linux như các máy ảo nhẹ trên Mac của bạn. Nó được viết bằng Swift và tối ưu hóa cho Apple silicon.
Công cụ này tiêu thụ và sản xuất các hình ảnh container tương thích với OCI, vì vậy bạn có thể kéo và chạy hình ảnh từ bất kỳ kho chứa container tiêu chuẩn nào. Bạn cũng có thể đẩy các hình ảnh mà bạn xây dựng lên các kho chứa đó và chạy các hình ảnh trong bất kỳ ứng dụng nào khác tương thích với OCI.
container sử dụng gói Containerization Swift cho quản lý container, hình ảnh và quy trình ở cấp độ thấp.

Bước đầu tiên là tải xuống gói container và cài đặt nó trên máy Mac của bạn (chỉ dành cho silicon). Các bản phát hành có sẵn từ trang này: https://github.com/apple/container/releases

Sau khi gói được cài đặt, hãy chạy lệnh sau và làm theo các bước:

Copy
> container system start
Xác minh apiserver đang chạy...
Chưa cấu hình kernel mặc định.
Cài đặt kernel mặc định được khuyến nghị từ [https://github.com/kata-containers/kata-containers/releases/download/3.17.0/kata-static-3.17.0-arm64.tar.xz]? [Y/n]: Y
Đang cài đặt kernel...

Tiếp theo, theo tài liệu, bạn cần “Cấu hình bộ nhớ và CPU cho các container của bạn”.

Vì các containers được tạo bởi container là các máy ảo nhẹ, hãy xem xét nhu cầu của ứng dụng container hóa của bạn khi sử dụng container run. Các tùy chọn --memory--cpus cho phép bạn ghi đè các giới hạn bộ nhớ và CPU mặc định cho máy ảo. Các giá trị mặc định là 1 gigabyte RAM và 4 CPU. Bạn có thể sử dụng các ký hiệu cho đơn vị bộ nhớ; ví dụ, để chạy một container cho hình ảnh big với 8 CPU và 32 gigabytes bộ nhớ, sử dụng:

Copy
container builder start --cpus 8 --memory 32g

Sau đó, tôi đã làm theo các bước từ điểm này: “Xây dựng một hình ảnh https://github.com/apple/container/blob/main/docs/tutorial.md#build-an-image”.

Copy
mkdir web-test
cd web-test
Copy
FROM docker.io/python:alpine
WORKDIR /content
RUN apk add curl
RUN echo '<!DOCTYPE html><html><head><title>Hello</title></head><body><h1>Hello, world!</h1></body></html>' > index.html
CMD ["python3", "-m", "http.server", "80", "--bind", "0.0.0.0"]
Copy
container build --tag web-test --file Dockerfile .

Nhưng sau khi thất bại 3 lần (và không thể giải quyết vấn đề);

Copy
> container build --tag web-test --file Dockerfile .
[+] Building 11.9s (5/8)                                                                                                                                                       
 => [resolver] fetching image...docker.io/library/python:alpine                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                                           0.0s
 => oci-layout://docker.io/library/python:alpine@sha256:9ba6d8cbebf0fb6546ae71f2a1c14f6ffd2fdab83af7fa5669734ef30ad48844                                                  0.0s
 => => resolve docker.io/library/python:alpine@sha256:9ba6d8cbebf0fb6546ae71f2a1c14f6ffd2fdab83af7fa5669734ef30ad48844                                                    0.0s
 => CACHED [linux/arm64/v8 1/6] WORKDIR /content                                                                                                                          0.0s
 => ERROR [linux/arm64 2/6] RUN apk update                                                                                                                               10.1s
------                                                                                                                                                                         
 > [linux/arm64 2/6] RUN apk update:                                                                                                                                           
0.056 fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/main/aarch64/APKINDEX.tar.gz                                                                                           
5.071 WARNING: updating and opening https://dl-cdn.alpinelinux.org/alpine/v3.22/main: temporary error (try again later)                                                        
5.071 fetch https://dl-cdn.alpinelinux.org/alpine/v3.22/community/aarch64/APKINDEX.tar.gz
10.09 WARNING: updating and opening https://dl-cdn.alpinelinux.org/alpine/v3.22/community: temporary error (try again later)
10.09 4 unavailable, 0 stale; 29 distinct packages available
------
Error: unknown (2): failed to solve: process "/bin/sh -c apk update" did not complete successfully: exit code: 4

Tôi đã quyết định bỏ qua điều này và thực hiện một thử nghiệm rất cơ bản như sau:

  • Dockerfile mới;
Copy
FROM docker.io/python:alpine
WORKDIR /content
COPY index.html .
EXPOSE 80
CMD ["python3", "-m", "http.server", "80", "--bind", "0.0.0.0"]
  • Một tệp HTML đơn giản;
Copy
<!DOCTYPE html>
<html>
<head>
<title>Hello</title>
</head>
<body>
<h1>Hello, world!</h1>
</body>
</html>
  • Xây dựng & Chạy:
Copy
container build --tag web-test --file Dockerfile .
[+] Building 1.2s (7/7) FINISHED                                                                                                                                               
 => [resolver] fetching image...docker.io/library/python:alpine                                                                                                           0.0s
 => [internal] load .dockerignore                                                                                                                                         0.0s
 => => transferring context: 2B                                                                                                                                           0.0s
 => oci-layout://docker.io/library/python:alpine@sha256:9ba6d8cbebf0fb6546ae71f2a1c14f6ffd2fdab83af7fa5669734ef30ad48844                                                  0.0s
 => => resolve docker.io/library/python:alpine@sha256:9ba6d8cbebf0fb6546ae71f2a1c14f6ffd2fdab83af7fa5669734ef30ad48844                                                    0.0s
 => [internal] load build context                                                                                                                                         0.0s
 => => transferring context: 140B                                                                                                                                         0.0s
 => CACHED [linux/arm64/v8 1/3] WORKDIR /content                                                                                                                          0.0s
 => [linux/arm64/v8 2/3] COPY index.html .                                                                                                                                0.0s
 => exporting to oci image format                                                                                                                                         0.1s
 => => exporting layers                                                                                                                                                   0.0s
 => => exporting manifest sha256:d8250bf6d460293ddd6c726a6c6d2fedf5572cc72016ecfef6b9391c7bbcd850                                                                         0.0s
 => => exporting config sha256:d3f2c260639da2faf5d3f965dc8683105c15142f10b9290977bd5d3e796b43d6                                                                           0.0s
 => => exporting manifest list sha256:7d964d2accb3140ccfb8ba01248c2aedc8a713f0e678a8bd7b82dd343462fc0b                                                                    0.0s
 => => sending tarball                                                                                                                                                    0.1s
Successfully built web-test:latest  
Copy
container run -p 8080:80 --rm web-test
192.168.64.1 - - [08/Sep/2025 07:05:46] "GET / HTTP/1.1" 200 -
192.168.64.1 - - [08/Sep/2025 07:05:46] code 404, message File not found
192.168.64.1 - - [08/Sep/2025 07:05:46] "GET /favicon.ico HTTP/1.1" 404 -
  • Bạn cũng có thể kiểm tra từ dòng lệnh:
Copy
> curl http://localhost:8080
curl: (52) Empty reply from server

> container list
ID                                    IMAGE                                               OS     ARCH   STATE    ADDR
buildkit                              ghcr.io/apple/container-builder-shim/builder:0.6.0  linux  arm64  running  192.168.64.2
98e2f6ae-ae92-4ca9-8ffd-0dd7b61abba3  web-test:latest                                     linux  arm64  running  192.168.64.4

Thành công ⛳

  • Dừng container:
Copy
> container stop web-test
  • Xóa container:
Copy
> container image list
NAME      TAG     DIGEST
python    alpine  9ba6d8cbebf0fb6546ae71f2...
web-test  latest  7d964d2accb3140ccfb8ba01...


> container images delete web-test
web-test:latest
Đã giải phóng 124,7 MB dung lượng đĩa

Kết luận

Chúng ta đã thấy cách mà việc giới thiệu hỗ trợ gốc đã làm cho việc sử dụng containers trên macOS trở nên liền mạch. Đây là một thay đổi thực sự không chỉ về hiệu suất, mà còn mở đường cho các công cụ xây dựng và triển khai container mã nguồn mở. Sự tích hợp này giảm bớt rào cản gia nhập, giúp cho các nhà phát triển dễ dàng tiếp cận với các giải pháp mạnh mẽ do cộng đồng phát triển như Podman, từ đó thúc đẩy một hệ sinh thái container mở và hợp tác hơn. Đây là một bước tiến lớn, và thật thú vị khi nghĩ về những gì tương lai sẽ mang lại.

Thực hành tốt nhất

  • Luôn kiểm tra các phiên bản mới nhất của các công cụ container.
  • Sử dụng các hình ảnh tối ưu hóa cho hiệu suất.

Các cạm bẫy thường gặp

  • Không cấu hình đúng bộ nhớ và CPU cho container.
  • Thất bại trong việc kiểm tra kết nối mạng giữa các container.

Mẹo hiệu suất

  • Sử dụng hình ảnh gọn nhẹ để giảm thời gian tải.
  • Tinh chỉnh các tham số xây dựng để cải thiện tốc độ.

Khắc phục sự cố

  • Kiểm tra kết nối mạng nếu không thể truy cập ứng dụng.
  • Xem log để xác định lỗi trong quá trình xây dựng container.

Liên kết tham khảo

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào