tutorial - docker是什麼




如何刪除舊的Docker容器 (20)

這個問題與我應該關心多餘的,不運行的Docker容器有關嗎?

我想知道如何移除舊容器。 docker rm 3e552code34a可以讓你刪除一個,但我已經有很多了。 docker rm --help不會提供選擇選項(如所有或圖像名稱)。

也許有一個這些容器存儲在哪裡我可以輕鬆地手動刪除它們的目錄?


刪除從某個圖像創建的所有容器:

docker rm  $(docker ps -a | awk '/myimage:mytag/{print $1}')

  1. 刪除所有碼頭進程:

    docker rm $(docker ps -a -q)
    
  2. 刪除特定容器:

    $ docker ps -a (lists all old containers)
    
    $ docker rm container-Id
    

Docker 1.13.x中有一個名為Docker container prune的新特性: docker docker container prune這將完成你想要的功能,並且應該以同樣的方式在所有平台上工作。

還有一個碼頭系統修剪docker system prune ,它將一個命令清理容器,圖像,捲和網絡。

原始答案:

有一些關於Docker清理命令的討論。 你可以找到這張票上的信息: https://github.com/dotcloud/docker/issues/928https://github.com/dotcloud/docker/issues/928

在該命令可用之前,您可以將Docker命令與其他Unix命令一起串起來以獲取所需內容。 這裡是一個關於如何清理過去幾週的舊容器的例子:

$ docker ps --filter "status=exited" | grep 'weeks ago' | awk '{print $1}' | xargs --no-run-if-empty docker rm

為了給出功勞,這個例子來自https://twitter.com/jpetazzo/status/347431091415703552


官方的方式是:

docker rm `docker ps -aq`

Docker維護者已經表示將不會有這樣的命令 - 並且你編寫了這樣的命令:

我們之前已經討論過這一點,並且希望用戶使用上面的行,而不必向Docker添加額外的代碼。


刪除所有停止的容器。

sudo docker rm $(sudo docker ps -a -q)

這將通過使用docker ps -a -q獲取所有容器的列表並將其ID傳遞給docker rm來移除所有停止的容器。 這不應該刪除任何正在運行的容器,它會告訴你它不能刪除正在運行的圖像。

刪除所有未標記的圖像

現在你想清理舊圖像來節省一些空間。

sudo docker rmi $(sudo docker images -q --filter“dangling = true”)


新方法: spotify / docker-gc發揮竅門。

 docker run --rm -v /var/run/docker.sock:/var/run/docker.sock -v /etc:/etc spotify/docker-gc
  • 一小時前退出的容器將被移除。
  • 之後不屬於任何剩餘容器的圖像將被刪除

它支持環境設置

強制刪除具有多個標籤的圖像

 FORCE_IMAGE_REMOVAL=1

強制刪除容器

 FORCE_CONTAINER_REMOVAL=1 

從垃圾收集中排除最近退出的容器和圖像

 GRACE_PERIOD_SECONDS=86400

此設置還可以防止刪除已經創建時間少於GRACE_PERIOD_SECONDS秒的圖像。

空轉

 DRY_RUN=1

清理孤立的容器卷 CLEAN_UP_VOLUMES = 1

參考: docker-gc

老辦法:

刪除舊的,未運行的容器

 docker ps -a -q -f status=exited | xargs --no-run-if-empty docker rm
             OR 
 docker rm $(docker ps -a -q)

刪除所有與未運行碼頭集裝箱相關的圖像

 docker images -q | xargs --no-run-if-empty docker rmi

清理碼頭版本1.10.x及更高版本的孤立碼頭卷

 docker volume ls -qf dangling=true | xargs -r docker volume rm

根據時間段

 docker ps -a | grep "weeks ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "days ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm
 docker ps -a | grep "hours ago" | awk "{print $1}" | xargs --no-run-if-empty docker rm

更新:從Docker版本1.13(2017年1月發布)開始,您可以發出以下命令清理已停止的容器,未使用的捲,懸掛的圖像和未使用的網絡:

docker system prune

如果您想確保只刪除具有exited狀態的容器,請使用以下命令:

docker ps -aq -f status=exited | xargs docker rm

同樣,如果你正在清理docker的東西,你可以通過這種方式去除未標記的,未命名的圖像:

docker images -q --no-trunc -f dangling=true | xargs docker rmi

