教你如何通过 SSH 连接到 Docker 容器

SSH 是系统管理员工具箱中最常用的命令之一,但它并不常见于 Docker。以下是如何通过 SSH 连接到正在运行的容器,以及为什么在这样做之前应该三思而后行。

你应该在 Docker 容器中使用 SSH 吗?

SSH 进入 Docker 容器通常是一种不好的做法,应该避免。docker exec使用命令在容器中获取 shell几乎总是更好。

Docker 新手可能会尝试使用 SSH 来更新容器内的文件。容器应该是一次性的,所以它们在创建后应该被视为不可变的,除了存储在卷中的持久数据。编辑源代码时创建新图像并重新启动容器。

除了多步骤配置过程之外,在 Docker 映像中安装 SSH 会添加几个依赖包并暴露另一个潜在的攻击向量。在具有多个活动容器的系统上,您将运行多个独立的 SSH 进程,并且必须记住每个容器的正确端口。

无需将 SSH 添加到单个容器,只需在运行 Docker 的物理主机上安装一次即可。使用 SSH 连接到您的主机,然后运行docker exec -it my-container bash以访问各个容器。
虽然docker exec是首选方法,但仍然存在 SSH 可能有用的场景。您可以将其作为权宜之计引入,以与遗留部署系统集成。它也可能被一些 IDE 和构建工具用于在开发期间提供实时重新加载功能。

在 Docker 容器中安装 SSH 服务器

大多数流行的 Docker 基础镜像都被有意简化了。您需要自己添加 OpenSSH 服务器,即使是从流行的操作系统发行版派生的图像。

Dockerfile这是基于 Debian 的映像的示例:

RUN apt-get update && apt-get install -y openssh-server
RUN sed -i 's/PermitRootLogin prohibit-password/PermitRootLogin yes/' /etc/ssh/sshd_config

ENTRYPOINT service ssh start && bash

SSH 配置已修改,因此您可以root以 Docker 容器中的默认用户身份登录。为了提高安全性,请改为设置专用用户帐户:

RUN useradd -m -s /bin/bash sshuser

这将创建一个名为主sshuser目录 ( -m)的新用户。该-s开关将用户的默认登录 shell 设置为 Bash。

使用ENTRYPOINT确保 SSH 服务总是在容器启动时启动。然后将执行交给 Bash 作为容器的前台进程。您可以将其替换为您的应用程序的二进制文件。

配置身份验证

接下来,您需要设置身份验证系统。您可以为您的sshuser帐户分配一个密码并使用该密码登录:

RUN echo "sshuser:Changeme" | changepasswd

更安全的方法是设置 SSH 密钥身份验证。您需要在客户端计算机上创建一个密钥对,然后将公共部分复制到容器中。这样,SSH 守护程序可以在您连接时验证您机器的身份。

更改您为您的用户Dockerfile设置.ssh配置文件夹。使用docker cp命令或COPY. Dockerfile在后一种情况下,密钥将被烘焙到图像中,任何有权访问的人都可以看到。

COPY id_rsa.pub /home/sshuser/.ssh/authorized_keys
RUN chown -R sshuser:sshuser /home/sshuser/.ssh
RUN chmod 600 /home/sshuser/.ssh/authorized_keys

这一系列命令使用工作目录中的公钥创建 SSHauthorized_keys文件。id_rsa.pub调整文件系统权限以匹配 SSH 的要求。

连接到容器

现在您已准备好连接到您的容器。使用绑定到主机的端口 22 运行容器:

docker run -p 22:22 my-image:latest

运行ssh sshuser@example.com会给你一个容器内的外壳。

如果要从托管 Docker 容器的机器进行连接,则可以跳过绑定端口。用于docker inspect获取容器的 IP 地址,然后将其传递给 SSH 连接命令。

docker inspect <id-or-name> | grep 'IPAddress' | head -n 1

使用您机器上的 SSH 客户端连接到容器:

ssh root@172.17.0.1
# OR
ssh sshuser@172.17.0.1

如果您在主机上运行单独的 SSH 服务器,或者您有多个需要端口 22 的容器,则需要使用备用端口。以下是当 SSH 绑定到端口 2220 时启动连接的方法:

cker run -p 22:2220 my-image:latest

ssh root@172.17.0.1 -p 2220

使用 SSH Config 设置容器快捷方式

您可以操作 SSH 配置文件以简化与各个容器的连接。编辑~/.ssh/config以定义具有预配置端口的速记主机:

Host my-container
    HostName 172.17.0.1
    Port 2220
    User sshuser

现在你可以ssh my-container直接跑到你的容器中了。这使得在不记住容器 IP 和端口的情况下处理多个连接变得更容易。

改用 Dockssh 简化容器管理

Dockssh项目通过提供另一个让您运行的守护进程更进一步ssh my-container@example.com,无需任何手动 SSH 配置。您不需要在容器中安装 SSH 服务器;Dockssh 自动代理 SSH 连接并运行正确的docker exec命令。

你必须先安装 Redis 来存储 Dockssh 的配置数据:

sudo apt install redis

接下来,通过添加带有容器名称和 SSH 连接密码的 Redis 记录来定义要公开的容器:

redis-cli set dockssh:my-container:pass "container-password-here"

然后下载 Dockssh:

sudo curl https://github.com/alash3al/dockssh/releases/download/v1.1.0/dockssh_linux_amd64 -O /usr/local/bin/dockssh
sudo chmod +x /usr/local/bin/dockssh
sudo ufw allow 22022

# Start DockSSH server
dockssh

现在您可以连接到您的容器:

ssh my-container@example.com -p 22022

Dockssh 默认监听 22022 端口。打开防火墙以允许使用该端口的传入连接。

连接时,系统会提示您输入容器的密码。这是container-password-here在我们上面的 Redis 记录中设置的。

使用 Dockssh 可以轻松地通过 SSH 连接到大量 Docker 容器。当您定期从远程主机连接到您的容器时,这种方法是理想的,因为它将两步“SSH then docker exec”序列简化为一个令人难忘的命令。

将 Dockssh 注册为系统服务以供长期使用:

sudo nano /etc/systemd/system/dockssh.service
[Unit]
Description=Dockssh service
After=network.target

[Service]
type=simple
Restart=always
RestartSec=1
User=root
ExecStart=/usr/local/bin/dockssh

[Install]
WantedBy=multi-user.target

使用启用服务systemctl:

sudo systemctl enable dockssh.service
sudo systemctl start dockssh

Dockssh 现在将在您的系统启动时自动启动。

概括

将 SSH 与 Docker 容器相结合被广泛认为是一种反模式,但它仍然在开发、测试和遗留环境中使用。如果没有其他选择,您可以将 SSH 服务器添加到容器中,复制公钥,然后通过容器的 IP 或主机端口绑定进行连接。

想要远程管理大量 Docker 容器的系统管理员可以试试 Dockssh。ssh它允许您通过无缝的幕后映射来运行熟悉的命令docker exec,使用未修改的图像为您提供两全其美的体验。

