Docker 实现 SSH 服务以及常见问题

前言

在许多开发场景下,我们需要使用 SSH 连接并管理服务器。然而,直接在本地机器上使用 SSH 连接可能会带来一些安全问题,并且也不方便于多人协作。Docker 可以帮助我们解决这些问题。在本篇文章中,我将介绍如何使用 Docker 实现 SSH 服务,并解决一些常见问题。

Docker 实现 SSH 服务

Docker 可以使用官方提供的 SSH 镜像来实现 SSH 服务。首先,我们需要在 Dockerfile 中定义一个基础镜像,并在其中安装 SSH:

# 基础镜像
FROM ubuntu:latest
# 更新软件包列表并安装 SSH
RUN apt-get update && \
    apt-get install -y openssh-server && \
    mkdir /var/run/sshd && \
    echo 'root:password' | chpasswd && \
    sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config && \
    # 防止 SSH 断开连接
    echo "ClientAliveInterval 60" >> /etc/ssh/sshd_config && \
    echo "ClientAliveCountMax 3" >> /etc/ssh/sshd_config && \
    # 配置 SSH 登录时的欢迎语
    echo "Welcome to Docker SSH Service. Enjoy your stay." >> /etc/motd && \
    # 清除无用数据
    rm -rf /var/lib/apt/lists/*

# 开放端口
EXPOSE 22

# 启动 SSH 服务
CMD ["/usr/sbin/sshd", "-D"]

我们可以从上面的 Dockerfile 中了解到:

  • FROM ubuntu:latest:定义一个基础镜像;
  • RUN:在基础镜像中运行的命令;
  • mkdir /var/run/sshd:创建 SSH 需要的目录;
  • echo 'root:password' | chpasswd:设置 SSH 的登录密码;
  • sed -i 's/#PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config:允许 root 用户远程登录;
  • echo "ClientAliveInterval 60" >> /etc/ssh/sshd_configecho "ClientAliveCountMax 3" >> /etc/ssh/sshd_config:防止 SSH 断开连接;
  • echo "Welcome to Docker SSH Service. Enjoy your stay." >> /etc/motd:配置 SSH 登录时显示的欢迎语;
  • rm -rf /var/lib/apt/lists/*:清除无用数据。

在编写完 Dockerfile 后,我们可以构建镜像:

$ docker build -t ssh-server .

构建成功后,我们可以启动 SSH 服务:

$ docker run -d -p 2222:22 --name ssh-server ssh-server

我们现在就成功启动了 SSH 服务,并且可以使用 SSH 客户端连接:

$ ssh root@localhost -p 2222

常见问题

如何让 Docker 宿主机器也可以 SSH 连接到容器

默认情况下,只有容器内的客户端可以通过 SSH 访问容器。如果需要让 Docker 宿主机器也可以 SSH 连接到容器,可以使用以下命令:

$ docker run -d -p 2222:22 --name ssh-server --privileged ssh-server

在上面的命令中,我们增加了 --privileged 选项,以使得容器可以访问宿主机网络。这时,我们就可以在宿主机中使用 SSH 客户端连接到容器了。

如何使用 SSH 免密登录容器

将宿主机的公钥添加到容器的 authorized_keys 文件中即可实现 SSH 免密登录容器。我们可以使用以下命令将宿主机的公钥添加到容器内的 authorized_keys 中:

$ docker cp ~/.ssh/id_rsa.pub ssh-server:/tmp/id_rsa.pub
$ docker exec -it ssh-server /bin/bash -c "mkdir -p ~/.ssh && cat /tmp/id_rsa.pub >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys && rm -f /tmp/id_rsa.pub"

执行完上述命令后,我们就可以免密登录容器了:

$ ssh root@localhost -p 2222

如何使用 Docker Compose 管理 SSH 服务

使用 Docker Compose 可以更加方便地管理 Docker 容器,配置文件如下:

version: "3"
services:
  ssh:
    build: .
    ports:
      - "2222:22"
    volumes:
      - "./authorized_keys:/root/.ssh/authorized_keys"
    environment:
      - "PASSWORD=password"

在上述配置中,我们可以看到:

  • build: .:定义 Dockerfile 所在的目录;
  • ports: - "2222:22":将容器内部的 22 端口映射到宿主机的 2222 端口;
  • volumes: - "./authorized_keys:/root/.ssh/authorized_keys":将宿主机中的 authorized_keys 文件挂载到容器内部;
  • environment: - "PASSWORD=password":设置 SSH 的登录密码。

使用以下命令启动 SSH 服务:

$ docker-compose up -d

总结

在本文中,我们介绍了如何使用 Docker 实现 SSH 服务,并解决了一些常见问题。通过这种方式,我们可以更加安全和便利地管理服务器,并支持多人协作。希望这篇文章对您有所帮助。

来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65aa7fc1add4f0e0ff41a664


纠错反馈