前言
在许多开发场景下,我们需要使用 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_config
和echo "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