【问题标题】:How to access to a docker container via SSH using IP address?如何使用 IP 地址通过 SSH 访问 docker 容器?
【发布时间】:2022-05-08 23:48:31
【问题描述】:

我在 Linux 机器(Ubuntu 20.04)中使用 NVIDIA Docker。我使用nvidia/cuda:11.0-base 图像创建了一个名为user1 的容器,如下所示:

docker run --gpus all --name user1 -dit nvidia/cuda:11.0-base /bin/bash

而且,如果我运行docker ps -a,这就是我看到的:

admin@my_desktop:~$ docker ps -a
CONTAINER ID   IMAGE                                  COMMAND                  CREATED          STATUS                     PORTS     NAMES
a365362840de   nvidia/cuda:11.0-base                  \"/bin/bash\"              3 seconds ago    Up 2 seconds                         user1

我想通过ssh 使用来自完全不同机器的唯一IP 地址访问该容器(my_desktop 除外,它是主机)。首先,是否可以为每个容器授予唯一的 IP 地址?如果是这样,我该怎么做?提前致谢。

  • 容器通常是单个进程的包装器。你想要的听起来更像是一个完整的虚拟机。

标签: docker ssh docker-container ipv4 nvidia-docker


【解决方案1】:

如果您想从外部 VM 使用 ssh 访问您的容器,您需要执行以下操作

  1. 为您的容器安装 ssh 守护程序
  2. 运行容器并暴露其 ssh 端口

    我建议使用以下 Dockerfile,它从 nvidia/cuda:11.0-base 构建并创建一个包含 ssh 守护进程的映像

    Dockerfile

    # Instruction for Dockerfile to create a new image on top of the base image (nvidia/cuda:11.0-base)
    FROM nvidia/cuda:11.0-base
    ARG root_password
    RUN apt-get update || echo "OK" && apt-get install -y openssh-server
    RUN mkdir /var/run/sshd
    RUN echo "root:${root_password}" | chpasswd
    RUN sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config
    RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config
    EXPOSE 22
    CMD ["/usr/sbin/sshd", "-D"]
    

    从 Dockerfile 构建镜像

    docker image build --build-arg root_password=password --tag nvidia/cuda:11.0-base-ssh .
    

    创建容器

    docker container run -d -P --name ssh nvidia/cuda:11.0-base-ssh
    

    运行docker ps 以查看container port

    最后,访问容器

    ssh -p 49157 root@<VM_IP>
    

    编辑: 正如 David Maze 正确指出的那样。您应该知道 root 密码将在 image history 中可见。这种方式也覆盖了原始容器进程。

    这个流程,如果要采用的话,需要修改一下,以防生产使用需要。对于希望将 ssh 添加到其容器的人来说,这是一个起点。

【讨论】:

  • (记住 ssh 守护进程将运行代替正常的容器过程。我相信 root 密码也会在docker inspect 输出中以纯文本形式显示,并且每次重建映像时都会有不同的 ssh 主机密钥。)
  • @DavidMaze您是对的,将您的指针添加到答案中。谢谢!
  • @TolisGerodimos 感谢您的回答。我按照您在上面编写的步骤,并使用提供的 Dockerfile 成功创建了容器。但我不明白如何使用ssh -p 49157 root@&lt;VM_IP&gt; 访问容器。 &lt;VM_IP&gt; 是什么意思,应该在我的 VM 上执行哪些操作才能启用此功能?
  • <VM_IP> 是您从外部访问 Linux 机器的 IP 地址的占位符
  • @TolisGerodimos 哦,我明白了。该解决方案有效。非常感谢您为我节省了很多时间:)
猜你喜欢
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 2019-12-30
  • 2021-04-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-10
相关资源
最近更新 更多