You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否在docker-compose.yml中新增服务,启动时自动创建SSH隧道?

在Docker Compose中自动创建SSH反向隧道的方案

完全可以通过新增一个基于轻量SSH客户端镜像的服务,实现运行docker-compose up时自动创建指定的SSH反向隧道,同时使用当前目录下的SSH私钥。

修改后的docker-compose.yml配置

version: "3.9"

services:
  api:
    image: my/api-service:latest
    ports:
      - "9000:9000"

  ssh-tunnel:
    # 使用轻量的alpine SSH镜像,减少资源占用
    image: alpine/ssh
    # 确保API服务启动后再创建隧道
    depends_on:
      - api
    volumes:
      # 挂载当前目录下的SSH私钥到容器内,设为只读权限避免意外修改
      - ./id_rsa:/.ssh/id_rsa:ro
    command: >
      ssh -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null
      -i /.ssh/id_rsa -N -R 9000:host.docker.internal:9000 root@123.1.2.3
    # 隧道断开后自动重启服务
    restart: unless-stopped

关键配置说明

  • 镜像选择:alpine/ssh是轻量级镜像,仅包含SSH客户端,适合做隧道服务。
  • 私钥挂载:通过volumes将当前目录下的私钥(示例为id_rsa)挂载到容器内的/.ssh/id_rsa,并设置只读权限。如果你的私钥文件名不是id_rsa,直接修改挂载路径即可,比如私钥是my_ssh_key,就改成./my_ssh_key:/.ssh/id_rsa:ro。
  • 隧道命令:
    • -i /.ssh/id_rsa:指定使用挂载的私钥文件
    • -N:仅建立隧道,不执行远程命令
    • -R 9000:host.docker.internal:9000:将远程服务器123.1.2.3的9000端口转发到Docker主机的9000端口,host.docker.internal是Docker官方提供的主机别名,在Windows/Mac的Docker Desktop和Linux(需Docker 20.10+)环境下都能正常使用。
    • -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null:跳过首次连接的主机指纹确认,避免阻塞服务启动。
  • 依赖与重启策略:depends_on保证API服务先启动,restart: unless-stopped确保隧道意外断开后自动重建。

前置准备

  1. 确保当前目录下的SSH私钥文件权限为600,否则SSH客户端会拒绝使用:
    chmod 600 ./id_rsa
    
  2. 如果是Linux环境且host.docker.internal无法解析,可在ssh-tunnel服务中添加以下配置来映射主机网关:
    extra_hosts:
      - "host.docker.internal:host-gateway"
    

内容的提问来源于stack exchange,提问作者gameveloster

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 03:46:08