Tạo hình ảnh Docker từ Scratch

Creating Docker Image From Scratch



Ưu điểm chính của Docker so với bất kỳ công nghệ chứa nào khác là Docker hướng đến các nhà phát triển và các ứng dụng mới nổi của họ. Trong khi các công nghệ chứa đựng thích hợp như LXC , Khu vựcNhà tù được nhắm mục tiêu từ góc độ hoạt động, hay nói một cách đơn giản, các nền tảng này là sự thay thế cho các máy ảo chạy trên đám mây. Docker là một sự thay thế cho các gói và các tệp nhị phân thực thi.

Nói một cách dễ hiểu, Docker ngày càng trở nên giống như một trình quản lý gói đa năng hoạt động trên tất cả các nền tảng Linux có thể có. Cần có các thùng chứa và sử dụng chúng để giải quyết một vấn đề hoàn toàn khác mà các nhà phát triển phải đối mặt. Vấn đề là các nhà phát triển sử dụng hệ điều hành máy tính để bàn của họ (như Windows, macOS hoặc Linux với rất nhiều gói liên quan đến máy tính để bàn) để viết ứng dụng. Ứng dụng họ viết thường chạy trên một hệ điều hành hoàn toàn khác trên một máy chủ ở một nơi nào đó có một số bản phân phối Linux hoàn toàn khác so với máy tính xách tay của nhà phát triển.







Với Docker, ý tưởng là ứng dụng của bạn được đóng gói dưới dạng hình ảnh Docker. Công việc của Docker là lấy hình ảnh này và chạy nó như một ứng dụng chứa sẵn cho bạn. Được chứa trong vùng chứa có nghĩa là ứng dụng và các phần phụ thuộc của nó sẽ chạy trong một môi trường biệt lập có thể khác hoàn toàn với máy tính xách tay của nhà phát triển và thậm chí cả máy chủ sản xuất. Miễn là cả hai đều hỗ trợ Docker, cả hai đều có thể chạy cùng một ứng dụng theo cách chính xác.



Giải phẫu của một hình ảnh Docker

Như đã đề cập trước đó, một ứng dụng Docker sẽ chạy trên một môi trường đã được thỏa thuận. Bây giờ câu hỏi đặt ra là chúng ta tạo ra môi trường đó như thế nào? Hầu hết các hình ảnh ứng dụng sẽ nhập hình ảnh cơ sở Docker và xây dựng ứng dụng của chúng trên đó.



Các ứng dụng được tạo từ các lớp phần mềm. Hình ảnh vùng chứa wordpress được tạo bằng cách sử dụng hình ảnh vùng chứa httpd, đến lượt nó, được xây dựng trên hình ảnh Ubuntu. Hình ảnh mà hình ảnh mới hơn được xây dựng được gọi là HÌNH ẢNH PHỤ HUYNH trong thuật ngữ Docker. Trong Dockerfile (chúng ta sẽ tìm hiểu ý nghĩa của Dockerfile, một chút sau), hình ảnh gốc này được đề cập ở trên cùng của tệp như được hiển thị bên dưới:





TỪ Ubuntu: 18.04
## Phần còn lại của Dockerfile

Dockerfile này khi được thực thi sẽ chuyển đổi ứng dụng của bạn thành một hình ảnh Docker (một dạng nhị phân) mà sau đó bạn có thể đẩy vào sổ đăng ký từ nơi nó có thể được kéo để tạo các vùng chứa mới ở nơi khác. Tuy nhiên, tất cả chúng sẽ có Ubuntu: 18.04 làm hình ảnh cơ sở và chạy như thể đó là một hệ thống Ubuntu mà chúng đang chạy.

Bạn có thể nhận thấy điều này khi cố gắng kéo một hình ảnh docker mới.



Tạo hình ảnh Docker từ Scratch

Điều này cho thấy có bao nhiêu lớp được kéo trước khi ứng dụng thực tế (có thể chỉ có kích thước vài Megabyte) được đưa vào.

Vì lý do này, chúng tôi muốn tạo những gì được gọi là hình ảnh cơ sở. Mà không được xây dựng trên bất kỳ thứ gì khác. Từ khóa xước được sử dụng để chỉ ra rằng lớp này không được xây dựng trên bất kỳ thứ gì khác. Như vậy:

Từ đầu
## Phần còn lại của Dcokerfile

Đầu tiên chúng ta sẽ tạo một ứng dụng hello-world đơn giản và sau đó tìm hiểu phần còn lại của Dockerfile sẽ như thế nào. Hệ thống máy chủ là Ubuntu: 18.04 LTS và chúng tôi đang sử dụng Docker phiên bản 17.12.1-ce cho thử nghiệm.

Tạo một nhị phân tĩnh

Docker container là một tập hợp các quy trình đang chạy biệt lập với phần còn lại của hệ điều hành. Thứ duy nhất mà quá trình liên hệ với là Kernel. Kernel chịu trách nhiệm lập lịch cho các quá trình này trên CPU, thực hiện quản lý bộ nhớ và một số tác vụ lưu giữ đặt chỗ cơ bản khác.

Nhưng hầu hết các ứng dụng cấp cao phụ thuộc vào rất nhiều thư viện hệ thống (như glibc, musl, klibc, v.v. ) và rất nhiều phụ thuộc thời gian chạy như Python hoặc Node.js hoặc Java Runtime. Hệ nhị phân ứng dụng không có sẵn tất cả các thư viện bên trong nó, nhưng khi bắt đầu thực thi, nó sẽ gọi các thư viện đó từ hệ điều hành máy chủ.

