使用Docker在容器中运行Ngrok

14

[https://github.com/gtriggiano/ngrok-tunnel]在容器内运行ngrok。为了避免安全风险,必须在容器中运行Ngrok。但是在运行脚本后,我遇到了生成URL的问题。

$ docker pull gtriggiano/ngrok-tunnel


$ docker run -it  -e "TARGET_HOST=localhost" -e "TARGET_PORT=3000" -p 4040 gtriggiano/ngrok-tunnel

enter image description here

我正在本地运行我的 Rails 应用在 localhost:3000 上。

这是我的问题还是可以通过更改仓库内的脚本来解决?

5个回答

4

我之前无法让这个工具正常运行,但后来转而使用https://github.com/shkoliar/docker-ngrok,效果非常好。

对于我的情况,我在docker-compose.yml文件中添加了它:

ngrok:
    image: shkoliar/ngrok:latest
    ports:
      - 4551:4551
    links:
      - web
    environment:
      - PARAMS=http -region=eu -authtoken=${NGROK_AUTH_TOKEN} localdev.docker:80
    networks:
      dev_net:
        ipv4_address: 10.5.0.10

当我执行docker-compose up -d命令后,它会同时启动所有其他相关组件。

然后你可以通过访问http://localhost:4551/来查看状态、请求、ngrok URLs等web界面。

Github页面上也提供了一些手动在命令行中运行的示例,而不是使用docker-compose:

命令行示例:假设您有一个名为dev_web_1的Web服务器Docker容器,已公开端口80。

docker run --rm -it --link dev_web_1 shkoliar/ngrok ngrok http dev_web_1:80

使用命令行时,ngrok会话将一直保持活动状态,直到按下Ctrl+C组合键结束。


你是通过哪种方式设置Ngrok令牌的? - Mitya
1
@Mitya 抱歉,我在最初回答时可能没有使用授权令牌,并且在我们添加它后从未更新过。我已经更新了我的答案以包括它,它只是在docker-compose.yml文件中。如果需要,您可以硬编码它 - 我们只是将其放在Docker .env文件中,因此不同的人可以轻松地在其计算机上拥有不同的值。 - BT643

2

这个composer对我很有用。请注意,在ngrok的入口命令中,你必须通过名称引用其他服务。

version: '3'
services: 
          
    yourwebserver:
        build:
            context: ./
            dockerfile: ...
            target: ...
        container_name: yourwebserver
        volumes:
            - ...
        ports:
            - ...
        extra_hosts:
            - 'host.docker.internal:host-gateway'
        depends_on: 
            - ngrok

            
    ngrok:
        image: ngrok/ngrok:alpine
        environment:
            NGROK_AUTHTOKEN: '...'
        command: 'http yourwebserver:80'        
        ports:
            - '4040:4040'
        expose:
            - '4040'

2

如果您执行单个数字的-p命令,它表示容器端口,主机端口将随机分配。

使用docker run时,可以使用-p,--publish ip:[hostPort]:containerPort来指定主机端口和容器端口。

目前,容器的4040端口已经暴露出来。不确定您的服务是否默认侦听该端口。

要获取本地主机端口,请执行以下操作:

docker ps

您会看到实际端口并没有在监听。

CONTAINER ID        IMAGE                     COMMAND             CREATED              STATUS              PORTS                     NAMES
1aaaeffe789d        gtriggiano/ngrok-tunnel   "npm start"         About a minute ago   Up About a minute   0.0.0.0:32768->4040/tcp   wizardly_poincare

这里它正在本地监听端口号:32768


那么为什么会有TARGET_HOST和TARGET_PORT?谢谢回答。 - Adwaith R Krishna
同时,当我尝试在指定的端口运行我的Rails应用程序时,我收到了“端口已被使用”的错误。 - Adwaith R Krishna
在启动容器后,您如何运行应用程序?同时,一个端口只能分配给一个进程。所以这很正常。 - v_sukt
我仍然不清楚如何构建命令以按预期运行隧道,因为 docker run -it -e "TARGET_HOST=localhost" -e "TARGET_PORT=44332" -p, --publish ip:44332:containerPort 4040 gtriggiano/ngrok-tunnel 给我带来了与 OP 相同的错误。我是否必须将我的应用程序端口更改为通过 docker ps 获得的随机分配端口? - Beltway

0

实际上,要使ngrok与您的Docker容器配合使用,您可以像其网站上的手册所说的那样,在项目之外安装它。然后添加

  nginx:
    labels:
    - "traefik.http.routers.${PROJECT_NAME}_nginx.rule=Host(`${PROJECT_BASE_URL}`, `aaa-abc-xxx-140-177.eu.ngrok.io`)"

这个特定的例子是针对 docker4drupal 的 docker-compose 文件和 traefik 映射为80:80


0

我不确定你是否已经解决了这个问题,但当我遇到这个错误时,我只能这样解决:

# docker-compose.yml

networks:
  - development

我还需要暴露我的 Web 容器的 3000 端口,因为它仍未暴露。

# docker.compose.yml

web:
  expose:
    - "3000"

我的服务器开发容器也在 development 网络下。我认为你应该传递给容器执行的唯一参数是 imageportsenvironment,其中包括服务器容器的 DOMAIN 和 PORT,一个 link,以及你的 Web 容器上的 expose

# docker-compose.yml

  ngrok:
    image: shkoliar/ngrok
    ports:
      - 4551:4551
    links:
      - web
    networks:
      - development
    environment:
      - DOMAIN=squad_web
      - PORT=3000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接