在开发或生产环境中,我们常常需要在 Docker 容器中运行一些命令或服务,而其中有些服务需要访问容器内部,但它们并没有 UI 界面,这时候我们就需要在容器中启用 SSH 服务。本文将介绍如何在 Docker 容器中配置 SSH 服务,以及如何连接和管理它。
为什么需要在 Docker 容器中启用 SSH 服务
通常情况下,我们通过 docker exec
命令进入容器内部执行命令或运行服务。但是,有些服务需要 GUI 界面或需要在后台运行,这时候我们就无法再通过 docker exec
命令进行操作。这种情况下,我们可以在容器内部启用 SSH 服务,然后通过 SSH 连接到容器内部进行配置和操作。
在 Docker 容器中启用 SSH 服务
在启用 SSH 服务之前,需要注意以下几点:
- 为了安全起见,我们应该避免在生产环境中使用默认的 SSH 端口 22。
- 启用 SSH 服务后,必须确保容器内部的用户账号和密码设置正确,防止未经授权的访问。
- SSH 连接时需要注意容器和主机之间的 IP 地址和网络配置,确保能够互相访问。
下面是在 Docker 容器中启用 SSH 服务的详细步骤:
- 安装 SSH 服务
在容器内部执行以下命令,安装 SSH 服务和相关的工具包:
apt-get update apt-get install -y openssh-server
- 修改 SSH 配置文件
编辑 SSH 配置文件 /etc/ssh/sshd_config
,将 SSH 端口改为非默认端口,比如 2222,然后将以下两行注释去掉:
#PermitRootLogin prohibit-password #PasswordAuthentication yes
将 PermitEmptyPasswords
参数设为 no
,以避免空密码登录。最后重新启动 SSH 服务:
service ssh restart
- 配置账号和密码
添加一个新用户并设置密码:
useradd -m -d /home/user -s /bin/bash user echo "user:password" | chpasswd
- 开放端口
要么在容器运行时就将需要使用的端口绑定到 host 端口,比如:
docker run -p 2222:2222 -it ubuntu
或者在容器内部开放端口,允许从外部直接访问。比如下面的命令将开放 TCP 端口 2222:
iptables -I INPUT -p tcp --dport 2222 -j ACCEPT
连接和管理 Docker 容器
启用 SSH 后,我们就可以通过 SSH 客户端连接到 Docker 容器了。以下是连接到 Docker 容器的详细步骤:
- 获取容器的 IP 地址
运行以下命令获取容器的 IP 地址:
docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' <container_name_or_id>
- 连接到容器
使用 SSH 客户端连接到容器的 IP 地址和开放的端口号,比如:
ssh user@<container_ip_address> -p 2222
- 管理 Docker 容器
一旦连接到容器,我们就可以在容器内部进行管理和配置。比如,我们可以使用 Docker 命令操作容器,也可以使用工具包比如 vim
或 tmux
等,在容器内部进行代码编辑和终端会话。
一个示例
下面是一个完整的 Dockerfile 来创建一个 SSH 服务的容器。它使用 Ubuntu 作为基础镜像,在容器中安装 SSH 服务和相关工具包,并配置一个新用户密码和 SSH 端口为 2222:
// javascriptcn.com 代码示例 FROM ubuntu:latest ENV DEBIAN_FRONTEND=noninteractive RUN apt-get update && \ apt-get -y install openssh-server vim curl wget && \ apt-get autoclean && rm -rf /var/cache/apt/* /var/lib/apt/lists/* RUN mkdir /var/run/sshd RUN useradd -rm -d /home/ubuntu -s /bin/bash -g root -G sudo -u 1000 ubuntu RUN echo 'ubuntu:ubuntu' | chpasswd RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/g' /etc/ssh/sshd_config RUN sed -i 's/#Port 22/Port 2222/g' /etc/ssh/sshd_config RUN /usr/sbin/sshd -D & EXPOSE 2222 CMD ["/usr/sbin/sshd", "-D"]
使用这个 Dockerfile,我们可以创建一个 SSH 服务的容器,连接到它并执行一些命令。比如:
docker build -t sshd . docker run --rm -p 2222:2222 -d sshd ssh ubuntu@localhost -p 2222
总结
在 Docker 容器中启用 SSH 服务,可以方便地进行远程配置和管理工作,并提高生产环境的安全性。我们可以通过修改 SSH 配置文件、配置账号和密码,以及开放端口来启用 SSH 服务。然后,我们就可以使用 SSH 客户端连接到容器,进而在容器中进行开发和管理工作了。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/654864117d4982a6eb2a9ed2