在Docker-composition up上创建SSH隧道的Docker容器

eiee3dmh  于 2023-02-11  发布在  Docker
关注(0)|答案(1)|浏览(165)

我的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隧道?

ccrfmcuu

ccrfmcuu1#

看一下a copy of the ssh(1) man pagessh -R选项设置了一个从远程计算机转发回本地计算机的端口

ssh -R port:host:hostport

其中远程主机上的port通过ssh隧道转发,从而从本地系统建立到host:hostport的出站连接。
在您的示例中,如果ssh隧道是从容器启动的,则可以使用普通的Docker网络,并使用容器的标准端口号连接到api:9000
您需要的第一件事是ssh客户机的映像,这很容易从源代码构建,所以我们将这样做

FROM ubuntu:22.04
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes openssh-client

**不要将ssh密钥复制到映像中。**映像中的任何内容都可以在以后轻松地提取出来,您不希望以这种方式损害您的ssh密钥。

相反,我们将在容器运行时将ssh密钥bind mount到容器中。ssh对ssh密钥的权限非常挑剔,因此您需要确保容器以与主机系统上相同的数字用户ID运行。

id -u

记住这个数字(在Ubuntu系统上,它可能是1000)。
现在,在合成文件中,除了原始服务器外,我们还需要
1.树立形象;
1.指定用户ID;
1.注入ssh密钥;
1.创建某种“主目录”概念;以及
1.指定要运行的实际ssh命令。

version: '3.8'
services:
  api:
    image: my/api-service:latest
    # ports: ['9000:9000']  # optional
  tunnel:
    build:
      context: .
      dockerfile: Dockerfile.ssh
    user: 1000
    volumes:
      - /home/yourname/.ssh:/home/.ssh
    environment:
      HOME: /home
    command: ssh -N -R 9000:api:9000 root@123.1.2.3

在最后一行中,第一个9000是远程系统上的端口号,api:9000是目标容器的容器名称和标准端口号。ports:还将在本地系统上发布端口,但不是必需的我省略了ssh -f选项,以便ssh隧道作为前台进程运行,作为其容器中的唯一进程。

相关问题