Sự khác biệt giữa hình ảnh Docker và container là gì?


924

Khi sử dụng Docker, chúng tôi bắt đầu với một hình ảnh cơ sở. Chúng tôi khởi động nó, tạo ra các thay đổi và những thay đổi đó được lưu trong các lớp tạo thành một hình ảnh khác.

Vì vậy, cuối cùng tôi có một hình ảnh cho ví dụ PostgreSQL của tôi và một hình ảnh cho ứng dụng web của tôi, những thay đổi vẫn tiếp tục được duy trì.

Một container là gì?


Trước khi bạn chuyển sang câu hỏi phức tạp, câu trả lời dưới đây, một câu trả lời của giáo dân cho câu hỏi ban đầu của bạn sẽ là câu hỏi này - sunilk.work/what-is-docker-with-example
Sunil Kumar

Câu trả lời:


1241

Một thể hiện của một hình ảnh được gọi là một thùng chứa. Bạn có một hình ảnh, đó là một tập hợp các lớp như bạn mô tả. Nếu bạn bắt đầu hình ảnh này, bạn có một thùng chứa hình ảnh này đang chạy. Bạn có thể có nhiều container đang chạy của cùng một hình ảnh.

Bạn có thể xem tất cả các hình ảnh của mình docker imagestrong khi bạn có thể thấy các container đang chạy của mình với docker ps(và bạn có thể thấy tất cả các container với docker ps -a).

Vì vậy, một ví dụ đang chạy của một hình ảnh là một container.


107
Vì vậy, sự khác biệt giữa một hình ảnh và một container bị dừng là gì?
Victor Dombrovsky

342
hình ảnh là công thức, hộp đựng là bánh ;-) bạn có thể làm bao nhiêu bánh tùy thích với một công thức nhất định
Julien

142
@VictorDombrovsky Một container dừng lại là một chiếc bánh trong tủ đông.
Jacob Ford

44
@Julien nếu hình ảnh là công thức, còn Dockerfile thì sao? :)
Johnny Willer

71
@JohnnyWiller Tương tự có giới hạn của chúng, nhưng có lẽ chúng ta có thể thấy Dockerfile là danh sách mua sắm của bạn cho các thành phần ;-). Nếu không, hãy gọi Dockerfile công thức, hình ảnh khuôn, hộp đựng vẫn là bánh ngon
Julien

585

Từ bài viết của tôi về Tự động triển khai Docker :

Docker Hình ảnh so với Container

Trong Dockerland, có hình ảnh và có container . Hai là liên quan chặt chẽ, nhưng khác biệt. Đối với tôi, việc nắm bắt sự phân đôi này đã làm rõ Docker vô cùng.

Hình ảnh là gì?

Một hình ảnh là một tập tin trơ, không thay đổi, về cơ bản là một ảnh chụp nhanh của một container. Hình ảnh được tạo bằng lệnh xây dựng và chúng sẽ tạo ra một thùng chứa khi bắt đầu chạy . Hình ảnh được lưu trữ trong sổ đăng ký Docker, chẳng hạn như registry.hub.docker.com . Vì chúng có thể trở nên khá lớn, hình ảnh được thiết kế bao gồm các lớp của hình ảnh khác, cho phép gửi một lượng dữ liệu tối thiểu khi truyền hình ảnh qua mạng.

Hình ảnh địa phương có thể được liệt kê bằng cách chạy docker images:

REPOSITORY                TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu                    13.10               5e019ab7bf6d        2 months ago        180 MB
ubuntu                    14.04               99ec81b80c55        2 months ago        266 MB
ubuntu                    latest              99ec81b80c55        2 months ago        266 MB
ubuntu                    trusty              99ec81b80c55        2 months ago        266 MB
<none>                    <none>              4ab0d9120985        3 months ago        486.5 MB

