当前位置: 首页 > 知识库问答 >
问题:

在Docker中暴露端口不起作用

饶铭
2023-03-14

我正在尝试用Docker和Selenium Grid建立一个自动化测试平台。在下图中,你可以看到我使用的结构。最上面是运行在计算引擎上的ubuntu服务器。左边是一个运行ubuntu 14.04的docker容器。该容器使用Google App Engine在localhost:8080上运行我们的项目。右边是Selenium集线器,有两个节点在端口4444上运行。

Docker和Selenium设置

这是运行docker ps时的输出:

CONTAINER ID        IMAGE                               COMMAND                  CREATED             STATUS              PORTS                     NAMES
f5ac6e3c8270        xxxxx/ubuntuport:14.04              "/bin/bash"              3 days ago          Up 13 seconds       0.0.0.0:32777->8080/tcp   drunk_kalam
4246ca0790db        eu.gcr.io/xxxxxx/selenium-chrome    "/bin/sh -c 'rm -rf /"   4 weeks ago         Up 3 days                                     evil_mahavira
8d06f90a1a84        eu.gcr.io/xxxxxx/selenium-firefox   "/bin/sh -c 'rm -rf /"   4 weeks ago         Up 3 days                                     nauseous_torvalds
dc548f638778        eu.gcr.io/xxxxxx/selenium-hub       "/opt/bin/entry_point"   4 weeks ago         Up 3 days           0.0.0.0:32770->4444/tcp   modest_khorana

正如你所看到的,集线器和ubuntu容器都激活了端口,并从运行docker容器的ubuntu主机转发。我已经在谷歌计算引擎中打开了这些端口。

在docker容器中,我使用Google App Engine sdk在本地运行我们的项目。在使用了docker exec之后,我激活了App Engine服务器。该命令在docker容器中运行。在将来,这将是脚本的一部分,但由于这仍然是一项正在进行的工作,因此它将从容器中运行。在下面,您可以看到项目正在运行:

root@f5ac6e3c8270:/# google_appengine/dev_appserver.py --php_executable_path=/usr/bin/php5-cgi --php_gae_extension_path=appengine-php-extension/modules/gae_runtime_module.so ./xxxxxxxxxxxxxxx/
INFO     2016-08-08 12:19:49,287 sdk_update_checker.py:229] Checking for updates to the SDK.
WARNING  2016-08-08 12:19:49,532 simple_search_stub.py:1146] Could not read search indexes from /tmp/appengine.xxxxxxxxxxx.root/search_indexes
INFO     2016-08-08 12:19:49,535 api_server.py:205] Starting API server at: http://localhost:39475
WARNING  2016-08-08 12:19:51,217 inotify_file_watcher.py:196] There are too many directories in your application for changes in all of them to be monitored. You may have to restart the development server to see some changes to your files.
INFO     2016-08-08 12:19:51,218 dispatcher.py:197] Starting module "default" running at: http://localhost:8080
INFO     2016-08-08 12:19:51,220 admin_server.py:116] Starting admin server at: http://localhost:8000

问题是我无法通过8080端口访问该项目。我在Dockerfile中暴露了端口,并尝试使用-P标志和-p8080标志运行容器。这样地:

docker run -dPi xxxxx/ubuntuport:14.04

我用完全相同的命令启动了selenium hub,这个端口是可访问的。运行以下命令时:

nmap -p 4444 172.17.0.3

我得到以下输出:

Nmap scan report for 172.17.0.3
Host is up (0.00010s latency).
PORT     STATE SERVICE
4444/tcp open  krb524
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

当我在8080上运行nmap在docker容器上运行项目时,我得到这样的输出:

Nmap scan report for 172.17.0.2
Host is up (0.000085s latency).
PORT     STATE  SERVICE
8080/tcp closed http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.03 seconds

我相信问题出在ubuntu容器的Dockerfile文件中。下面你可以看到Dockerfile,它是来自ubuntu官方存储库的Dockerfile,添加了EXPOSE 8080行。

FROM scratch
ADD ubuntu-trusty-core-cloudimg-amd64-root.tar.gz /

EXPOSE 8080