Bởi vì chúng tôi đang cố gắng tạo ra một hình ảnh từ đầu, chúng tôi sẽ không nhận được những điều tốt đẹp này. Vì vậy, ứng dụng của chúng ta cần phải là một tệp tĩnh hoặc một tệp thực thi độc lập.

Hãy bắt đầu bằng cách tạo một thư mục có tên MyDockerImage và tạo một tệp hello.cc bên trong nó.

$mkdirMyDockerImage
$đĩa CDMyDockerImage
$chạm vàoxin chào.cc

Mở hello.cc bằng trình soạn thảo văn bản yêu thích của bạn và thêm các dòng sau vào bên trong nó.

#bao gồm
sử dụng không gian tên std;
NSchủ chốt(){
Giá cả<< 'Xin chào! Tin nhắn này đến từ một vùng chứa ';
trở lại 0;

}

Đây là một chương trình C ++ đơn giản in Hello! Tin nhăn nay …

Vì các lý do đã thảo luận trước đó, chúng tôi sẽ biên dịch điều này bằng cách sử dụng cờ tĩnh. Trình biên dịch đang được sử dụng là g ++ (Ubuntu 7.3.0-16ubuntu3) 7.3.0.

Để biên dịch chương trình, trong cùng một thư mục, hãy chạy lệnh sau:

$ g++ -o xin chào-tĩnhxin chào.DC

Điều này tạo ra một tệp thực thi nhị phân xin chào trong cùng một thư mục. Đó là tệp tĩnh của chúng tôi. Kiểm tra xem nó có đang chạy như dự định hay không bằng cách đề cập đến tên tệp trong thiết bị đầu cuối.

$./xin chào

Bây giờ chúng ta đã sẵn sàng để chứa chương trình đơn giản này.

Dockerfile

Dockerfile bao gồm một tập hợp các quy tắc lấy các tệp ứng dụng của bạn (như tệp nhị phân, tệp nguồn, v.v.) cùng với các thông số cấu hình khác nhau như bố cục hệ thống tệp, cổng tiếp xúc, v.v. và biến chúng thành tệp hình ảnh Docker. Sau đó, bạn có thể chia sẻ tệp hình ảnh với bất kỳ ai muốn chạy ứng dụng đó.

Chúng tôi sẽ không đào sâu vào mọi tùy chọn có sẵn cho Dockerfile, thay vào đó chúng tôi sẽ viết một Dockerfile rất tối giản. Trong cùng một thư mục, nơi tập tin thực thi hello của bạn cư trú, hãy tạo một tệp trống có tên Dockerfile.

$chạm vàoDockerfile

Mở nó bằng trình soạn thảo văn bản yêu thích của bạn và viết những dòng sau vào nó:

TỪ đầu
THÊM xin chào/
CMD['/xin chào']

vết trầy không phải là hình ảnh mẹ. Thay vào đó, nó chỉ ra Docker rằng hình ảnh không được xây dựng trên bất kỳ hình ảnh nào khác. Nó được xây dựng từ đầu. Lệnh ADD sẽ lấy tệp nhị phân tĩnh có tên hello từ thư mục hiện tại và thêm nó vào thư mục gốc của tệp hình ảnh. Cuối cùng khi chúng ta chạy một vùng chứa dựa trên hình ảnh này, tệp thực thi hello sẽ được nhìn thấy bên trong chính thư mục gốc tại /hello.

Cuối cùng, dòng CMD có một chuỗi /xin chào chuỗi này sẽ được thực thi dưới dạng lệnh shell bất cứ khi nào một vùng chứa được tạo từ hình ảnh này, do đó, tệp nhị phân mà chúng tôi đã thêm vào vùng chứa của mình và in thông báo mà chúng tôi đã viết trong ứng dụng của mình.

Hãy xây dựng hình ảnh bằng cách gọi xây dựng docker lệnh này sẽ đi qua nội dung của Dockerfile và tạo hình ảnh. Chạy lệnh sau trong cùng thư mục với Dockerfile và tệp nhị phân thực thi.

$xây dựng docker--nhãnxin chào .

Các –Tag xin chào cờ đặt tên hình ảnh thành xin chào và dấu chấm ( . ) ở cuối kể xây dựng docker để xem thư mục hiện tại cho Dockerfile và các nội dung liên quan.

Chạy vùng chứa Docker

Để kiểm tra xem hình ảnh chúng tôi vừa tạo có hiển thị trong danh sách hình ảnh hay không, hãy chạy:

$hình ảnh docker

Chú ý hình ảnh hello nhỏ như thế nào khi so sánh với các hình ảnh khác. Trong mọi trường hợp, nó đã sẵn sàng để chạy như một vùng chứa,

$docker chạy xin chào

Đó là nó! Bạn đã tạo ra vùng chứa tối giản đầu tiên của mình từ đầu.

Sự lựa chọn khác

Mặc dù tạo hình ảnh từ đầu luôn là một lựa chọn, nhưng mọi người thường có xu hướng tạo hình ảnh từ các bản phân phối Linux nhẹ khác. Ví dụ, hình ảnh như alpine và busybox là môi trường thực sự nhẹ với các thư viện nhỏ hơn như musl thay vì glibc.

Sử dụng chúng làm hình ảnh cha mẹ của bạn bằng cách sử dụng TỪ núi cao: mới nhất cũng sẽ dẫn đến hình ảnh nhỏ hơn. Vì hình ảnh cơ sở chỉ có kích thước 2-5 MB. Hãy cho chúng tôi biết nếu có bất kỳ chủ đề nào liên quan đến Docker mà bạn có thể muốn chúng tôi đề cập tiếp theo. Bạn có thể liên hệ với chúng tôi trên Twitter , Facebook hoặc đăng ký với chúng tôi qua email.