Một số điều cần lưu ý:

  1. ID IMAGE là 12 ký tự đầu tiên của mã định danh thực sự cho một hình ảnh. Bạn có thể tạo nhiều thẻ của một hình ảnh nhất định, nhưng tất cả ID của chúng sẽ giống nhau (như trên).
  2. VIRTUAL SIZE là ảo vì nó thêm kích thước của tất cả các lớp bên dưới riêng biệt. Điều này có nghĩa là tổng của tất cả các giá trị trong cột đó có thể lớn hơn nhiều so với không gian đĩa được sử dụng bởi tất cả các hình ảnh đó.
  3. Giá trị trong cột REPOSITORY xuất phát từ -tcờ của docker buildlệnh hoặc từ docker tag-ing một hình ảnh hiện có. Bạn có thể tự do gắn thẻ hình ảnh bằng cách sử dụng danh pháp có ý nghĩa với bạn, nhưng biết rằng docker sẽ sử dụng thẻ làm vị trí đăng ký trong một docker pushhoặc docker pull.
  4. Hình thức đầy đủ của một thẻ là [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Đối với ubuntuở trên, REGISTRYHOST được suy ra registry.hub.docker.com. Vì vậy, nếu bạn có kế hoạch lưu trữ hình ảnh của bạn được gọi my-applicationtrong sổ đăng ký tại docker.example.com, bạn nên gắn thẻ hình ảnh đó docker.example.com/my-application.
  5. Cột TAG chỉ là phần [: TAG] của thẻ đầy đủ . Đây là thuật ngữ không may.
  6. Các latestthẻ không phải là huyền diệu, nó chỉ đơn giản là thẻ mặc định khi bạn không chỉ định một thẻ.
  7. Bạn có thể có các hình ảnh chưa được đánh dấu chỉ có thể nhận dạng bằng ID IMAGE của chúng. Những thứ này sẽ nhận được <none>TAG và REPOSITORY. Thật dễ dàng để quên chúng.

Thông tin thêm về hình ảnh có sẵn từ tài liệubảng chú giải của Docker .

Container là gì?

Để sử dụng một phép ẩn dụ lập trình, nếu một hình ảnh là một lớp, thì một thùng chứa là một thể hiện của một lớp đối tượng thời gian chạy. Các container hy vọng tại sao bạn sử dụng Docker; chúng là các gói gọn nhẹ và di động của một môi trường để chạy các ứng dụng.

Xem các container đang chạy cục bộ với docker ps:

CONTAINER ID        IMAGE                               COMMAND                CREATED             STATUS              PORTS                    NAMES
f2ff1af05450        samalba/docker-registry:latest      /bin/sh -c 'exec doc   4 months ago        Up 12 weeks         0.0.0.0:5000->5000/tcp   docker-registry

Ở đây tôi đang chạy phiên bản dockerized của đăng ký docker, để tôi có một nơi riêng tư để lưu trữ hình ảnh của mình. Một lần nữa, một số điều cần lưu ý:

  1. Giống như IMAGE ID, CONTAINER ID là định danh thực sự cho vùng chứa. Nó có cùng hình thức, nhưng nó xác định một loại đối tượng khác.
  2. docker pschỉ đầu ra chạy container. Bạn có thể xem tất cả các container ( đang chạy hoặc dừng ) với docker ps -a.
  3. Nnam có thể được sử dụng để xác định một container bắt đầu thông qua --namecờ.

Làm thế nào để tránh tích tụ hình ảnh và container

Một trong những nỗi thất vọng ban đầu của tôi với Docker là sự tích tụ dường như liên tục của các hình ảnh chưa được xử lý và các container bị dừng . Trong một số trường hợp, sự tích tụ này dẫn đến việc tối đa hóa các ổ đĩa cứng làm chậm máy tính xách tay của tôi hoặc tạm dừng đường ống xây dựng tự động của tôi. Nói về "container ở khắp mọi nơi"!

Chúng tôi có thể xóa tất cả các hình ảnh chưa được đánh dấu bằng cách kết hợp docker rmivới dangling=truetruy vấn gần đây :

docker images -q --filter "dangling=true" | xargs docker rmi

Docker sẽ không thể xóa hình ảnh phía sau các container hiện có, vì vậy trước tiên bạn có thể phải xóa các container bị dừng docker rm:

docker rm `docker ps --no-trunc -aq`

Đây là những điểm đau được biết đến với Docker và có thể được giải quyết trong các phiên bản tương lai. Tuy nhiên, với sự hiểu biết rõ ràng về hình ảnh và thùng chứa, những tình huống này có thể tránh được với một vài thực tiễn:

  1. Luôn luôn loại bỏ một container vô dụng, dừng lại với docker rm [CONTAINER_ID].
  2. Luôn luôn loại bỏ hình ảnh đằng sau một container vô dụng, dừng lại với docker rmi [IMAGE_ID].

5
Tốt phân biệt hình ảnh bte và container. Giúp rất nhiều cho những người mới bắt đầu như tôi.
Gibbs

2
Tôi đoán những gì tôi bị mắc kẹt là cách hình ảnh chạy (tôi sử dụng boot2docker trên Windows). Tại sao chúng ta tạo hình ảnh cho các ứng dụng, nói mysql? Tại thời điểm này, mysql thậm chí còn chạy như thế nào? Tôi không cần phải có hình ảnh Linux để chạy mysql?
Kenny Worden

Trên thực tế điều này không đúng: "docker kéo theo: thẻ mới nhất của hình ảnh sẽ thêm ít nhất hai hình ảnh vào danh sách hình ảnh cục bộ của bạn: một với thẻ mới nhất và một cho mỗi thẻ gốc của hình ảnh mới nhất, ví dụ 14.04 và trysty ở trên. " Nó sẽ chỉ thêm một hình ảnh với thẻ mới nhất. Kéo 14.04 sau đó có thể là không hoạt động nếu ID hình ảnh giống nhau, nhưng nó vẫn yêu cầu một lực kéo riêng.
Adrian Mouat

4
Trong các phiên bản mới hơn của docker, bạn có thể sử dụng docker image pruneđể dọn dẹp hình ảnh lơ lửng. Prune các đối tượng Docker chưa sử dụng
Dario Seidl

3
Tôi chỉ sử dụng docker system pruneđể dọn dẹp MỌI THỨ
Rami Alloush

137

Nói một cách dễ dàng.

Hình ảnh -

Hệ thống tệp và ứng dụng cấu hình (chỉ đọc) được sử dụng để tạo các thùng chứa. Chi tiết hơn .

Container -

Đây là những phiên bản đang chạy của hình ảnh Docker. Container chạy các ứng dụng thực tế. Một container bao gồm một ứng dụng và tất cả các phụ thuộc của nó. Nó chia sẻ kernel với các container khác và chạy như một tiến trình riêng biệt trong không gian người dùng trên HĐH máy chủ. Chi tiết hơn .


Các điều khoản quan trọng khác cần chú ý:


Docker daemon -

Dịch vụ nền chạy trên máy chủ quản lý tòa nhà, chạy và phân phối các container Docker.

Docker khách hàng -

Công cụ dòng lệnh cho phép người dùng tương tác với daemon Docker.

Cửa hàng Docker -

Store, trong số những thứ khác, là một sổ đăng ký hình ảnh Docker. Bạn có thể nghĩ về registry như một thư mục của tất cả các hình ảnh Docker có sẵn.

Một hình ảnh từ bài đăng trên blog này có giá trị một ngàn từ.

Nhập mô tả hình ảnh ở đây

(Để hiểu sâu hơn xin vui lòng đọc này .)

Tóm lược:

  • Kéo hình ảnh từ trung tâm Docker hoặc xây dựng từ Dockerfile => Cung cấp hình ảnh Docker (không thể chỉnh sửa).
  • Chạy hình ảnh ( docker run image_name:tag_name) => Cung cấp một hình ảnh tức là bộ chứa (có thể chỉnh sửa)

1
Cảm ơn. Nguồn của sơ đồ là gì? Có phải từ tài liệu chính thức của Docker?

Các hình ảnh được đăng là tuyệt vời . Một mối quan tâm của tôi: bạn nói "Đã tìm thấy nó trong khi đọc một số bài viết" - Nếu đó không phải là sơ đồ của bạn , thì điều quan trọng về mặt đạo đức [và bắt buộc về mặt pháp lý] để cung cấp tín dụng khi đến hạn ("ghi công"): Tác giả hình ảnh gốc là WHO? Ban đầu tìm thấy ở URL nào?
ToolmakerSteve

@ToolmakerSteve Cảm ơn bạn về mẹo này, tôi sẽ ghi nhớ và sẽ cập nhật câu trả lời ngay khi tôi tìm thấy nguồn.
Imran Ahmad

126

Mặc dù đơn giản nhất khi nghĩ về một container như một hình ảnh đang chạy, nhưng điều này không hoàn toàn chính xác.

Một hình ảnh thực sự là một mẫu có thể được biến thành một thùng chứa. Để biến hình ảnh thành một thùng chứa, công cụ Docker lấy hình ảnh, thêm hệ thống tệp đọc ghi lên trên và khởi chạy các cài đặt khác nhau bao gồm cổng mạng, tên vùng chứa, ID và giới hạn tài nguyên. Một container đang chạy có một quy trình hiện đang thực thi, nhưng một container cũng có thể bị dừng (hoặc thoát theo thuật ngữ của Docker). Một container đã thoát không giống như một hình ảnh, vì nó có thể được khởi động lại và sẽ giữ lại các thiết lập của nó và bất kỳ thay đổi hệ thống tập tin nào.


Làm thế nào để tôi biến một hình ảnh thành một container mà không chạy nó?
Janus Troelsen

12
@JanusTroelsen Sử dụng docker create.
Adrian Mouat

1
Điều này hơi khó hiểu. Chúng tôi nói rằng hình ảnh là bất biến, nhưng khi được chạy như một container, nó lưu trữ bất kỳ thay đổi nào đối với lớp trên cùng có thể thay đổi như bạn đã nói. Nhưng khi dừng lại, những thay đổi này có được lưu dưới dạng lớp mới này trong ảnh không? Nếu có, thì làm sao có thể là hình ảnh ban đầu được cho là bất biến?
Dchucks

4
OK, đã đọc và nhận được câu trả lời trong chủ đề này. "Khi container bị xóa, lớp có thể ghi cũng bị xóa. Hình ảnh bên dưới vẫn không thay đổi."
Dchucks

Trả lời rất hữu ích. Tôi đã bối rối trước đây. Nếu tôi DL một hình ảnh, hãy chạy nó dưới dạng vùng chứa, đặt tệp văn bản ngẫu nhiên vào vùng chứa đó và dừng vùng chứa, tệp văn bản nằm trong vùng chứa bị dừng nhưng KHÔNG phải là hình ảnh cơ sở tôi đã tải xuống.
James Allen

89

Có lẽ giải thích toàn bộ quy trình làm việc có thể giúp đỡ.

Mọi thứ bắt đầu với Dockerfile . Dockerfile là mã nguồn của hình ảnh.

Khi Dockerfile được tạo, bạn xây dựng nó để tạo hình ảnh của container. Hình ảnh chỉ là "phiên bản được biên dịch" của "mã nguồn" là Dockerfile.

Khi bạn có hình ảnh của container, bạn nên phân phối lại bằng cách sử dụng sổ đăng ký . Sổ đăng ký giống như một kho lưu trữ Git - bạn có thể đẩy và kéo hình ảnh.

Tiếp theo, bạn có thể sử dụng hình ảnh để chạy container . Một container đang chạy rất giống nhau, về nhiều mặt, với một máy ảo (nhưng không có bộ ảo hóa ).


44

Quy trình làm việc

Dưới đây là quy trình công việc từ đầu đến cuối hiển thị các lệnh khác nhau và các đầu vào và đầu ra liên quan của chúng. Điều đó sẽ làm rõ mối quan hệ giữa một hình ảnh và một container.

+------------+  docker build   +--------------+  docker run -dt   +-----------+  docker exec -it   +------+
| Dockerfile | --------------> |    Image     | --------------->  | Container | -----------------> | Bash |
+------------+                 +--------------+                   +-----------+                    +------+
                                 ^
                                 | docker pull
                                 |
                               +--------------+
                               |   Registry   |
                               +--------------+

Để liệt kê những hình ảnh bạn có thể chạy, hãy thực hiện:

docker image ls

Để liệt kê các container bạn có thể thực thi các lệnh trên:

docker ps

1
Để có sơ đồ quy trình làm việc toàn diện hơn, hãy xem điều này: stackoverflow.com/a/46528745/714112
Sridhar Sarnobat

1
Nhưng việc cuộn yêu cầu trong nghệ thuật ASCII đó là một vấn đề.
Peter Mortensen

Unicode có thể được sử dụng thay thế để có được các hộp trông đẹp hơn. Một công cụ trực tuyến là Javascript Box Vẽ Demo .
Peter Mortensen

40

Tôi không thể hiểu khái niệm hình ảnhlớp mặc dù đọc tất cả các câu hỏi ở đây và sau đó tình cờ tìm thấy tài liệu tuyệt vời này từ Docker (duh!).

Ví dụ thực sự là chìa khóa để hiểu toàn bộ khái niệm. Đó là một bài viết dài, vì vậy tôi đang tóm tắt những điểm chính cần phải thực sự nắm bắt để có được sự rõ ràng.

  • Hình ảnh : Hình ảnh Docker được xây dựng từ một loạt các lớp chỉ đọc

  • Lớp : Mỗi lớp biểu thị một hướng dẫn trong Dockerfile của hình ảnh.

Example: Dockerfile bên dưới chứa bốn lệnh, mỗi lệnh tạo một lớp.

TỪ Ubuntu: 15.04

SAO CHÉP. / ứng dụng

CHẠY / ứng dụng

Con trăn CMD /app/app.py

Điều quan trọng , mỗi lớp chỉ là một tập hợp khác biệt so với lớp trước nó.

  • Container . Khi bạn tạo một thùng chứa mới, bạn thêm một lớp có thể ghi mới lên trên các lớp bên dưới . Lớp này thường được gọi là lớp container container. Tất cả các thay đổi được thực hiện đối với vùng chứa đang chạy, chẳng hạn như ghi tệp mới, sửa đổi tệp hiện có và xóa tệp, được ghi vào lớp thùng chứa có thể ghi mỏng này .

Do đó, sự khác biệt chính giữa một container và một hình ảnh là lớp có thể ghi trên cùng . Tất cả ghi vào thùng chứa thêm mới hoặc sửa đổi dữ liệu hiện có được lưu trữ trong lớp có thể ghi này. Khi container bị xóa, lớp có thể ghi cũng bị xóa. Hình ảnh bên dưới vẫn không thay đổi.

Hiểu hình ảnh cnd Container từ góc độ kích thước trên đĩa

Để xem kích thước gần đúng của một container đang chạy, bạn có thể sử dụng docker ps -slệnh. Bạn nhận được sizevirtual sizelà hai trong số các đầu ra:

  • Kích thước: lượng dữ liệu (trên đĩa) được sử dụng cho lớp có thể ghi của mỗi vùng chứa

  • Kích thước ảo: lượng dữ liệu được sử dụng cho dữ liệu hình ảnh chỉ đọc được sử dụng bởi vùng chứa. Nhiều container có thể chia sẻ một số hoặc tất cả dữ liệu hình ảnh chỉ đọc. Do đó đây không phải là phụ gia. Tức là bạn không thể thêm tất cả các kích thước ảo để tính toán kích thước trên đĩa được sử dụng bởi hình ảnh

Một khái niệm quan trọng khác là chiến lược sao chép trên ghi

Nếu một tệp hoặc thư mục tồn tại ở lớp thấp hơn trong ảnh và một lớp khác (bao gồm cả lớp có thể ghi) cần truy cập đọc vào nó, thì nó chỉ sử dụng tệp hiện có. Lần đầu tiên một lớp khác cần sửa đổi tệp (khi xây dựng hình ảnh hoặc chạy container), tệp được sao chép vào lớp đó và sửa đổi.

Tôi hy vọng điều đó sẽ giúp người khác như tôi.


1
Cảm ơn vì nhận xét này, nó xác nhận sự khác biệt giữa kích thước và kích thước ảo và rất can thiệp cho nhiều container mà chúng chia sẻ cùng một dữ liệu chỉ đọc và đó là một không gian đĩa os.
dùng1842947

34

Dockerfile → (Bản dựng) → Hình ảnh → (Chạy) → Container .

  • Dockerfile : chứa một tập hợp các hướng dẫn Docker cung cấp cho hệ điều hành của bạn theo cách bạn muốn và cài đặt / cấu hình tất cả phần mềm của bạn.

  • Hình : biên dịch Dockerfile. Tiết kiệm thời gian của bạn từ việc xây dựng lại Dockerfile mỗi khi bạn cần chạy một container. Và đó là một cách để ẩn mã cung cấp của bạn.

  • Container : chính hệ điều hành ảo. Bạn có thể ssh vào nó và chạy bất kỳ lệnh nào bạn muốn, như thể đó là một môi trường thực sự. Bạn có thể chạy hơn 1000 container từ cùng một Hình ảnh.


Tương tự tuyệt vời. Nếu tôi có thể cung cấp cho bạn 1000 ngón tay cái tôi sẽ.
Rich Lysakowski Tiến sĩ

16

Nói một cách đơn giản, nếu một hình ảnh là một lớp , thì một thùng chứa là một thể hiện của một lớp là một đối tượng thời gian chạy .


13

Một container chỉ là một tệp nhị phân có thể thực thi được chạy bởi HĐH máy chủ theo một tập hợp các hạn chế được cài sẵn bằng một ứng dụng (ví dụ: Docker) biết cách nói với HĐH những hạn chế nào sẽ được áp dụng.

Các hạn chế điển hình là liên quan đến cách ly quá trình, liên quan đến bảo mật (như sử dụng bảo vệ SELinux ) và liên quan đến tài nguyên hệ thống (bộ nhớ, đĩa, CPU và mạng).

Cho đến gần đây, chỉ có các hạt nhân trong các hệ thống dựa trên Unix hỗ trợ khả năng chạy các tệp thực thi theo các hạn chế nghiêm ngặt. Đó là lý do tại sao hầu hết các cuộc nói chuyện về container ngày nay liên quan đến chủ yếu là Linux hoặc các bản phân phối Unix khác.

Docker là một trong những ứng dụng biết cách nói với HĐH (chủ yếu là Linux) những hạn chế nào để chạy một tệp thực thi theo. Tệp thực thi được chứa trong hình ảnh Docker, đây chỉ là một tarfile. Bản thực thi đó thường là phiên bản rút gọn của bản phân phối Linux (Ubuntu, CentOS, Debian, v.v.) được cấu hình sẵn để chạy một hoặc nhiều ứng dụng bên trong.

Mặc dù hầu hết mọi người sử dụng một cơ sở Linux làm tệp thực thi, nó có thể là bất kỳ ứng dụng nhị phân nào khác miễn là HĐH máy chủ có thể chạy nó (xem việc tạo một hình ảnh cơ sở đơn giản bằng cách sử dụng đầu ). Cho dù nhị phân trong hình ảnh Docker là một hệ điều hành hay chỉ đơn giản là một ứng dụng, với máy chủ hệ điều hành, nó chỉ là một quá trình khác, một quy trình được bao gồm bởi các ranh giới của hệ điều hành đặt trước.

Các ứng dụng khác, như Docker, có thể cho HĐH máy chủ biết ranh giới nào sẽ áp dụng cho một quy trình trong khi nó đang chạy, bao gồm LXC , libvirtsystemd . Docker đã từng sử dụng các ứng dụng này để tương tác gián tiếp với HĐH Linux, nhưng giờ Docker tương tác trực tiếp với Linux bằng thư viện riêng có tên là " libcontainer ".

Vì vậy, các container chỉ là các tiến trình đang chạy trong một chế độ hạn chế, tương tự như các chroot đã từng làm.

IMO, điều khiến Docker khác biệt so với bất kỳ công nghệ container nào khác là kho lưu trữ của nó (Docker Hub) và các công cụ quản lý của chúng giúp cho việc làm việc với các container cực kỳ dễ dàng.

Xem Docker (phần mềm) .


12

Khái niệm cốt lõi của Docker là giúp dễ dàng tạo ra các "máy" mà trong trường hợp này có thể được coi là container. Các công cụ hỗ trợ container có thể tái sử dụng, cho phép bạn tạo và thả các container dễ dàng.

Hình ảnh mô tả trạng thái của một container tại mọi thời điểm. Vì vậy, quy trình làm việc cơ bản là:

  1. tạo một hình ảnh
  2. bắt đầu một container
  3. thay đổi container
  4. lưu container trở lại như một hình ảnh

8

Như nhiều câu trả lời đã chỉ ra điều này: Bạn xây dựng Dockerfile để có được một hình ảnh và bạn chạy hình ảnh để có được một container .

Tuy nhiên, các bước sau đã giúp tôi cảm nhận rõ hơn về hình ảnh và thùng chứa Docker là gì:

1) Xây dựng Dockerfile:

docker build -t my_image dir_with_dockerfile

2) Lưu hình ảnh vào .tartập tin

docker save -o my_file.tar my_image_id

my_file.tarsẽ lưu trữ hình ảnh. Mở nó với tar -xvf my_file.tar, và bạn sẽ thấy tất cả các lớp. Nếu bạn đi sâu hơn vào từng lớp, bạn có thể thấy những thay đổi đã được thêm vào trong mỗi lớp. (Chúng phải khá gần với các lệnh trong Dockerfile).

3) Để xem bên trong một container, bạn có thể làm:

sudo docker run -it my_image bash

và bạn có thể thấy nó rất giống với một hệ điều hành.


6

Hình ảnh tương đương với định nghĩa lớp trong OOP và các lớp là các phương thức và thuộc tính khác nhau của lớp đó.

Container là sự khởi tạo thực tế của hình ảnh giống như cách một đối tượng là một thể hiện tức thời hoặc một thể hiện của một lớp.


4

Tôi nghĩ tốt hơn là nên giải thích ngay từ đầu.

Giả sử bạn chạy lệnh docker run hello-world. Chuyện gì xảy ra

Nó gọi Docker CLI chịu trách nhiệm nhận các lệnh Docker và biến đổi để gọi các lệnh máy chủ Docker . Ngay khi máy chủ Docker nhận được lệnh để chạy một hình ảnh , nó sẽ kiểm tra thời tiết bộ đệm hình ảnh giữ một hình ảnh với tên như vậy.

