簡體   English   中英

如何從 Docker 容器訪問和運行主機上的命令?

[英]How to access and run command on host from Docker container?

我想從 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 並獲得結果時遇到了問題。 我怎樣才能做到這一點?

Docker 的好處之一是它將進程與系統的 rest 隔離開來,但這也意味着從容器內部很難獲取有關主機操作系統的信息。

我不知道您的具體要求,但我對此的首選解決方案是:

  1. 根本不要在 Docker 容器中運行此應用程序(它的工作似乎是收集有關主機系統的信息,因此將其與主機隔離會適得其反)。

  2. 也許如果您將/proc/net作為容器內的只讀卷安裝,您可以讀取這些文件而不是執行netstat 我不確定這是否可行,並且我會擔心安全隱患,但這可能值得調查。

  3. 直接在可以執行netstat的主機上運行第二個服務,並讓這個 Flask 應用程序與該服務通信。

文檔中所述,為了在正在運行的容器中運行命令,您應該:

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

在你的情況下,它應該是這樣的:

docker exec CONTAINER netstat -ltup

如果你跑

docker exec -it CONTAINER bash

您將在容器上執行交互式 Bash shell。 如果bash不可用,可以嘗試sh代替。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM