首页 > 解决方案 > 使用 DockerOperator 公开端口

问题描述

我正在使用DockerOperator来运行容器。但我没有看到任何发布所需端口的相关选项。触发任务时,我需要发布网络服务器端口。任何帮助或指南都会有所帮助。谢谢!

标签: dockerairflowdockeroperator

解决方案


首先,不要忘记docker_operator已弃用,(现在)替换为providers.docker.operators.docker.

其次,我不知道在实时(运行)Docker 容器中公开端口的命令。
正如Sidhartha Mani的这篇文章中所述

具体来说,我需要访问已填充的 mysql 数据库。.
我可以想到几种方法来做到这一点:

  • 停止容器并使用添加的端口暴露启动一个新容器。docker run -p 3306:3306 -p 8080:8080 -d java/server.
  • 第二个选项是启动另一个链接到此的容器,并且知道如何转发。
  • 设置 iptables 规则以将主机端口转发到容器中。

所以:

按照现有规则,我创建了自己的规则以转发到容器

iptables -t nat -D DOCKER ! -i docker0 -p tcp --dport 3306-j DNAT \
         --to-destination 172.17.0.2:3306

这只是说,每当数据包发往主机上的端口 3306 时,将其转发到 ip 172.17.0.2 及其端口 3306 的容器。

完成此操作后,我可以使用主机端口 3306 连接到容器
。我想让其他人更容易在活动容器上公开端口。
因此,我创建了一个小型存储库和一个相应的 docker 映像(名为wlan0/redirect)。

使用此命令可以实现与将主机端口 3306 暴露给容器 172.17.0.2:3306 相同的效果。
这个命令省去了学习如何使用 iptables 的麻烦。

docker run --privileged -v /proc:/host/proc \
           -e HOST_PORT=3306 -e DEST_IP=172.17.0.2 -e DEST_PORT=3306 \
           wlan0/redirect:latest

换句话说,这种解决方案不会通过 Airflow Operator 在容器中运行的命令来实现。


据我了解,DockerOperator 会创建一个新容器,那么为什么在创建新容器时无法暴露端口。

首先,EXPOSE正如我在这里提到的,这部分只是添加到图像中的元数据。这不是强制性的。
运行时 ( docker run)-p选项是关于发布,而不是公开:发布一个端口并将其映射到主机端口(见上文)或另一个容器端口。
在 Airflow 环境中可能不需要这样做,因为它有默认网络,甚至可以设置自定义网络或子网

这意味着连接到同一网络的其他(Airflow)容器应该能够访问所述网络中任何容器的端口,而无需任何-p(发布)或EXPOSE指令。


推荐阅读