Giả sử thế giới xin chào không tồn tại. Máy chủ Docker đi đến Docker Hub (Docker Hub chỉ là một kho hình ảnh miễn phí) và hỏi, Hub này, bạn có một hình ảnh được gọi hello-worldkhông? Hub trả lời - có, tôi làm. Sau đó đưa nó cho tôi. Và quá trình tải xuống bắt đầu. Ngay khi hình ảnh Docker được tải xuống, máy chủ Docker sẽ đặt nó vào bộ đệm hình ảnh .

Vì vậy, trước khi chúng tôi giải thích hình ảnh Docker và bộ chứa Docker là gì, hãy bắt đầu với phần giới thiệu về hệ điều hành trên máy tính của bạn và cách nó chạy phần mềm.

Khi bạn chạy, ví dụ, Chrome trên máy tính của bạn, nó gọi hệ điều hành, hệ điều hành tự gọi kernel và hỏi, hey tôi muốn chạy chương trình này. Nhân quản lý để chạy các tập tin từ đĩa cứng của bạn.

Bây giờ hãy tưởng tượng rằng bạn có hai chương trình, Chrome và Node.js. Chrome yêu cầu Python phiên bản 2 để chạy và Node.js yêu cầu Python phiên bản 3 để chạy. Nếu bạn chỉ cài đặt Python v2 trên máy tính của mình, chỉ Chrome sẽ được chạy.