# a few minor docker-specific tweaks
# see https://github.com/docker/docker/blob/9a9fc01af8fb5d98b8eec0740716226fadb3735c/contrib/mkimage/debootstrap
RUN set -xe \
    \
    && echo '#!/bin/sh' > /usr/sbin/policy-rc.d \
    && echo 'exit 101' >> /usr/sbin/policy-rc.d \
    && chmod +x /usr/sbin/policy-rc.d \
    \
    && dpkg-divert --local --rename --add /sbin/initctl \
    && cp -a /usr/sbin/policy-rc.d /sbin/initctl \
    && sed -i 's/^exit.*/exit 0/' /sbin/initctl \
    \
    && echo 'force-unsafe-io' > /etc/dpkg/dpkg.cfg.d/docker-apt-speedup \
    \
    && echo 'DPkg::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' > /etc/apt/apt.conf.d/docker-clean \
    && echo 'APT::Update::Post-Invoke { "rm -f /var/cache/apt/archives/*.deb /var/cache/apt/archives/partial/*.deb /var/cache/apt/*.bin || true"; };' >> /etc/apt/apt.conf.d/docker-clean \
    && echo 'Dir::Cache::pkgcache ""; Dir::Cache::srcpkgcache "";' >> /etc/apt/apt.conf.d/docker-clean \
    \
    && echo 'Acquire::Languages "none";' > /etc/apt/apt.conf.d/docker-no-languages \
    \
    && echo 'Acquire::GzipIndexes "true"; Acquire::CompressionTypes::Order:: "gz";' > /etc/apt/apt.conf.d/docker-gzip-indexes \
    \
    && echo 'Apt::AutoRemove::SuggestsImportant "false";' > /etc/apt/apt.conf.d/docker-autoremove-suggests

RUN rm -rf /var/lib/apt/lists/*

RUN sed -i 's/^#\s*\(deb.*universe\)$/\1/g' /etc/apt/sources.list

CMD ["/bin/bash"]

用于公开端口的命令与Selenium集线器的命令相同,只是端口号不同。我似乎不明白为什么这个港口一直关闭。任何帮助都将不胜感激。

提前谢谢

蒂恩

共有1个答案

东郭源
2023-03-14

从您的输出:0.0.0.0:32777-

如果您想在不使用随机映射的情况下共享特定端口,可以使用小写的p选项来定义它:-p8080:8080,甚至-p8888:8080将8888端口映射到容器的8080端口。

从聊天会话中可以看出,这是在容器内监听环回的应用程序。使用netstat-lnt,它显示:

tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN 

更新应用程序以绑定到0.0.0.0允许端口转发按预期工作。

 类似资料:
  • EXPOSE 声明端口 格式为 EXPOSE <端口1> [<端口2>...]。 EXPOSE 指令是声明运行时容器提供服务端口,这只是一个声明,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,

  • 我已经通过dockerfile制作了一个图像,其中我通过“暴露22”行暴露了一个端口。 “sudo docker build-t mysql_服务器。” 在那之后,我发现我不需要这个端口。 如何关闭22端口? 编辑:@Adrian Mouat@seanmcl 图像是一个mysql。所以数据库中的数据都在我名为"cliff_mysql56"的容器中。如果我重建图像并运行它,我必须将我所有的数据从这个

  • 本文向大家介绍Docker动态给容器Container暴露端口操作,包括了Docker动态给容器Container暴露端口操作的使用技巧和注意事项,需要的朋友参考一下 查看Container的IP地址 docker inspect <container name or id>| grep IPAddress 查看Container的映射的端口 用iptables查看容器映射情况 iptables

  • 问题内容: 我知道关于在Windows上运行Docker有很多问题,但是这个问题是关于在Windows上运行全新的Windows Docker。 就我而言,我使用的是Windows 10 Pro 64位。根据站点,此版本应受支持。 我一直在遵循在这里找到的教程:https : //prakhar.me/docker-curriculum/ 我也尝试按照官方指南进行操作:https : //docs

  • 问题内容: 我正在尝试使用Docker容器运行PostgreSQL服务器,并从主机上与之连接。 我的配置是: 主机:Mac OS X 10.10.5 Docker 1.10.1 我已经做到了: 第1步 :为永久Postgres数据创建一个卷 步骤2 :启动postgres实例 更新 :如注释中所建议,我在运行容器时指定了端口映射 步骤3 :通过执行以下操作连接到Docker实例: 但是我只想通过以

  • 我正在使用spring Boot2.0.4,并希望公开我的执行器endpoint。当向application.yml仅添加以下信息时,健康状况将被公开。 当我运行http://localhost:8080/acturet时,我会得到