Làm việc với Docker Containers

6 năm trước

 

Giới Thiệu 

Docker là một công cụ container phổ biến được sử dụng để cung cấp các ứng dụng phần mềm với một hệ thống tập tin chứa mọi thứ mà chúng cần để chạy. Việc sử dụng các Docker container đảm bảo rằng phần mềm sẽ hoạt động theo cùng một cách, bất kể nó được triển khai ở đâu, bởi vì môi trường thời gian chạy của nó là vô cùng nhất quán.

Trong hướng dẫn này, chúng tôi sẽ cung cấp tổng quan ngắn gọn về mối quan hệ giữa Docker images và Docker containers. Sau đó, chúng ta sẽ xem xét chi tiết hơn cách chạy, bắt đầu, dừng và xóa containers.

 

Tổng Quát 

Chúng ta có thể nghĩ Docker image như là một mẫu trơ được sử dụng để tạo các Docker containers . Hình ảnh thường bắt đầu với một hệ thống tập tin gốc và thêm các thay đổi hệ thống tập tin và các tham số thực thi tương ứng của chúng trong các lớp chỉ đọc, có thứ tự. Không giống như một bản phân phối Linux điển hình,  Docker image thường chỉ chứa các yếu tố cần thiết  để chạy ứng dụng. Các hình ảnh không có trạng thái và chúng không thay đổi. Thay vào đó, chúng tạo thành điểm bắt đầu cho Docker containers.

Hình ảnh trở nên sống động với lệnh docker run, tạo ra một container bằng cách thêm một lớp ghi- đọc ở trên cùng của hình ảnh. Sự kết hợp của các lớp chỉ đọc này đứng đầu với một lớp đọc-ghi được gọi là union file system. Khi một thay đổi được thực hiện cho một tệp hiện có trong một container đang chạy, tệp được sao chép ra khỏi không gian chỉ đọc vào lớp ghi đọc, nơi các thay đổi được áp dụng. Phiên bản trong lớp đọc- ghi ẩn tệp gốc nhưng không xóa nó. Thay đổi trong lớp đọc-ghi chỉ tồn tại trong một cá thể container. Khi một container bị xóa, mọi thay đổi sẽ bị mất trừ khi thực hiện các bước để giữ chúng.

 

Làm việc cùng với Containers

Mỗi lần chúng ta sử dụng lệnh docker run , nó tạo ra một container mới từ hình ảnh bạn chỉ định. Điều này có thể là một nguồn gây nhầm lẫn, vì vậy chúng ta hãy xem xét một số ví dụ:

 

Bước 1: Tạo ra hai Containers

Lệnh docker run dưới đây  sẽ tạo một container mới bằng cách sử dụng hình ảnh ubuntu cơ sở. -tsẽ cho chúng ta một thiết bị đầu cuối, và  -isẽ cho phép chúng ta tương tác với nó. Chúng ta sẽ dựa vào lệnh mặc định trong tệp Docker của hình ảnh cơ sở Ubuntubash, để đưa chúng ta vào một trình bao.

docker run -ti ubuntu

Lời nhắc dòng lệnh thay đổi để cho biết chúng ta đang ở trong container với tư cách là người dùng root, theo sau là ID vùng chứa 12 ký tự.

root@11cc47339ee1:/#
  •  

Chúng ta sẽ thực hiện thay đổi bằng cách lặp lại một số văn bản vào thư mục /tmp của container, sau đó sử dụng cat để xác minh rằng nó đã được lưu thành công.

root@11cc47339ee1:/# echo "Example1" > /tmp/Example1.txt
root@11cc47339ee1:/# cat /tmp/Example1.txt
  •  
output
Example1
 

Bây giờ ,hãy thoát container.

root@11cc47339ee1:/#exit

Các Docker containers ngừng chạy ngay sau khi lệnh được phát hành hoàn tất, vì vậy container  đã dừng khi chúng ta thoát khỏi bộ trình báo cơ sở. Nếu chúng ta docker ps , lệnh để hiển thị các container đang chạy, chúng ta sẽ không thấy conainer.

docker ps
output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
 

Nếu thêm chỉ báo -a, hiển thị tất cả các container, đã ngừng hoặc chạy, khi đó container của chúng ta sẽ xuất hiện trong danh sách:

docker ps -a
output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11cc47339ee1 ubuntu "/bin/bash" 6 minutes ago Exited (127) 8 seconds ago small_sinoussi
 

Khi container được tạo, nó được cấp container ID và một cái tên được tạo ngẫu nhiên. Trong trường hợp này, 11cc47339ee1 là container ID  và  small_sinoussi là tên được tạo ngẫu nhiên. ps -a chỉ ra những giá trị, cũng như hình ảnh mà từ đó các container được xây dựng (ubuntu),khi container được tạo ra (six minutes ago),và lệnh được chạy trong nó (/bin/bash). Đầu ra cũng cung cấp trạng thái của container(Exited) và khoảng thời gian mà container đã nhập trạng thái đó (6 seconds ago). Nếu container vẫn đang chạy, chúng ta sẽ thấy trạng thái "Up", tiếp theo là khoảng thời gian đã chạy.

Nếu chúng ta chạy lại cùng một lệnh, một container hoàn toàn mới sẽ được tạo:

docker run -ti ubuntu

Chúng ta có thể nói đó là một container mới vì ID trong dấu nhắc lệnh là khác nhau, và khi chúng ta tìm kiếm tệp Example1 của chúng ta, chúng ta sẽ không tìm thấy nó:

root@6e4341887b69:/# cat /tmp/Example1
output
cat: /tmp/Example1: No such file or directory
 

Điều này có thể làm cho nó có vẻ như dữ liệu đã biến mất, nhưng đó không phải là trường hợp. Chúng ta sẽ thoát container thứ hai ngay bây giờ để thấy rằng nó, và container đầu tiên  với các tập tin chúng ta tạo ra, là cả hai trên hệ thống.

root@6e4341887b69:/# exit

Khi chúng ta liệt kê các container một lần nữa, cả hai xuất hiện:

docker ps -a
output
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6e4341887b69 ubuntu "/bin/bash" About a minute ago Exited (1) 6 seconds ago kickass_borg
11cc47339ee1 ubuntu "/bin/bash" 13 minutes ago Exited (127) 6 minutes ago small_sinoussi
 
 

Bước 2: Khởi động lại Container đầu tiên

Để khởi động lại container hiện tại, chúng ta sẽ sử dụng lệnh start với chỉ báo -a để đính kèm vào đó và chỉ báo -i  để làm cho nó tương tác, theo sau là ID hoặc tên container. Hãy chắc chắn thay thế ID của container của bạn trong lệnh dưới đây:

docker start -ai 11cc47339ee1

Chúng ta tìm thấy chính mình tại dấu nhắc bash của container một lần nữa và khi chúng ta cat các tập tin đã tạo ra trước đó, nó vẫn còn đó.

root@11cc47339ee1:/# cat /tmp/Example1.txt
output
Example1
 

Bây giờ ,Chúng ta có thể thoát container :

root@11cc47339ee1:/# exit

Đầu ra này cho thấy các thay đổi được thực hiện bên trong container vẫn tồn tại thông qua việc dừng và bắt đầu nó. Chỉ khi container bị xóa thì nội dung đó sẽ bị xóa. Ví dụ này cũng minh họa rằng các thay đổi được giới hạn trong container riêng lẻ. Khi chúng ta bắt đầu một container thứ hai, nó phản ánh trạng thái ban đầu của hình ảnh.

 

Bước 3: Xóa cả hai Container

Chúng ta đã tạo hai container và chúng ta sẽ kết thúc hướng dẫn ngắn gọn bằng cách xóa chúng. Lệnh docker rm, chỉ hoạt động trên các container đã dừng, cho phép bạn chỉ định tên hoặc ID của một hoặc nhiềucontainer, vì vậy chúng ta có thể xóa cả hai với các mục sau:

docker rm 11cc47339ee1 kickass_borg
output
11cc47339ee1
kickass_borg
 

Cả hai container và bất kỳ thay đổi nào chúng ta đã thực hiện bên trong chúng đều đã biến mất.

Kết Luận 

Chúng ta đã xem chi tiết lệnh docker run để biết cách nó tự động tạo container mới mỗi khi nó chạy. Chúng ta cũng đã xem cách xác định vị trí một container đã dừng, khởi động và kết nối với nó. 

Tìm hiểu thêm những điều thú vị  tại ViCloud Community