如何使用 IP 地址通过 SSH 访问 docker 容器?

How to access to a docker container via SSH using IP address?

我在 Linux 机器上使用 NVIDIA Docker (Ubuntu 20.04)。我使用 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地址?如果是这样,我该怎么做?提前致谢。

如果你想从外部 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 pscontainer port

最后访问容器

ssh -p 49157 root@<VM_IP>

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

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