我的docker-compose.yml
文件创建了一个侦听端口9000
的服务api
,远程服务器123.1.2.3
需要访问该服务。需要SSH隧道,因为有防火墙阻止直接访问Docker主机端口9000。
version: "3.9"
services:
api:
image: my/api-service:latest
ports:
- "9000:9000"
我目前正在Docker主机上运行以下命令,手动创建此SSH隧道
ssh -fN -R 9000:127.0.0.1:9000 root@123.1.2.3
是否可以在此docker-compose.yml
文件中创建另一个服务,以便在运行docker-compose up
时使用与docker-compose.yml
文件相同目录中的SSH私钥创建此SSH隧道?
1条答案
按热度按时间ccrfmcuu1#
看一下a copy of the ssh(1) man page,
ssh -R
选项设置了一个从远程计算机转发回本地计算机的端口其中远程主机上的
port
通过ssh隧道转发,从而从本地系统建立到host:hostport
的出站连接。在您的示例中,如果ssh隧道是从容器启动的,则可以使用普通的Docker网络,并使用容器的标准端口号连接到
api:9000
。您需要的第一件事是ssh客户机的映像,这很容易从源代码构建,所以我们将这样做
**不要将ssh密钥复制到映像中。**映像中的任何内容都可以在以后轻松地提取出来,您不希望以这种方式损害您的ssh密钥。
相反,我们将在容器运行时将ssh密钥bind mount到容器中。ssh对ssh密钥的权限非常挑剔,因此您需要确保容器以与主机系统上相同的数字用户ID运行。
记住这个数字(在Ubuntu系统上,它可能是1000)。
现在,在合成文件中,除了原始服务器外,我们还需要
1.树立形象;
1.指定用户ID;
1.注入ssh密钥;
1.创建某种“主目录”概念;以及
1.指定要运行的实际ssh命令。
在最后一行中,第一个
9000
是远程系统上的端口号,api:9000
是目标容器的容器名称和标准端口号。ports:
还将在本地系统上发布端口,但不是必需的我省略了ssh -f
选项,以便ssh隧道作为前台进程运行,作为其容器中的唯一进程。