我有一个带有 docker 容器的服务器,并且只能通过 ssh 访问它。
我无法通过 http 等连接到它。
我无法添加更多可用的网络端口,除了 22(并且 22 已被 ssh 占用)。
我有搬运工,在我的本地 PC 上运行。
所以。有没有办法我可以在 portainer 中添加端点,通过 ssh 使用这个服务器容器?
如果您被允许转发连接,您可以将本地套接字连接转发到远程服务器,ssh
然后在portainer
本地运行绑定安装该套接字:
ssh -n -N -T -L ${PWD}/docker.sock:/var/run/docker.sock user@host &
docker run -d \
-p 8000:8000 \
-p 9000:9000 \
--name=portainer \
--restart=always \
-v ${PWD}/docker.sock:/var/run/docker.sock \
-v portainer_data:/data \
portainer/portainer-ce
我也在寻找解决方案,可以通过以下几种方式扩展解决方案masseyb以实现持久性:
无需直接启动 portainer,您只需在 portainer Web 界面中添加环境(Environments -> create Environment)。这几乎是这些方法的要求。
编辑:portainer 需要以端口转发或 with 启动,--network host
以便它可以看到暴露的端口或 with-v /var/run/docker-$${HOST}.sock:/var/run/docker-$${HOST}.sock
以便它可以看到 unix 套接字。
Autossh 是一种简单的方法,只需替换ssh
为autossh
即可。
与 systemd 一起使用:这是我用于创建反向隧道的单元文件,但可以通过将 -R 更改为 -L (并可选择更改描述)轻松调整本地->远程隧道:
[Unit]
Description=A reverse tunnel using ssh for %I (format remote port:host:local port, connect to host forward remote port to local port)
Wants=network-online.target
After=network-online.target
StartLimitIntervalSec=0
[Service]
ExecStart=/usr/bin/bash -c 'URI=%i; REMOTE_PORT=$${URI%%%%:*}; LOCAL_PORT=$${URI##*:}; HOST=$${URI%:*}; HOST=$${HOST#*:}; /usr/bin/ssh -qNnT -o ServerAliveInterval=30 -o ServerAliveCountMax=3 -o ExitOnForwardFailure=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -i /etc/rtunnel/$${HOST}.id_rsa -R $$REMOTE_PORT:localhost:$$LOCAL_PORT sshdummy@$$HOST'
Restart=always
RestartSec=60
[Install]
WantedBy=multi-user.target
要进行此设置:
/etc/rtunnel/${host}.id_rsa
并将公共 ID 复制到sshdummy@host:~/.ssh/authorized_keys
sudo systemctl enable --now rtunnel@10022:myhost:22
在您的主机上运行(这会创建一个从 myhost:10022 到 localhost:22 的持久隧道)/etc/ssh/sshd_config
因此也设置了 ClientAliveInterval 和 ClientAliveCountMax 值:Match User sshdummy
ClientAliveInterval 15
ClientAliveCountMax 3
ssh 和 systemd 选项的解释:
StartLimitIntervalSec=0
如果在 X 秒后无法启动,则停止 systemd 终止服务
Restart=always
确保服务总是在RestartSec=60
几秒钟后重新启动
-o ExitOnForwardFailure=yes
确保 ssh 退出,从而在无法设置隧道时重新启动服务
-o UserKnownHostsFile=/dev/null -o StrictHostKeyChecking=no
忽略主机密钥验证失败
-i /etc/rtunnel/$${HOST}.id_rsa
为要连接的每个主机使用单独的 ssh 密钥