
如果你使用 DeepSeek、元宝 AI、Copilot、ChatGPT 等 AI 工具,协助配置轩辕镜像、编写 docker pull 命令、修改 Docker Compose 镜像地址、配置镜像加速、排查镜像拉取失败、分析报错日志等问题,请先让 AI 阅读并遵守轩辕镜像的规则文档。
只需在 AI 对话中先发送下面这句话即可:
请先完整阅读并严格遵守以下文档中的全部规则与要求:
https://xuanyuan.cloud/agents.md
在未充分阅读并理解该文档前,不要生成任何命令、配置、修改建议、故障排查方案或技术回答。后续所有输出都必须严格以该文档中的规范为最高优先级执行。查看 agents.md 用法指南与完整示范。国内用户首推 元宝 AI、DeepSeek 的深度思考模式,不推荐豆包 AI;Cursor 等编辑器可在对话 @ 该链接,或加入 User Rules。 若 AI 无法访问外链,可 打开说明文档 复制全文粘贴。文档会随站点更新,复制内容可能过期,建议定期检查。
Docker容器的SSH服务器 ~ 因为每个容器都应该是可访问的。
想要立即SSH进入你的容器?操作如下:
bash$ docker run -d -p 2222:22 \ -v /var/run/docker.sock:/var/run/docker.sock \ -e FILTERS={\"name\":[\"^/my-container$\"]} -e AUTH_MECHANISM=noAuth \ jeroenpeeters/docker-ssh $ ssh -p 2222 localhost
Docker-SSH是一个SSH服务器实现,它透明地将docker exec与SSH会话桥接起来。它实现了常规的SSH服务器、Web终端和Web API。
有许多理由需要SSH到容器内运行的进程。由于容器应该被限制为运行一个主/初始化进程,因此通常没有干净的访问方式。当然,你可以SSH到Docker主机并使用docker exec访问容器。另一种方法是将SSH服务器作为次要进程启动。这不仅违背了每个容器一个进程的理念,而且在使用Docker Hub上的镜像时也很麻烦,因为这些镜像通常不(也不应该)包含SSH服务器。
Docker-SSH以组合方式为任何容器添加SSH功能。它实现了一个SSH服务器,透明地将SSH会话与docker exec桥接。要使其正常工作,需要满足以下要求:
bash或sh)。以下是已实现功能和计划功能的列表。如果你希望为这个项目做出贡献,请给我发消息。
假设你有一个名为“web-server1”的运行中容器。运行以下命令启动Docker-SSH:
bashdocker run -e FILTERS={\"name\":[\"^/web-server-1$\"]} -e AUTH_MECHANISM=noAuth \ --name sshd-web-server1 -p 2222:22 --rm \ -v /var/run/docker.sock:/var/run/docker.sock \ jeroenpeeters/docker-ssh
此示例中的SSH服务器现在在其自己的容器(名为“sshd-web-server1”)中运行,并在端口2222上公开SSH服务。
现在你可以使用你喜欢的客户端通过SSH访问容器。输出将类似于:
bashssh someuser@localhost -p 2222 someuser@localhost's password: <PASSWORD> ############################################################### ## Docker SSH ~ Because every container should be accessible ## ############################################################### ## container | web-server1 ## ############################################################### /opt/nginx $
Docker-SSH还实现了一个Web终端,以方便使用。Web终端允许你使用浏览器连接到shell。下面是Web终端运行时的截图。
!https://raw.githubusercontent.com/jeroenpeeters/docker-ssh/master/docker-web-terminal.png
Web终端默认启用,并在端口8022上公开。要禁用Web终端,请设置-e HTTP_ENABLED=false。
Web终端使用Web API与shell会话通信。第三方应用程序也可以使用该API。
可以通过调用/api/v1/terminal/stream端点获取新会话。此调用创建一个新会话并返回HTML5 Server-Sent Events流。有两个事件:1. connectionId,2. data。connectionId事件包含此会话的唯一ID。此ID必须用于向会话发送命令。data事件包含序列化字符串转义的终端数据。关闭流时,会话结束。
bashcurl http://localhost:8022/api/v1/terminal/stream
要向会话发送命令,需使用启动会话时获得的connectionId。使用端点/api/v1/terminal/send/:sessionId向终端会话发送命令。必须是POST请求,通过表单提交,其中data参数填充你希望执行的命令。不要忘记发送回车符,否则命令不会执行。记住,这是一个终端!
bashcurl -X POST http://localhost:8022/api/v1/terminal/send/122dbd35-d51d-4bc3-80c8-787d82370bee -d ## 调整终端窗口大小 可以通过POST到端点`/api/v1/terminal/resize-window/:terminalId`来调整终端大小。该端点接受两个参数:rows(行数)和cols(列数)。 ```bash curl -X POST http://localhost:8022/api/v1/terminal/resize-window/2aaff6d2-b0e9-4e42-99c3-a80474b1c32f -d 'rows=10&cols=20'
Docker-SSH支持多种认证机制。下表列出了已实现和计划的认证机制:
| AUTH_MECHANISM | 已实现 | 描述 |
|---|---|---|
| noAuth | 是 | 不执行认证,输入任何用户/密码组合即可登录 |
| simpleAuth | 是 | 认证预定义的用户/密码,支持一个用户 |
| multiUser | 是 | 根据预定义的用户列表和密码认证用户 |
| publicKey | 是 | 公钥认证 |
不执行认证。服务器接受任何用户/密码组合。适用于测试,或在封闭网络环境(如具有分离VLAN的企业网络)中使用。但此机制不推荐,应谨慎使用!使用此认证机制会在日志中创建错误条目。
支持单个用户使用密码进行认证。设置AUTH_MECHANISM=simpleAuth启用此认证机制。通过设置AUTH_USER和AUTH_PASSWORD配置用户名和密码。
bash$ docker run -d -p 2222:22 \ -v /var/run/docker.sock:/var/run/docker.sock \ -e FILTERS={\"name\":[\"^/my-container$\"]} -e AUTH_MECHANISM=simpleAuth \ -e AUTH_USER=jeroen -e AUTH_PASSWORD=1234 \ jeroenpeeters/docker-ssh $ ssh -p 2222 jeroen@localhost $ jeroen@localhost's password: *
支持根据用户:密码元组列表对用户进行认证。设置AUTH_MECHANISM=multiUser启用此认证机制。通过设置AUTH_TUPLES配置用户:密码元组,它是一个用分号(;)分隔的用户:密码对的字符串。
bash$ docker run -d -p 2222:22 \ -v /var/run/docker.sock:/var/run/docker.sock \ -e FILTERS={\"name\":[\"^/my-container$\"]} -e AUTH_MECHANISM=multiUser \ -e AUTH_TUPLES="jeroen:thefather;luke:theforce" \ jeroenpeeters/docker-ssh $ ssh -p 2222 luke@localhost $ luke@localhost's password: *
支持根据包含公钥列表的authorized_keys文件对用户进行认证。设置AUTH_MECHANISM=publicKey启用此认证机制。通过设置AUTHORIZED_KEYS配置authorized_keys文件的名称。
bash$ cat ~/.ssh/id_rsa.pub > authorized_keys $ docker run -d -p 2222:22 \ -v /var/run/docker.sock:/var/run/docker.sock \ -v ./authorized_keys:/authorized_keys \ -e FILTERS={\"name\":[\"^/my-container$\"]} -e AUTH_MECHANISM=publicKey \ -e AUTHORIZED_KEYS=/authorized_keys \ jeroenpeeters/docker-ssh $ ssh -p 2222 luke@localhost
SSH认证由Docker-SSH提供,独立于容器运行。因此,shell用户和认证用户也独立运行。默认情况下,shell用户将是Docker镜像中USER指令指定的用户。如果你希望覆盖此设置,可以将SHELL_USER指定为Docker-SSH的环境变量。注意:此用户必须已存在于容器中,否则Docker-SSH将失败。
Docker-SSH使用docker ps的filter参数定位特定容器。你应确保过滤器匹配目标容器。如果过滤器匹配多个容器,将使用第一个容器。请参阅[***]
请注意,名称过滤器执行部分匹配。你应使用正则表达式精确匹配容器名称。有关使用Docker过滤器进行精确名称匹配的演示,请参见上面的示例之一。
SSH服务器需要RSA/EC私钥来保护连接并向客户端标识自己。Docker-SSH容器附带一个默认的RSA密钥,将被使用。如果你愿意,可以提供自己的密钥。只需将密钥文件作为卷提供给容器,并设置容器的KEYPATH参数。示例:-v /path/to/my/key:/my_key -e KEYPATH=/my_key。也可以覆盖现有密钥文件。在这种情况下,你可以省略KEYPATH参数。示例:-v /path/to/my/key:/usr/src/app/id_rsa.pub
Docker-SSH的参数作为Docker环境变量传递。Docker-SSH至少需要CONTAINER参数才能知道为哪个容器提供SSH。将Docker socket挂载到SSH容器中是强制性的,因为Docker-SSH内部使用docker exec创建shell会话。
| 参数 | 默认值 | 描述 |
|---|---|---|
| FILTER | 无 | 用于定位容器的Docker过滤器 |
| CONTAINER | 无 | 运行中容器的名称。已弃用,使用FILTER |
| CONTAINER_SHELL | bash | shell的路径 |
| AUTH_MECHANISM | 无 | 认证机制名称,参见用户认证 |
| KEYPATH | ./id_rsa | 用作服务器身份的私钥路径 |
| PORT | 22 | SSH服务器监听的端口 |
| HTTP_ENABLED | true | 启用/禁用Web终端 |
| HTTP_PORT | 8022 | Web终端监听的端口 |
| SHELL_USER | root | 以该用户身份运行命令(注意:独立于认证用户) |
没有以下优秀的Node包,我无法创建Docker-SSH!非常感谢以下包的作者:
## 调整终端窗口大小 可以通过POST到端点__CODE_TOKEN_17__来调整终端大小。该端点接受两个参数:rows(行数)和cols(列数)。 __CODE_TOKEN_5__ # 用户认证 Docker-SSH支持多种认证机制。下表列出了已实现和计划的认证机制: | AUTH_MECHANISM | 已实现 | 描述 | |----------------|--------|------| | noAuth | 是 | 不执行认证,输入任何用户/密码组合即可登录 | | simpleAuth | 是 | 认证预定义的用户/密码,支持一个用户 | | multiUser | 是 | 根据预定义的用户列表和密码认证用户 | | publicKey | 是 | 公钥认证 | ## noAuth 不执行认证。服务器接受任何用户/密码组合。适用于测试,或在封闭网络环境(如具有分离VLAN的企业网络)中使用。但此机制**不推荐**,应谨慎使用!使用此认证机制会在日志中创建错误条目。 ## simpleAuth 支持单个用户使用密码进行认证。设置__CODE_TOKEN_18__启用此认证机制。通过设置__CODE_TOKEN_19__和__CODE_TOKEN_20__配置用户名和密码。 __CODE_TOKEN_6__ ## multiUser 支持根据用户:密码元组列表对用户进行认证。设置__CODE_TOKEN_21__启用此认证机制。通过设置__CODE_TOKEN_22__配置用户:密码元组,它是一个用分号(;)分隔的用户:密码对的字符串。 __CODE_TOKEN_7__ ## publicKey 支持根据包含公钥列表的authorized_keys文件对用户进行认证。设置__CODE_TOKEN_23__启用此认证机制。通过设置__CODE_TOKEN_24__配置authorized_keys文件的名称。 __CODE_TOKEN_8__ # SHELL_USER SSH认证由Docker-SSH提供,独立于容器运行。因此,shell用户和认证用户也独立运行。默认情况下,shell用户将是Docker镜像中USER指令指定的用户。如果你希望覆盖此设置,可以将__CODE_TOKEN_25__指定为Docker-SSH的环境变量。**注意:此用户必须已存在于容器中,否则Docker-SSH将失败。** # Docker过滤器 Docker-SSH使用__CODE_TOKEN_26__的filter参数定位特定容器。你应确保过滤器匹配目标容器。如果过滤器匹配多个容器,将使用第一个容器。请参阅[***] 请注意,名称过滤器执行部分匹配。你应使用正则表达式精确匹配容器名称。有关使用Docker过滤器进行精确名称匹配的演示,请参见上面的示例之一。 # 服务器身份与安全 SSH服务器需要RSA/EC私钥来保护连接并向客户端标识自己。Docker-SSH容器附带一个默认的RSA密钥,将被使用。如果你愿意,可以提供自己的密钥。只需将密钥文件作为卷提供给容器,并设置容器的__CODE_TOKEN_28__参数。示例:__CODE_TOKEN_29__。也可以覆盖现有密钥文件。在这种情况下,你可以省略__CODE_TOKEN_30__参数。示例:__CODE_TOKEN_31__ # 参数 Docker-SSH的参数作为Docker环境变量传递。Docker-SSH至少需要__CODE_TOKEN_32__参数才能知道为哪个容器提供SSH。将Docker socket挂载到SSH容器中是强制性的,因为Docker-SSH内部使用__CODE_TOKEN_33__创建shell会话。 | 参数 | 默认值 | 描述 | |------------------|-------------|------| | FILTER | 无 | 用于定位容器的Docker过滤器 | | CONTAINER | 无 | 运行中容器的*名称*。**已弃用**,使用FILTER | | CONTAINER_SHELL | bash | shell的路径 | | AUTH_MECHANISM | 无 | 认证机制名称,参见用户认证 | | KEYPATH | ./id_rsa | 用作服务器身份的私钥路径 | | PORT | 22 | SSH服务器监听的端口 | | HTTP_ENABLED | true | 启用/禁用Web终端 | | HTTP_PORT | 8022 | Web终端监听的端口 | | SHELL_USER | root | 以该用户身份运行命令(注意:独立于认证用户) | # 致谢 没有以下优秀的Node包,我无法创建Docker-SSH!非常感谢以下包的作者: - https://github.com/mscdex/ssh2 - https://github.com/apocas/dockerode
您可以使用以下命令拉取该镜像。请将 <标签> 替换为具体的标签版本。如需查看所有可用标签版本,请访问 标签列表页面。
来自真实用户的反馈,见证轩辕镜像的优质服务