尝试在本地浏览器中查看时,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
所以区别在于run
和up
。阅读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 test
或 docker-compose stop test
?奇怪......好吧,别着急,我整个星期都在这里;-)
(你试过普通的docker stop image_name
和docker rm image_name
吗?意识到这个名字可能很疯狂,而不是test
。docker ps
在这里有帮助,以防你还没有熟悉。)
您好,感谢您的建议。如果有兴趣***.com/questions/64057692/…
有效!我重新启动了我的笔记本电脑,重建了映像并使用docker-compose run --service-ports test
运行。不能告诉你看到这个工作感觉有多好。真诚的感谢以上是关于尝试在本地浏览器中查看时,Docker R Shiny app 0.0.0.0 拒绝连接的主要内容,如果未能解决你的问题,请参考以下文章