【问题标题】:Cannot list out stopped container using docker ps -a无法使用 docker ps -a 列出已停止的容器
【发布时间】:2020-08-28 21:57:56
【问题描述】:

我尝试使用docker rmi image_id 和终端输出Error response from daemon: conflict: unable to delete dd85c346890b (must be forced) - image is being used by stopped container b91e905c2b8e 删除图像。然后我尝试使用docker ps -a 列出容器,但没有显示。然后我尝试了docker inspect b91e905c2b8e 它确实存在。我可以使用docker rm b91e905c2b8e 删除容器。

为什么不使用docker ps -a 显示容器。该容器是使用kubectl apply pod_config.yaml 创建的。这会影响 docker 吗?

已编辑:
pod.yaml

apiVersion: v1 
kind: Pod 
metadata: 
  name: my-pod
  labels: 
    component: web
spec: 
  containers: 
    - name: client 
      image: imageB // original is imageA    
      ports: 
        - containerPort: 3000

【问题讨论】:

  • 检查 pod 是否安排在您正在执行 docker 命令的节点上
  • 你可能不应该在 Kubernetes 管理的节点上手动使用docker 命令;而是删除 Kubernetes Pod(或其控制 Deployment/StatefulSet/Job/DaemonSet)。如果您不在纯本地环境(Docker 桌面)中,您通常根本不应该/不能登录工作节点。
  • 该 pod 以前使用容器 (b91e905c2b8e),但现在已替换为新的另一个容器并正在运行。你能解释一下发生了什么吗?@ArghyaSadhu
  • 因为我将 pod 内的容器从 A 更改为 B,但 A 仍然保留了它的图像。我怎样才能删除它们?我无法移除 pod,因为 pod 仍在使用中。 @大卫迷宫
  • 如果pod还在使用,那么镜像还在使用中,不能删除。

标签: docker kubernetes kubectl


【解决方案1】:

快速解决方案:

docker --host unix:///$HOME/Library/Containers/com.docker.docker/Data/docker.raw.sock ps -a

说明:

从 Docker 开发人员的角度来看,这似乎是一种预期行为。
Mac 版本的 Docker 正在使用特定的套接字将 docker-cli 连接到在 Hyperkit VM 上运行的守护进程。

如果您使用 Docker.app 附带的或单独安装的 docker 二进制文件,它的工作方式完全相同。

幸运的是 Docker-desktop for MacOS 创建了两种套接字:

用于 Docker 桌面应用程序需求的“过滤”套接字(默认使用),可能与其 Kubernetes 实现有关:

$HOME/Library/Containers/com.docker.docker/Data/docker.sock

和未过滤的:

$HOME/Library/Containers/com.docker.docker/Data/docker.raw.sock

为了显示差异,我复制了您的情况并在Exited 状态下获得了 ID 为:b2f1fed9c793 的容器:

$ docker inspect b2f1fed9c793 | grep Status
            "Status": "exited",

$ docker  ps -a | grep b2f1fed9c793
# empty output

当我运行相同的命令连接到不同的套接字时,我得到不同的结果,只有原始套接字显示退出的容器:

$ docker --host unix:///$HOME/Library/Containers/com.docker.docker/Data/docker.sock ps -a | grep b2f1fed9c793
# empty output

$ docker --host unix:///$HOME/Library/Containers/com.docker.docker/Data/docker.raw.sock ps -a | grep b2f1fed9c793
b2f1fed9c793        nginx                              "nginx -g 'daemon of…"   40 minutes ago      Exited (0) 39 minutes ago                            k8s_nginx_nginx3_default_2a5ed89d-ccff-4561-a320-676603d30619_4

默认套接字给出 0 行退出容器:

$ docker --host unix:///$HOME/Library/Containers/com.docker.docker/Data/docker.sock ps -a | grep Exited | wc -l 
       0

但原始套接字给出 22:

$ docker --host unix:///$HOME/Library/Containers/com.docker.docker/Data/docker.raw.sock ps -a | grep Exited | wc -l 
      22

要默认使用 raw socked,您可以创建一个别名:

$ alias docker="docker --host unix:///$HOME/Library/Containers/com.docker.docker/Data/docker.raw.sock"

$ docker  ps -a | grep Exited | wc -l 
      22

解决方案最初是由lalyosissue comment 中提出的,但他解决的问题略有不同。

【讨论】:

    猜你喜欢
    • 2020-11-16
    • 1970-01-01
    • 2015-07-25
    • 2020-06-29
    • 1970-01-01
    • 1970-01-01
    • 2015-09-30
    • 2022-08-03
    • 2018-07-27
    相关资源
    最近更新 更多