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ừ -tcờ củadocker 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ộtdocker pushhoặcdocker pull.
- Hình thức đầy đủ của một thẻ là [REGISTRYHOST/][USERNAME/]NAME[:TAG]. Đối vớiubuntuở trên, REGISTRYHOST được suy raregistry.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ọimy-applicationtrong sổ đăng ký tạidocker.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 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ẻ.
- 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 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.
- 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:
- 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].