我想从Docker容器访问我的主机bash并在其中运行 netstat ,然后获取netstat的结果,并使用Python / Flask将其呈现为HTML页面。这是一个没有docker容器的情况下我如何做到的例子。
from flask import Flask, render_template
app = Flask(__name__)
def get_ports_data():
import subprocess
p = subprocess.Popen(['netstat', '-ltup'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
data = stdout.decode().split('\n')
return data
@app.route('/')
def index():
return render_template('index.html', portsdata=get_ports_data())
if __name__ == '__main__':
app.run(debug=True,host='0.0.0.0')
它很好用,但是当我将它作为docker容器运行时,我在访问主机以运行netstat并获得结果时遇到了问题。我该怎么办?
答案 0 :(得分:1)
Docker的优点之一是它将进程与系统的其余部分隔离开来,但这也意味着从容器内部很难获得有关主机操作系统的信息。
我不知道您的具体要求,但我对此的首选解决方案是:
根本不要在Docker容器中运行此应用程序(它的工作似乎是在收集有关主机系统的信息,因此将其与主机隔离会适得其反)。
也许如果将/proc/net
作为只读卷安装在容器内,则可以读取这些文件而不是执行netstat
。我不确定这是否行得通,我会担心安全隐患,但值得研究。
直接在可以执行netstat
的主机上运行 second 服务,并使该Flask应用与该服务通信。
答案 1 :(得分:0)
如docs中所述,要在运行容器中运行命令,您应该:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
您的情况应该是这样的:
docker exec CONTAINER netstat -ltup
如果您运行
docker exec -it CONTAINER bash
您将在容器上执行交互式Bash Shell。如果bash
不可用,则可以尝试使用sh
。