使用 docker 在容器中运行 Ngrok

Posted

技术标签:

【中文标题】使用 docker 在容器中运行 Ngrok【英文标题】:Running Ngrok in a container using docker 【发布时间】:2019-05-05 21:01:41 【问题描述】:

[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

我在 localhost:3000 上运行我的 Rails 应用程序

这是我的问题还是可以通过更改脚本(在 repo 内)来解决?

【问题讨论】:

【参考方案1】:

我无法让这个工作,但切换到https://github.com/shkoliar/docker-ngrok,它工作得很好。

在我的例子中,我将它添加到我的 docker-compose.yml 文件中:

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

当我做docker-compose up -d时,一切都是从其他事情开始的

然后有一个位于 http://localhost:4551/ 的 Web UI 供您查看状态、请求、ngrok URL 等。

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组合终止。

【讨论】:

【参考方案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

这里正在监听 localhost:32768

【讨论】:

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

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

# docker-compose.yml

networks:
  - development

我还需要公开我的网络容器的 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

【讨论】:

以上是关于使用 docker 在容器中运行 Ngrok的主要内容,如果未能解决你的问题,请参考以下文章

jenkins容器中使用docker

使用 Maven 在 gitlab 中运行(Docker)测试容器

使用 shell 脚本在 docker 容器中运行脚本

使用 GDAL 在 docker 容器中运行 Django

无法从运行在另一个 docker 容器中的 Geoserver 连接到在 docker 中运行的 Postgis

如何从另一个容器访问在 Docker 容器中运行的 Mopidy