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 ý:
- 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).
- 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 đó.
- Giá trị trong cột REPOSITORY xuất phát từ
-t
cờ của docker build
lệ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 push
hoặc docker pull
.
- 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-application
trong sổ đăng ký tại docker.example.com
, bạn nên gắn thẻ hình ảnh đó docker.example.com/my-application
.
- Cột TAG chỉ là phần [: TAG] của thẻ đầy đủ . Đây là thuật ngữ không may.
- Các
latest
thẻ 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ẻ.
- 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ệu và bả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 ý:
- 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.
docker ps
chỉ đầ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
.
- Nnam có thể được sử dụng để xác định một container bắt đầu thông qua
--name
cờ.
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 rmi
với dangling=true
truy 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:
- Luôn luôn loại bỏ một container vô dụng, dừng lại với
docker rm [CONTAINER_ID]
.
- 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]
.