如何从Docker容器访问并在主机上运行命令?

时间:2019-11-06 19:32:46

标签: python docker

我想从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并获得结果时遇到了问题。我该怎么办?

2 个答案:

答案 0 :(得分:1)

Docker的优点之一是它将进程与系统的其余部分隔离开来,但这也意味着从容器内部很难获得有关主机操作系统的信息。

我不知道您的具体要求,但我对此的首选解决方案是:

  1. 根本不要在Docker容器中运行此应用程序(它的工作似乎是在收集有关主机系统的信息,因此将其与主机隔离会适得其反)。

  2. 也许如果将/proc/net作为只读卷安装在容器内,则可以读取这些文件而不是执行netstat。我不确定这是否行得通,我会担心安全隐患,但值得研究。

  3. 直接在可以执行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