我遇到了一个非常具体的情况,尽管还有其他方法可以做到这一点,但我还是对此非常着迷,并想找到一种完全像这样的方法:
背景
假设我有一台服务器运行多个服务,这些服务藏在隔离的Docker容器中。由于大多数服务都是http,因此我正在使用nginx代理向每个服务公开特定的子域。例如,节点服务器在其端口80
绑定到127.0.0.1:8000
主机的docker容器上运行。我会在nginx的是代理的所有请求创建一个虚拟主机myapp.mydomain.com
来http://127.0.0.1:8000
。这样,只能通过外部从外部访问docker容器myapp.mydomain.com
。
现在,我要以一种指向gogs容器的方式启动gogsgogs.mydomain.com
docker容器。因此,我使用绑定到主机上的端口来启动此gogs容器。并且Nginx网站将请求代理到,并且效果很好...8000
127.0.0.1:8001
gogs.mydomain.com
http://127.0.0.1:8001
但是,gogs是一个git容器,我也想像这样访问存储库,git@gogs.mydomain.com:org/repo
但不适用于当前设置。进行此工作的一种方法22
是将容器的端口绑定到0.0.0.0:8022
主机上的端口,然后git ssh url可能类似于git@gogs.mydomain.com:8022/repo
。
(这似乎不工作;当我推到与URI这样的原点,混帐要求密码对git
上gogs.mydomain.com
-而不是gogs.mydomain.com:8022
-但不过这可能是什么我做错了,超出范围的这个问题,我也很感谢任何诊断)
问题
我主要关心的是,我希望<gogs container>:22
代理ssh端口,就像使用nginx代理http端口一样;即任何gogs.mydomain.com
要传递到容器port的ssh连接22
。现在,我无法将容器的ssh端口绑定到主机的ssh端口,因为主机上已经有一个sshd在运行。同样,这意味着任何要*.mydomain.com
传递到容器sshd的连接。
我想要任何ssh连接到:
mydomain.com
host.mydomain.com
或mydomain的IP地址被接受并转发到主机上的sshdgogs.mydomain.com
或被git.mydomain.com
接受传递到gogs容器上的sshd*.mydomain.com
(*
除上述可能性之外,还有其他什么)被拒绝
如果是http,我可以通过nginx轻松实现。有没有办法做到这一点的SSH?
(也想出去问:一般来说,有没有一种方法可以通过任何 tcp服务来完成?)
也欢迎您对我在这里尝试的方式有任何见解。当我要做的事情完全愚蠢时,我不介意被告知。
我已经想到的是:
也许我可以与容器作为ro
卷共享主机上的sshd套接字?这意味着容器内的sshd可以拾取与的所有连接*.mydomain.com
。有没有办法使容器内的sshd 拒绝除gogs.mydomain.com
or 以外的所有连接git.mydomain.com
?但是,主机上的sshd *.mydomain.com
无论如何都将占用所有的连接,包括gogs.mydomain.com
; 所以会有冲突。我不知道,我实际上没有尝试过。我应该尝试吗?