Tại sao hình ảnh docker chiếm dung lượng ổ đĩa của tôi mà không được docker sử dụng


82

Tôi đã thiết lập docker và tôi đã sử dụng thiết bị khối hoàn toàn khác để lưu trữ dữ liệu hệ thống của docker:

[root@blink1 /]# cat /etc/sysconfig/docker
# /etc/sysconfig/docker

other_args="-H tcp://0.0.0.0:9367 -H unix:///var/run/docker.sock -g /disk1/docker"

Lưu ý rằng /disk/1đang sử dụng một ổ cứng hoàn toàn khác/dev/xvdi

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.6G  67% /
devtmpfs        1.9G  108K  1.9G   1% /dev
tmpfs           1.9G     0  1.9G   0% /dev/shm
/dev/xvdi        20G  5.3G   15G  27% /disk1
/dev/dm-1       9.8G  1.7G  7.6G  18% /disk1/docker/devicemapper/mnt/bb6c540bae25aaf01aedf56ff61ffed8c6ae41aa9bd06122d440c6053e3486bf
/dev/dm-2       9.8G  1.7G  7.7G  18% /disk1/docker/devicemapper/mnt/c85f756c59a5e1d260c3cdb473f3f4d9e55ac568967abe190eeaf9c4087afeac

Vấn đề là khi tôi tiếp tục tải xuống hình ảnh docker và chạy các vùng chứa docker, có vẻ như ổ cứng khác /dev/xvda1cũng đã được sử dụng hết.

Tôi có thể xác minh vấn đề này bằng cách xóa một số hình ảnh docker. Sau khi tôi xóa một số hình ảnh docker, /dev/xvda1bây giờ có thêm một số không gian.

Tui bỏ lỡ điều gì vậy?

Phiên bản docker của tôi:

[root@blink1 /]# docker info
Containers: 2
Images: 42
Storage Driver: devicemapper
 Pool Name: docker-202:1-275421-pool
 Pool Blocksize: 64 Kb
 Data file: /disk1/docker/devicemapper/devicemapper/data
 Metadata file: /disk1/docker/devicemapper/devicemapper/metadata
 Data Space Used: 3054.4 Mb
 Data Space Total: 102400.0 Mb
 Metadata Space Used: 4.7 Mb
 Metadata Space Total: 2048.0 Mb
Execution Driver: native-0.2
Kernel Version: 3.14.20-20.44.amzn1.x86_64
Operating System: Amazon Linux AMI 2014.09

bạn có thể đăngfdisk -l
user2915097

Câu trả lời:


64

Đó là một vấn đề hạt nhân với devicemapper, ảnh hưởng đến dòng hệ điều hành RedHat (RedHat, Fedora, CentOS và Amazon Linux). Vùng chứa đã xóa không giải phóng dung lượng đĩa được ánh xạ. Điều này có nghĩa là trên các hệ điều hành bị ảnh hưởng, bạn sẽ dần hết dung lượng khi khởi động và khởi động lại vùng chứa.