不用哭就移除所有容器:

sudo docker ps -a | grep -v CONTAINER | awk '{print $1}' | xargs --no-run-if-empty sudo docker rm -f

停止/刪除所有容器和圖像的基本步驟

  1. 列出所有容器

    docker ps -aq

  2. 停止所有運行的容器

    docker stop $(docker ps -aq)

  3. 刪除所有容器

    docker rm $(docker ps -aq)

  4. 刪除所有圖像

    docker rmi $(docker images -q)

注意:首先,您必須先停止正在運行的所有容器,然後再將其移除。 在刪除圖像之前,您必須停止並刪除其依賴的容器。


刪除5個最舊的容器:

docker rm `docker ps -aq | tail -n 5`

查看剩下多少個容器:

docker ps -aq | wc -l

另一種方法,我從Guillaume J. Charmes那裡得到(信用證到期):

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

將以優雅的方式移除所有容器。

而Windows的Bartosz Bilicki則表示:

FOR /f "tokens=*" %i IN ('docker ps -a -q') DO docker rm %i

對於PowerShell:

docker rm @(docker ps -aq)

Docker 1.13(2016年第四季度)的更新,歸功於VonC ( 稍後在此主題中 ):

docker system prune將刪除所有未使用的數據(即按順序:容器已停止,沒有容器的捲和沒有容器的圖像)。

請參閱PR 26108提交86de7c0 ,它們引入了一些新命令來幫助可視化Docker守護程序數據在磁盤上佔用多少空間,並允許輕鬆清除“不需要的”過量。

docker system prune

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

因此,我個人建議將它作為您的部署腳本的一部分,以保留僅保留最新的n個容器和圖像的圖像和容器。 我使用與git tag相同的版本模式來標記我的docker圖像,並且始終使用“latest”標記最新的Docker圖像。 這意味著,如果沒有清理任何東西,我的碼頭圖像看起來像:

REPOSITORY                       TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
some_repo/some_image             0.0.5              8f1a7c7ba93c        23 hours ago        925.4 MB
some_repo/some_image             latest             8f1a7c7ba93c        23 hours ago        925.4 MB
some_repo/some_image             0.0.4              0beabfa514ea        45 hours ago        925.4 MB
some_repo/some_image             0.0.3              54302cd10bf2        6 days ago          978.5 MB
some_repo/some_image             0.0.2              0078b30f3d9a        7 days ago          978.5 MB
some_repo/some_image             0.0.1              sdfgdf0f3d9a        8 days ago          938.5 MB

現在,我不想讓所有的圖像(或容器)都在我的所有生產箱上永久保存下來。 我只想要最後3或4回滾,並擺脫一切。 Unix的tail是你最好的朋友。 由於docker imagesdocker ps都是按日期排序的,我們可以使用tail來選擇除前3之外的所有圖像並將其刪除:

docker rmi $(docker images -q | tail -n +4)

將它與您的部署腳本(或本地)一起運行,始終保持足夠的圖像,以便舒適地回滾,而不會佔用太多空間或與舊圖像混淆。

就我個人而言,我只能隨時在我的生產箱中放置一個容器,但如果您需要更多容器,則可以對容器做同樣的事情:

docker rm $(docker ps -aq | tail -n +4)

最後,在我簡化的例子中,我們一次只處理一個回購,但如果你有更多的回購,你可以用同樣的想法稍微複雜一點。 假設我只想保留some_repo / some_image的最後3張圖片。 我可以在grepawk混合使用,並在我的路上:

docker rmi $(docker images -a | grep 'some_repo/some_image' | awk '{print $3}' | tail -n +4)

同樣的想法也適用於容器,但你明白這一點,所以我會停止給出例子。


如果不想刪除所有容器,可以使用docker ps --before <container-ID>docker ps --before <container-ID>選擇在特定容器之前或之後創建的所有容器。 該功能至少在Docker版本0.6.5中。

比方說,你已經開發了你的系統,現在它正在工作,但還剩下了一些容器。 您想刪除在該工作版本之前創建的容器。 使用docker ps確定工作容器的ID。

刪除在其他容器之前創建的容器

docker rm $(docker ps --before 9c49c11c8d21 -q)

另一個例子。 您的數據庫已經在Docker容器上運行。 你已經開發你的應用程序在另一個容器上運行,現在你有一些不需要的容器。