到此这篇关于通过 SSH 连接到 Docker 容器的文章就介绍到这了,更多相关SSH 连接到 Docker 容器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • 详解docker 允许主机ssh连接到docker容器中

    在docker容器中,安装好ssh: 1)替换掉容器中的安装源为163源 2)安装ssh服务 apt-get update apt-get install openssh-server 3)添加目录,修改ssh配置文件 mkdir -p /var/run/sshd vim /etc/pam.d/sshd 找到 session    required     pam_loginuid.so 这一行,将它注释掉 4)添加要链接过来的主机公钥 将公钥放到/root/.ssh/authorized_ke

  • Docker SSH连接docker容器的示例代码

    简介 什么是Docker Docker 是一个开源项目,诞生于 2013 年初,最初是 dotCloud 公司内部的一个业余项目.它基于 Google 公司推出的 Go 语言实现. 项目后来加入了 Linux 基金会,遵从了 Apache 2.0 协议,项目代码在 GitHub 上进行维护. Docker 自开源后受到广泛的关注和讨论,以至于 dotCloud 公司后来都改名为 Docker Inc.Redhat 已经在其 RHEL6.5 中集中支持 Docker:Google 也在其 PaaS

  • 教你如何通过 SSH 连接到 Docker 容器

    SSH 是系统管理员工具箱中最常用的命令之一,但它并不常见于 Docker.以下是如何通过 SSH 连接到正在运行的容器,以及为什么在这样做之前应该三思而后行. 你应该在 Docker 容器中使用 SSH 吗? SSH 进入 Docker 容器通常是一种不好的做法,应该避免.docker exec使用命令在容器中获取 shell几乎总是更好. Docker 新手可能会尝试使用 SSH 来更新容器内的文件.容器应该是一次性的,所以它们在创建后应该被视为不可变的,除了存储在卷中的持久数据.编辑源代码

  • 教你使用Portainer管理多台Docker容器环境的方法

    目录 Portainer管理多台Docker容器环境 2.管理docker 2.1安装运行portaner 2.2修改配置文件 2.3添加节点 2.4效果图 3.踩坑记录 3.1connection refused Portainer管理多台Docker容器环境 1.环境准备 # aliyun 2核8G 139.196.95.123 安装docker和Portainer # aliyun 1核2G 47.100.34.199 安装docker # qingcloud 1核2G 139.198.1

  • Docker容器与主机间的文件传输方法(复制/上传/下载)

    1.首先启动容器(以first-mysql容器为例) docker start first-mysql 2.查看容器ID root@kobe:/opt/software/temp/test# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 688e83c55129 mysql "docker-entrypoint.s-" 6 days ago Up 3 seconds 0.0.0.0:3306->33

  • 运行中的docker容器端口映射如何修改详解

    前言 在docker run创建并运行容器的时候,可以通过-p指定端口映射规则.但是,我们经常会遇到刚开始忘记设置端口映射或者设置错了需要修改.当docker start运行容器后并没有提供一个-p选项或设置,让你修改指定端口映射规则.那么这种情况我们该怎么处理呢?今天Docker君教你如何修改运行中的docker容器的端口映射? 方法一:删除原有容器,重新建新容器 这个解决方案最为简单,把原来的容器删掉,重新建一个.当然这次不要忘记加上端口映射. 优缺点:优点是简单快捷,在测试环境使用较多.缺

  • Docker使用Dockerfile创建支持ssh服务自启动的容器镜像

    本文实例为大家分享了Dockerfile创建支持ssh服务自启动的容器镜像,供大家参考,具体内容如下 1. 首先创建一个Dockerfile文件,文件内容如下 # 选择一个已有的os镜像作为基础 FROM centos:centos6 # 镜像的作者 MAINTAINER Fanbin Kong "kongxx@hotmail.com" # 安装openssh-server和sudo软件包,并且将sshd的UsePAM参数设置成no RUN yum install -y openssh

  • docker容器里安装ssh的具体步骤

    docker安装ssh 通过命令行安装 1.pull ubuntu镜像 docker pull ubuntu:latest 2.启动并进入bash docker run -it -d ubuntu:lastest /bin/bash # 查看刚刚运行容器的id docker ps # 在容器中执行bash命令 docker exec -it id /bin/bash 3.安装openssh-server并启动 apt-get update apt-get install openssh-serv

  • CentOS 6.5 制作可以ssh登录的Docker镜像

    Docker使用系列一我们把镜像源改为了阿里云的,方便后续的操作. 执行这个命令就把源地址改为阿里的: 复制代码 代码如下: curl https://git.oschina.net/feedao/Docker_shell/raw/start/ali-centos.sh | sh 第一安装Docker: yum -y install docker-io 第二启动Docker: service docker start 第三安装制作CentOS镜像的工具: yum -y install feboo

  • Linux系统安装docker并用ssh登录docker容器的操作方法

    说明:我使用的是Centos安装docker 第一步:安装docker sudo yum install -y yum-utils sudo yum-config-manager --add-repo https://download.daocloud.io/docker/linux/centos/docker-ce.repo sudo yum install -y -q --setopt=obsoletes=0 docker-ce-17.09.1.ce* docker-ce-selinux-1

随机推荐