Dự án Docker nhận thức được điều này và hạt nhân được cho là đã được khắc phục trong ngược dòng ( https://github.com/docker/docker/issues/3182 ).

Một cách giải quyết là cung cấp cho Docker ổ đĩa riêng để ghi vào ( "Khi Docker ăn hết dung lượng đĩa của bạn" ). Điều này không thực sự ngăn nó ăn không gian mà chỉ lấy đi các phần khác trong hệ thống của bạn sau khi nó làm vậy.

Giải pháp của tôi là gỡ cài đặt docker, sau đó xóa tất cả các tệp của nó, sau đó cài đặt lại:

sudo yum remove docker
sudo rm -rf /var/lib/docker
sudo yum install docker

Điều này đã lấy lại không gian của tôi, nhưng nó không khác nhiều so với việc chỉ khởi chạy một phiên bản thay thế. Tôi đã không tìm thấy một giải pháp tốt hơn.


20
Tôi vừa trải qua điều tương tự và bạn không cần phải gỡ cài đặt docker. Tất cả những gì tôi cần làm là dừng docker, xóa thư mục, sau đó khởi động docker.
blockcipher

2
Thư mục nào? / var / lib / docker? Nếu tôi làm vậy, tôi đã đánh mất hình ảnh của mình. Nếu tôi cố gắng để lưu hình ảnh vào một file .tar đầu tiên, mà không quá: gắn Lỗi '/ dev / mapper / Docker-202: ... lỗi đầu vào / đầu ra
Toby

5
@Toby yes /var/lib/docker, sẽ xóa tất cả hình ảnh và vùng chứa của bạn. Bạn đang cài đặt lại Docker, vì vậy đừng mong đợi có thể lưu tất cả mọi thứ của bạn.
Nathaniel Waisbrot

61

Việc xóa toàn bộ / var / lib / docker không phù hợp với tôi. Đây là những cách an toàn hơn:

Giải pháp 1:

Các lệnh sau từ sự cố giải phóng dung lượng cho tôi và nó an toàn hơn nhiều so với việc xóa / var / lib / docker hoặc đối với Windows, hãy kiểm tra vị trí hình ảnh đĩa của bạn tại đây .

Trước:

docker info

Ví dụ đầu ra:

Metadata file: 
Data Space Used: 53.38 GB
Data Space Total: 53.39 GB
Data Space Available: 8.389 MB
Metadata Space Used: 6.234 MB
Metadata Space Total: 54.53 MB
Metadata Space Available: 48.29 MB

Lệnh trong các phiên bản mới hơn của Docker, ví dụ 17.x +

docker system prune -a

Nó sẽ hiển thị cho bạn một cảnh báo rằng nó sẽ xóa tất cả các vùng chứa, mạng, hình ảnh và bộ nhớ cache xây dựng đã dừng. Nói chung là an toàn để loại bỏ điều này. (Lần tới khi bạn chạy một vùng chứa, nó có thể kéo từ sổ đăng ký Docker)

Ví dụ đầu ra:

Total reclaimed space: 1.243GB

Sau đó, bạn có thể chạy lại thông tin docker để xem những gì đã được dọn dẹp

docker info

Giải pháp 2:

Cùng với điều này, hãy đảm bảo rằng các chương trình của bạn bên trong bộ chứa docker không ghi nhiều / tệp lớn vào hệ thống tệp.

Kiểm tra kích thước sử dụng không gian của quy trình docker đang chạy của bạn

docker ps -s #may take minutes to return

hoặc cho tất cả các vùng chứa, thậm chí đã thoát

docker ps -as #may take minutes to return

Sau đó, bạn có thể xóa / s vùng chứa vi phạm

docker rm <CONTAINER ID>

Tìm thủ phạm có thể đang sử dụng hợp đồng không gian

docker exec -it <CONTAINER ID> "/bin/sh"
du -h

Trong trường hợp của tôi, chương trình đang viết hợp đồng biểu diễn của các tệp tạm thời.

( Nathaniel Waisbrot đã đề cập trong câu trả lời được chấp nhận về vấn đề này và tôi nhận được một số thông tin từ vấn đề này)


HOẶC LÀ

Các lệnh trong các phiên bản Docker cũ hơn, ví dụ 1.13.x (chạy dưới quyền root không phải sudo):

# Delete 'exited' containers
docker rm -v $(docker ps -a -q -f status=exited)

# Delete 'dangling' images (If there are no images you will get a docker: "rmi" requires a minimum of 1 argument)
docker rmi $(docker images -f "dangling=true" -q)

# Delete 'dangling' volumes (If there are no images you will get a docker: "volume rm" requires a minimum of 1 argument)
docker volume rm $(docker volume ls -qf dangling=true)

Sau :

> docker info
Metadata file: 
Data Space Used: 1.43 GB
Data Space Total: 53.39 GB
Data Space Available: 51.96 GB
Metadata Space Used: 577.5 kB
Metadata Space Total: 54.53 MB
Metadata Space Available: 53.95 MB

2
docker system prune --forcechắc chắn là lựa chọn an toàn nhất mà tôi đã thấy trong số các câu trả lời. Tôi sắp hết dung lượng trên máy tính của mình. Đã làm mận và bây giờ tôi có 50 Gb miễn phí ... mong muốn tôi đã biết điều này sớm hơn
costrouc

4
Số phiếu ủng hộ cho câu trả lời này cho thấy rằng mọi người thấy nó hữu ích. Tuy nhiên, chỉ cần nói rõ rằng, điều này đang trả lời cho câu hỏi hơi khác "Làm cách nào để lấy lại không gian Docker đang sử dụng?" trong khi các câu hỏi về Docker sử dụng tối đa không gian nhưng sau đó nói rằng nó không (do đó prunelà vô ích vì Docker thấy không có gì để prune)
Nathaniel Waisbrot

6

Di chuyển /var/lib/dockerthư mục.

Giả sử /datathư mục có đủ chỗ, nếu không, hãy thay thế bằng một thư mục có,

sudo systemctl stop docker

sudo mv /var/lib/docker /data


sudo ln -s /data/docker /var/lib/docker

sudo systemctl start docker

Bằng cách này, bạn không phải cấu hình lại docker.


6

Có cùng một vấn đề. Trong trường hợp của tôi, vbox của tôi đã hết dung lượng lưu trữ. Sau khi điều tra, phát hiện ra rằng khối lượng cục bộ của docker của tôi đã ăn hết 30gb. Máy chủ Ubuntu 16.04.

Để tìm hiểu của bạn.

docker system df

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              3                   0                   1.361GB             1.361GB (100%)
Containers          0                   0                   0B                  0B
Local Volumes       7                   0                   9.413GB             9.413GB (100%)
Build Cache                                                 0B                  0B



docker system prune --volumes


  WARNING! This will remove:
        - all stopped containers
        - all networks not used by at least one container
        - all volumes not used by at least one container
        - all dangling images
        - all build cache
Are you sure you want to continue? [y/N]

Điều này giải phóng dung lượng ổ đĩa cục bộ không được sử dụng. Theo kịch bản của tôi, giải phóng 20 GB không gian lưu trữ. Đảm bảo rằng các vùng chứa mà bạn muốn giữ lại đang chạy trước khi thực hiện việc này nếu bạn muốn giữ chúng vì thao tác này sẽ xóa tất cả các vùng chứa đã dừng.


Điều này không trực tiếp trả lời câu hỏi ban đầu nhưng hữu ích trong trường hợp tương tự.
BearOakheart

5

Tôi đã gặp sự cố tương tự và tôi nghĩ rằng điều này xảy ra khi bạn không có đủ dung lượng trong đĩa cho tất cả các hình ảnh docker của mình. Tôi đã có 6GB dành riêng cho hình ảnh docker mà hóa ra là không đủ trong trường hợp của tôi. Dù sao, tôi đã xóa mọi hình ảnh và vùng chứa và đĩa vẫn trông đầy. Hầu hết không gian đang được sử dụng bởi / var / lib / docker / devicemapper và / var / lib / docker / tmp.

Lệnh này không hoạt động với tôi:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

Đầu tiên, tôi đã dừng dịch vụ docker:

sudo service docker stop

Sau đó, tôi đã xóa / var / lib / docker:

Sau đó, tôi đã làm những gì ai đó đề xuất ở đây trong https://github.com/docker/docker/issues/18867#issuecomment-232301073

  • Xóa phiên bản hiện có của siêu dữ liệu docker rm -rf / var / lib / docker

    sudo rm -rf / var / lib / docker

  • Chuyển các tùy chọn sau vào trình nền docker: -s devicemapper --storage-opt dm.fs = xfs --storage-opt dm.mountopt = discard

  • Khởi động trình nền docker.

Đối với hai bước cuối cùng, tôi chạy:

sudo dockerd -s devicemapper --storage-opt dm.fs=xfs --storage-opt dm.mountopt=discard

4

Docker tỉa theo mặc định không loại bỏ khối lượng,

bạn có thể thử một cái gì đó như

docker volume prune -f

cắt tỉa hệ thống docker --volumes hoạt động hoàn hảo. Nó từng là --volume, nhưng bây giờ là --volumes.
Zeb Davis

6
docker system prune --all --volumes
David Portabella

3

Như đã đề cập trong vấn đề # 18867 - Xóa dữ liệu trong bộ chứa thiết bị không thể giải phóng dung lượng đã sử dụng khỏi Github.com

Hãy thử chạy lệnh dưới đây:

# docker ps -qa | xargs docker inspect --format='{{ .State.Pid }}' | xargs -IZ fstrim /proc/Z/root/

Nó sử dụng fstrimcông cụ để cắt đĩa được cung cấp mỏng của devicemapper.


Điều này đã làm việc cho tôi. Có thể là do sử dụng devicemapper ở chế độ vòng lặp.
zeroimpl 30/09/18

0

có thể bạn có thể thử docker system prunexóa tất cả những hình ảnh không quan trọng


0

Đối với những người gặp sự cố này trong MacOS, giải pháp phù hợp với tôi là tìm kiếm tệp Docker.raw là tệp Docker sử dụng để dành không gian logic trong máy chủ và sau đó xóa. Nếu bạn có Docker Desktop, bạn có thể đi:

Preferences -> Resources -> Advancedvà sau đó xem dưới Disk image locationtab.

Điều hướng đến thư mục đó trong terminal và chỉ cần xóa Docker.rawtệp ( $ rm -rf Docker.raw)

Lưu ý quan trọng : Chỉ làm điều này là bạn không cần bất kỳ hình ảnh hoặc khối lượng hiện có nào của mình.


-1

Có, Docker sử dụng thư mục / var / lib / docker để lưu trữ các lớp. Có nhiều cách để lấy lại không gian và di chuyển bộ nhớ sang một số thư mục khác.

Bạn có thể mount dung lượng đĩa lớn hơn và di chuyển nội dung của / var / lib / docker đến vị trí mount mới và tạo liên kết sym.

Có giải thích chi tiết về cách thực hiện nhiệm vụ trên.

http://www.scmtechblog.net/2016/06/clean-up-docker-images-from-local-to.html

Bạn cũng có thể loại bỏ các lớp trung gian.

https://github.com/vishalvsh1/docker-image-cleanup

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.