Để làm cho cả hai trường hợp hoạt động, bằng cách nào đó bạn cần sử dụng một tính năng hệ điều hành được gọi là không gian tên. Không gian tên là một tính năng cung cấp cho bạn cơ hội để cô lập các quy trình, ổ cứng, mạng, người dùng, tên máy chủ, v.v.

Vì vậy, khi chúng ta nói về một hình ảnh, chúng ta thực sự nói về một ảnh chụp nhanh hệ thống tệp. Một hình ảnh là một tập tin vật lý, trong đó có hướng dẫn và siêu dữ liệu để xây dựng một cụ chứa . Bản thân container là một thể hiện của hình ảnh ; nó cách ly ổ cứng bằng cách sử dụng không gian tên chỉ dành cho thùng chứa này . Vì vậy, một container là một quá trình hoặc tập hợp các quy trình nhóm các tài nguyên khác nhau được gán cho nó.


3

Hình ảnh Docker đóng gói ứng dụng và môi trường mà ứng dụng yêu cầu để chạy và một thùng chứa là một phiên bản đang chạy của hình ảnh.

Hình ảnh là phần đóng gói của Docker, tương tự như "mã nguồn" hoặc "chương trình". Các container là phần thực thi của Docker, tương tự như một "quy trình".

Trong câu hỏi, chỉ có phần "chương trình" được nhắc đến và đó là hình ảnh. Phần "chạy" của Docker là container. Khi một container được chạy và các thay đổi được thực hiện, như thể quá trình thực hiện thay đổi trong mã nguồn của chính nó và lưu nó dưới dạng hình ảnh mới.