刪除在某個容器後創建的容器

docker rm $(docker ps --since a6ca4661ec7f -q)

Docker將容器存儲在Ubuntu中的/var/lib/docker/containers中。 我認為額外的容器沒有其他傷害,但佔用磁盤空間。


對於任何感興趣的人,我從qkrijger中拿出了這個例子,並將它變成了一個清晰的全部(停止並全部刪除)

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

您只能刪除已停止的容器。 在開始時停止所有這些

docker stop $(docker ps -a -q)

然後你可以刪除

docker rm $(docker ps -a -q)



現在可以使用docker ps進行filtering了:

docker rm $(docker ps -q -f status=exited)

對於images

docker rmi $(docker images -q -f "dangling=true")

但是,如果沒有匹配的容器,其中任何一個都會導致docker rmdocker rmi發出錯誤。 較舊的docker rm $(docker ps -aq)技巧更糟,因為它試圖移除任何正在運行的容器,每個容器都失敗。

這是一個更簡潔的腳本,可以添加到~/.bashrc~/.profile

# Use `docker-cleanup --dry-run` to see what would be deleted.

function docker-cleanup {
  EXITED=$(docker ps -q -f status=exited)
  DANGLING=$(docker images -q -f "dangling=true")

  if [ "$1" == "--dry-run" ]; then
    echo "==> Would stop containers:"
    echo $EXITED
    echo "==> And images:"
    echo $DANGLING
  else
    if [ -n "$EXITED" ]; then
      docker rm $EXITED
    else
      echo "No containers to remove."
    fi
    if [ -n "$DANGLING" ]; then
      docker rmi $DANGLING
    else
      echo "No images to remove."
    fi
  fi
}

編輯:如下所述,原始答案是用於刪除圖像,而不是容器。 更新後回答兩個問題,包括新的文檔鏈接。 感謝Adrian(和Ryan的回答)提到了新的ps過濾。


這是我的碼頭清理腳本,它刪除未標記的容器和圖像。 請檢查來源是否有任何更新。

#!/bin/sh
# Cleanup docker files: untagged containers and images.
#
# Use `docker-cleanup -n` for a dry run to see what would be deleted.

untagged_containers() {
  # Print containers using untagged images: $1 is used with awk's print: 0=line, 1=column 1.
  docker ps -a | awk '$2 ~ "[0-9a-f]{12}" {print $'$1'}'
}

untagged_images() {
  # Print untagged images: $1 is used with awk's print: 0=line, 3=column 3.
  # NOTE: intermediate images (via -a) seem to only cause
  # "Error: Conflict, foobarid wasn't deleted" messages.
  # Might be useful sometimes when Docker messed things up?!
  # docker images -a | awk '$1 == "<none>" {print $'$1'}'
  docker images | tail -n +2 | awk '$1 == "<none>" {print $'$1'}'
}

# Dry-run.
if [ "$1" = "-n" ]; then
  echo "=== Containers with uncommitted images: ==="
  untagged_containers 0
  echo

  echo "=== Uncommitted images: ==="
  untagged_images 0

  exit
fi

# Remove containers with untagged images.
echo "Removing containers:" >&2
untagged_containers 1 | xargs --no-run-if-empty docker rm --volumes=true

# Remove untagged images
echo "Removing images:" >&2
untagged_images 3 | xargs --no-run-if-empty docker rmi

來源: https://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanuphttps://github.com/blueyed/dotfiles/blob/master/usr/bin/docker-cleanup


首先,在嘗試移除容器之前停止運行容器

刪除運行容器

docker rm $(docker stop -t=1 $(docker ps -q))

你可以使用kill而不是stop 。 在我的情況下,我寧願stop因為我傾向於重新運行它們,而不是每次創建一個新的,所以我試圖很好地關閉它們。

注意:試圖阻止一個容器會給你一個錯誤:

錯誤:無法移除正在運行的容器,請先將其停止

刪除所有容器

docker rm $(docker ps -a -q)

#!/bin/bash
# docker-gc --- Remove stopped docker containers

RUNNING=$(docker ps -q)
ALL=$(docker ps -a -q)

for container in $ALL ; do
    [[ "$RUNNING" =~ "$container" ]] && continue
    echo Removing container: $(docker rm $container)
done






docker