尝试在本地浏览器中查看时,Docker R Shiny app 0.0.0.0 拒绝连接

Posted

技术标签:

【中文标题】尝试在本地浏览器中查看时,Docker R Shiny app 0.0.0.0 拒绝连接【英文标题】:Docker R Shiny app 0.0.0.0 refused to connect when trying to view in local browser 【发布时间】:2021-01-11 08:29:01 【问题描述】:

阅读:

Docker refused to connect

在创建新的闪亮网络应用时,我使用 rstudio 模板 app.r 创建了一个简单的闪亮应用。

我的目录:

doug:~/Projects/test$ pwd
/home/work/Projects/test
doug:~/Projects/test$ ls -l
total 20
-rw-r--r-- 1 work work  178 Sep 24 18:27 docker-compose.yml
-rw-r--r-- 1 work work  240 Sep 24 18:16 Dockerfile
drwxr-xr-x 2 work work 4096 Sep 24 13:55 test_app
-rw-r--r-- 1 work work  205 Sep 24 13:45 test.Rproj

我的 Docker 文件:

FROM rocker/shiny-verse

COPY test_app mountpoints/apps/test_app

RUN apt-get update \
    && apt-get upgrade -y
    
WORKDIR mountpoints/apps/test_app

EXPOSE 3838

CMD R --no-save -e 'shiny::runApp("app.R", port = 3838, host = "0.0.0.0")'

我的 docker-compose 文件:

version: '3.2'
services:
  test:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    image: test:latest
    ports:
      - '80:3838'
    user: 'root'

我构建了图像:

doug:~/Projects/test$ docker build -t test .
Sending build context to Docker daemon  34.82kB
Step 1/6 : FROM rocker/shiny-verse
 ---> 6ca67ad3f372
Step 2/6 : COPY test_app mountpoints/apps/test_app
 ---> Using cache
 ---> 7d34eee9154b
Step 3/6 : RUN apt-get update     && apt-get upgrade -y
 ---> Using cache
 ---> 6a9f0856291a
Step 4/6 : WORKDIR mountpoints/apps/test_app
 ---> Using cache
 ---> 30897306d02b
Step 5/6 : EXPOSE 3838
 ---> Using cache
 ---> 0affe5f79ba4
Step 6/6 : CMD R --no-save -e 'shiny::runApp("app.R", port = 3838, host = "0.0.0.0")'
 ---> Using cache
 ---> 1ce09f39c2ce
Successfully built 1ce09f39c2ce
Successfully tagged test:latest

然后我尝试使用 docker-compose 运行:

doug:~/Projects/test$ docker-compose run test

R version 4.0.2 (2020-06-22) -- "Taking Off Again"
Copyright (C) 2020 The R Foundation for Statistical Computing
Platform: x86_64-pc-linux-gnu (64-bit)

R is free software and comes with ABSOLUTELY NO WARRANTY.
You are welcome to redistribute it under certain conditions.
Type 'license()' or 'licence()' for distribution details.

R is a collaborative project with many contributors.
Type 'contributors()' for more information and
'citation()' on how to cite R or R packages in publications.

Type 'demo()' for some demos, 'help()' for on-line help, or
'help.start()' for an html browser interface to help.
Type 'q()' to quit R.

> shiny::runApp("app.R", port = 3838, host = "0.0.0.0")
Loading required package: shiny

Listening on http://0.0.0.0:3838

现在,当我尝试在浏览器中访问http://0.0.0.0:3838 的应用程序时,我得到:

无法访问此网站 0.0.0.0 拒绝连接。

我尝试了一些变化: 127.0.0.1:3838 本地主机:3838 127.0.0.1:3838/test_app 本地主机:3838/test_app

在所有情况下,我都看到了相同的消息,但无法在浏览器中查看我的应用。

我尝试使用上面 docker-compose 文件的端口部分进行试验:

端口:

'80:3838'

试过了:

'3838:3838', '127.0.0.1:3838', '3838'

在每种情况下,我都重建了图像并再次尝试,但我仍然无法在浏览器中查看我的应用程序。

如何运行我的 Shiny 应用并在浏览器中查看它?

【问题讨论】:

ports 第一个数字是 host 端口,第二个数字是 container 端口。当您从容器外部(即从您的浏览器)连接时,您应该连接到 host 端口号,即 80(如果您的操作系统的安全状况允许 docker 容器在端口上运行服务低于 1024)。因此,要么将您的docker-compose.yml 更改为阅读- '3838:3838',要么浏览到127.0.0.1:80(或者只是http://127.0.0.1,因为:80 是从http:// 推断出来的)。见docs.docker.com/engine/reference/run/#expose-incoming-ports 您好,感谢您的建议。我试着去 127.0.0.1 但我已经在那里运行了 Nextcloud 应用程序。因此,我尝试根据您的建议将ports 更改为- '3838:3838'。然后我使用 docker-compose 运行并尝试了 127.0.0.1:3838 和 127.0.0.1:3838 test_app 但看到了相同的错误消息 这是docker-compose 对你做的。我跑了类似的东西,用docker-compose run test 找不到它,但是当我只是docker run -p 3838:3838 --rm test 时,我立即连接到http://localhost:3838 【参考方案1】:

虽然我知道您打算使用 docker-compose,但我的第一步是确保基本网络正常工作。我能够联系到:

docker run -it --rm -p 3838:3838 test

然后我尝试了基本的docker,我能够让它工作

docker-compose run -p 3838:3838 test

(同样,需要-p 3838:3838 ...)

从那里看来,docker-compose 确实是要以up 开始。当我改为(在停止上述容器之后)运行时,我也能够看到闪亮的应用程序

docker-compose up -d test

所以区别在于runup。阅读https://docs.docker.com/compose/reference/run/,我发现:

您与run 一起使用的命令在具有由服务定义的配置(包括卷、链接和其他详细信息)的新容器中启动。但是,有两个重要的区别。

首先,run 传递的命令会覆盖服务配置中定义的命令。例如,如果web 服务配置以bash 启动,则docker-compose run web python app.py 将其覆盖为python app.py

第二个区别是docker-compose run 命令不会创建服务配置中指定的任何端口。这可以防止端口与已经打开的端口发生冲突。如果您确实希望创建服务的端口并将其映射到主机,请指定 --service-ports 标志 ...

(强调我的)

这促使我尝试(并成功):

docker-compose run --service-ports test

所有这些,http://localhost:3838 工作(对我来说在 Windows 上......应该也适用于其他人,但如果不是 localhost 然后尝试127.0.0.1)。


我的文件,为了测试速度稍作修改,因为我没有你的test_app

Dockerfile

FROM rocker/shiny-verse
EXPOSE 3838
CMD R --no-save -e 'library(shiny); runExample("01_hello", port=3838, host="0.0.0.0");'

docker-compose.yml

version: '3.2'
services:
  test:
    build:
      context: .
      dockerfile: Dockerfile
    restart: always
    image: test:latest
    ports:
      - "3838:3838"
    user: 'root'

【讨论】:

非常感谢这个详细的回答。由于一个单独的问题,我现在无法对其进行测试,我无法停止任何容器并因此得到消息“端口已分配”。一旦我弄清楚这一点,我就期待测试这个解决方案。再次感谢! (我遇到了类似的情况,我已经完成了 up -d 并忘记它正在运行。你是说你无法 docker-compose down testdocker-compose stop test?奇怪......好吧,别着急,我整个星期都在这里;-) (你试过普通的docker stop image_namedocker rm image_name吗?意识到这个名字可能很疯狂,而不是testdocker ps在这里有帮助,以防你还没有熟悉。) 您好,感谢您的建议。如果有兴趣***.com/questions/64057692/… 有效!我重新启动了我的笔记本电脑,重建了映像并使用docker-compose run --service-ports test 运行。不能告诉你看到这个工作感觉有多好。真诚的感谢

以上是关于尝试在本地浏览器中查看时,Docker R Shiny app 0.0.0.0 拒绝连接的主要内容,如果未能解决你的问题,请参考以下文章

docker confluence

在 docker 容器中录制本地音频

Docker学习04_镜像管理

闪亮的 R localhost 服务器不工作

Docker 工具箱 - 本地主机不工作

在docker中使用外部jar依赖