3

Như trong khía cạnh lập trình,

Hình ảnh là mã nguồn.

Khi mã nguồn được biên dịch và xây dựng, nó được gọi là một ứng dụng.

Tương tự như "khi một thể hiện được tạo cho hình ảnh", nó được gọi là " thùng chứa ".


1
Dockerfile giống như mã nguồn. Hình ảnh giống như tập tin thực thi sau khi mã nguồn được biên dịch / xây dựng. Một container giống như một ứng dụng chạy từ tệp thực thi.
ejlp12

Hình ảnh KHÔNG phải là mã nguồn cho một container. Dockerfile là siêu dữ liệu hoặc đặc tả cho lớp. Hình ảnh là một lớp hoặc khuôn mẫu cho container và container là thể hiện của lớp. Container là một thể hiện chạy. Bạn có thể có 1000 trường hợp của một lớp. Một hình ảnh giống như mã đối tượng được biên dịch có thể được liên kết vào một chương trình khác và chạy như một phần của chương trình đó.
Rich Lysakowski Tiến sĩ

3

Một hình ảnh là một "ảnh chụp nhanh" của một container . Bạn có thể tạo hình ảnh từ một thùng chứa ("ảnh chụp nhanh" mới) và bạn cũng có thể bắt đầu các thùng chứa mới từ một hình ảnh (khởi tạo "ảnh chụp nhanh").

