gpt4 book ai didi

docker 群。无法对 docker 堆栈的容器运行 exec,因为 "docker container list"找不到该容器

转载 作者:行者123 更新时间:2023-12-02 18:32:58 25 4
gpt4 key购买 nike

第 1 部分

我正在尝试在堆栈或服务中的容器之一上执行“exec”。我已遵循此处提供的答案execute a command within docker swarm service以及此处的官方 Docker 文档 https://docs.docker.com/engine/swarm/secrets/但似乎“docker容器列表”及其变体(“docker ps”)似乎没有找到“docker服务列表”中列出的任何容器。

请参阅下面的示例 https://docs.docker.com/engine/swarm/secrets/这意味着在服务的容器上使用“exec”。

1)

printf "This is a secret" | docker secret create my_secret_data -
  • docker service  create --name redis --secret my_secret_data redis:alpine
  • docker service ps redis

    产量ID名称图像节点期望状态当前状态错误端口75olesuh9n4h redis.1 redis:alpine virt-05正在运行16分钟前运行

  • 下面的两个命令返回“redis”的零记录
  • docker ps --filter name=redis -q
    docker container list

    下面的两个命令不会返回“redis”的记录,因此下面的命令肯定不起作用。

    docker container exec $(docker ps --filter name=redis -q) ls -l /run/secrets
    docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data

    我的环境可能存在哪些不同,导致无法重现上面示例中的结果 ( https://docs.docker.com/engine/swarm/secrets/ )

    我的环境如下

    $ uname -r
    4.18.0-338.el8.x86_64
    $ docker version
    Client: Docker Engine - Community
    Version: 20.10.8
    API version: 1.41
    Go version: go1.16.6
    Git commit: 3967b7d
    Built: Fri Jul 30 19:53:39 2021
    OS/Arch: linux/amd64
    Context: default
    Experimental: true

    Server: Docker Engine - Community
    Engine:
    Version: 20.10.8
    API version: 1.41 (minimum version 1.12)
    Go version: go1.16.6
    Git commit: 75249d8
    Built: Fri Jul 30 19:52:00 2021
    OS/Arch: linux/amd64
    Experimental: false
    containerd:
    Version: 1.4.9
    GitCommit: e25210fe30a0a703442421b0f60afac609f950a3
    runc:
    Version: 1.0.1
    GitCommit: v1.0.1-0-g4144b63
    docker-init:
    Version: 0.19.0
    GitCommit: de40ad0

    第 2 部分

    我刚刚在另一个节点上初始化了 docker swam,并且能够成功重现示例 https://docs.docker.com/engine/swarm/secrets/ 中的行为.

    在第二个环境中,docker ps 能够找到(列出)作为服务启动的 redis 容器。下面的命令返回一条记录。

    docker ps --filter name=redis -q
    3de724329171

    通过运行以下命令,我能够在此容器上成功运行“exec”

    docker container exec $(docker ps --filter name=redis -q) ls -l /run/secrets
    docker container exec $(docker ps --filter name=redis -q) cat /run/secrets/my_secret_data

    下面给出了第二个环境的 docker 版本

    $ uname -r
    3.10.0-1160.36.2.el7.x86_64
    docker version
    Client: Docker Engine - Community
    Version: 20.10.8
    API version: 1.41
    Go version: go1.16.6
    Git commit: 3967b7d
    Built: Fri Jul 30 19:55:49 2021
    OS/Arch: linux/amd64
    Context: default
    Experimental: true

    Server: Docker Engine - Community
    Engine:
    Version: 20.10.8
    API version: 1.41 (minimum version 1.12)
    Go version: go1.16.6
    Git commit: 75249d8
    Built: Fri Jul 30 19:54:13 2021
    OS/Arch: linux/amd64
    Experimental: false
    containerd:
    Version: 1.4.9
    GitCommit: e25210fe30a0a703442421b0f60afac609f950a3
    runc:
    Version: 1.0.1
    GitCommit: v1.0.1-0-g4144b63
    docker-init:
    Version: 0.19.0
    GitCommit: de40ad0


    最佳答案

    要使用 docker 访问多节点 swarm 中的容器,为了避免必须单独登录每个虚拟机/docker 主机,您需要确保 docker swarm 节点设置为远程访问。

    docker 守护进程具有公开公共(public)套接字的参数:2375(表示不安全)或:2376(表示 mtls protected 通信)。建议将 mtls 用于除沙盒化程度最高的实验室环境之外的任何环境。或者,无密码 ssh 访问(您在每台服务器上注册本地 .ssh_id)允许您使用 ssh url 远程访问 docker,这是推荐的选项。

    一旦启用了对 docker 的 ssh 或 tcp 访问,您就可以将远程节点 URL 传递给 docker,将其设置在环境变量中,或通过 docker 上下文使用它:

    # using DOCKER_HOST
    export DOCKER_HOST=tcp://lab-node1:2375
    docker container ls
    # Passing a url directly
    docker -H ssh://user@lab-node2 container ls
    # Using a docker context
    docker context create node1 --docker "host=ssh://user@node1"
    docker context use node1
    docker container ls

    一旦您拥有多个 docker 访问权限,请确保 docker 指向管理节点并获取服务的相关详细信息:

    在这种情况下,我们需要知道服务任务正在运行的节点,以及任务的容器名称,它是名称和id的组合。

    docker service ps your-service --format '{{.Node}} {{.Name}}.{{.ID}}' --no-trunc --filter desired-state=running

    现在您已经有了远程节点,假设您已经为每个节点创建了上下文,然后执行如下命令(其中 $containername 是 '{{.Name}}.{{.ID}}' 字符串。

    docker -c $node exec $containername cmdline

    关于 docker 群。无法对 docker 堆栈的容器运行 exec,因为 "docker container list"找不到该容器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69158446/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com