Как получить доступ и запустить команду на хосте из контейнера Docker? - PullRequest
0 голосов
/ 06 ноября 2019

Я хочу получить доступ к своему хосту bash из контейнера Docker и запустить там 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 ]

1 голос
/ 07 ноября 2019

Одним из преимуществ Docker является то, что он изолирует процесс от остальной системы, но это также означает, что изнутри контейнера может быть сложно получить информацию об операционной системе хоста.

IЯ не знаю ваших конкретных требований, но мои предпочтительные решения для этого по порядку были бы:

  1. Не запускать это приложение в контейнере Docker вообще (его работа, кажется, собираетинформация о хост-системе, поэтому ее изоляция от хоста неэффективна).

  2. Возможно, если вы смонтируете /proc/net как том только для чтения внутри контейнера, вы можете прочитатьэти файлы вместо выполнения netstat. Я не знаю наверняка, сработает ли это, и я буду беспокоиться о последствиях для безопасности, но это может стоить расследования.

  3. Запустите секунду Служба непосредственно на хосте, который может выполнять netstat, и заставить это приложение Flask взаимодействовать с этой службой.

0 голосов
/ 06 ноября 2019

Как указано в документах , чтобы запустить команду в работающем контейнере, вы должны:

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

В вашем случае это должнобыть примерно таким:

docker exec CONTAINER netstat -ltup

Если вы запустите

docker exec -it CONTAINER bash

Вы запустите интерактивную оболочку Bash для контейнера. Если bash недоступен, вы можете попробовать sh.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...