Ví dụ: bạn có thể khởi tạo một vùng chứa mới từ một hình ảnh cơ sở, chạy một số lệnh trong vùng chứa và sau đó chụp ảnh đó như một hình ảnh mới. Sau đó, bạn có thể chạy 100 container từ hình ảnh mới đó.

Những điều khác cần xem xét:

  • Một hình ảnh được tạo thành từ các lớp và các lớp được chụp nhanh "diffs" (vì vậy khi bạn đẩy một hình ảnh, bạn chỉ cần gửi "diff" đến registry).
  • Dockerfile định nghĩa một số lệnh ở trên cùng của hình ảnh cơ sở, tạo ra các lớp mới ("diffs") dẫn đến hình ảnh mới ("ảnh chụp nhanh").
  • Thẻ hình ảnh không chỉ là thẻ. Chúng là "tên đầy đủ" của hình ảnh ("repository: tag"). Nếu cùng một hình ảnh có nhiều tên, nó sẽ hiển thị nhiều lần khi thực hiện docker images.

Câu trả lời này có nó lạc hậu. Một thùng chứa là một thể hiện của một hình ảnh, hoặc một ảnh chụp nhanh thực thi của một hình ảnh. Hình ảnh không được thực thi trực tiếp vì nó là lớp cha của thể hiện. Ví dụ (container) là con của cha mẹ (công thức hoặc mẫu để tạo cá thể.)
Rich Lysakowski Tiến sĩ

Câu trả lời này bắt đầu khi kết thúc quá trình. Một hình ảnh mới CÓ THỂ được tạo ra như một ảnh chụp nhanh của một container, nhưng tất cả các container phải có một hình ảnh cha. Trong trường hợp này ở đây không có vấn đề về gà và trứng, bởi vì hình ảnh nguyên thủy đầu tiên trước tiên phải được xây dựng từ Dockerfile. Đầu tiên là Dockerfile, sau đó là Image, sau đó là Container. Một container có thể được sử dụng làm nền tảng cho một hình ảnh mới, nhưng container đó phải có "hình ảnh gốc".
Rich Lysakowski Tiến sĩ

3

Tôi muốn điền vào phần còn thiếu ở đây giữa docker imagescontainers. Docker sử dụng một hệ thống tệp liên kết ( UFS ) cho các thùng chứa, cho phép nhiều hệ thống tệp được gắn kết trong một hệ thống phân cấp và xuất hiện dưới dạng một hệ thống tệp duy nhất. Hệ thống tập tin từ hình ảnh đã được gắn kết dưới dạng một read-onlylớp và mọi thay đổi đối với vùng chứa đang chạy được thực hiện đối với một read-writelớp được gắn trên đầu trang này. Bởi vì điều này, Docker chỉ phải nhìn vào lớp đọc-ghi trên cùng để tìm những thay đổi được thực hiện cho hệ thống đang chạy.


1

Đối với một sự tương tự lập trình giả, bạn có thể nghĩ Docker có một ImageFactory trừu tượng chứa ImageFactories mà chúng đến từ cửa hàng .

Sau đó, khi bạn muốn tạo một ứng dụng từ ImageFactory đó, bạn sẽ có một thùng chứa mới và bạn có thể sửa đổi nó theo ý muốn. DotNetImageFactory sẽ là bất biến, bởi vì nó hoạt động như một lớp nhà máy trừu tượng, nơi nó chỉ cung cấp các thể hiện mà bạn mong muốn.

IContainer newDotNetApp = ImageFactory.DotNetImageFactory.CreateNew(appOptions);
newDotNetApp.ChangeDescription("I am making changes on this instance");
newDotNetApp.Run();

1

Nói ngắn gọn:

Container là một bộ phận (ảo) trong một kernel có chung một hệ điều hành và chạy một hình ảnh (hình ảnh Docker).

Container là một ứng dụng tự bền vững sẽ có các gói và tất cả các phụ thuộc cần thiết cùng nhau để chạy mã.


1

Một container Docker đang chạy một thể hiện của một hình ảnh. Bạn có thể liên kết một hình ảnh với một chương trình và một thùng chứa với một quá trình :)


1

Một hình ảnh là một lớp như là một thùng chứa cho một đối tượng.

Một thùng chứa là một thể hiện của một hình ảnh như là một đối tượng là một thể hiện của một lớp.


1

Dockerfile giống như tập lệnh Bash của bạn tạo ra tarball (hình ảnh Docker).

Docker container giống như phiên bản trích xuất của tarball. Bạn có thể có bao nhiêu bản sao tùy thích trong các thư mục khác nhau (các thùng chứa).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.