1 Востаннє редагувалося frz (21.03.2024 02:06:00)

Тема: запуск jupyter notebook всередині докера

Запускаю jupyter notebook всередині докера.

Питання - нафіга? Ну це кожен вирішує для себе, а в моєму конкретному випадку така потреба пов'язана з хитрим впн-конекшном встановленим з ресурсом REST API, до якого буду пізніше конектитися; впн прив'язаний не лише до айпіхи зовнішньої, а ще й до внутрішньої локальної айпіхи самого контейнера (якщо точніше, то до підмережі). Отже, поза межами докера на цьому хмарному інстансі я не можу віддебажити все що мені потрібно в спілкуванні з цим REST API.

Отже, по-перше, ставимо сам пакет через pip:

@reboot /usr/local/bin/python3.10 -m pip install --upgrade pip
@reboot /usr/local/bin/python3.10 -m pip install requests requests_ntlm notebook

(так, це в мене в кронтабі всередині докеру на кожен старт системи)

відкриваємо порт в docker-compose.yml:

 some-server:
    container_name: some-container
    env_file:
      - manual/.env
    build:
      context: .
      dockerfile: Dockerfile
    hostname: recommender
    restart: always
    volumes:
      - some_uploads:/opt/uploads
    ports:
      - 81:8000
      - 88:8888

# тут 88:8888 - це якраз для jupyter notebook

заходимо в папку з кодом докера і білдимо:

cd ~/docker_code_path
/usr/local/bin/docker-compose up --build -d

стартуємо jupyter notebook:

/usr/local/bin/jupyter notebook --NotebookApp.iopub_data_rate_limit=1.0e10 --ip 0.0.0.0 --no-browser --allow-root

# --NotebookApp.iopub_data_rate_limit=1.0e10 - це для того щоб можна було виводити на екран "відносно необмежено" багато print для дебаґу
# --ip 0.0.0.0 - це щоб jupyter notebook був доступний з будь-якої внутрішньої айпіхи докера, а не лише з localhost як це буває по дефолту
# --allow-root - бо всередині докеру ми по дефолту під рутом, а jupyter notebook мудрий і це не дозволяє по дефолту, тому таким чином обходимо це обмеження
# --no-browser - воно всередині докера все одно не може відкрити ніякого браузера, але з цією опцією команда запуску спрацьовує дещо швидше, бо тоді навіть не намагається ініціювати вікно браузера

Врешті, створюю ssh тунель для доступу до цього контейнера в хмарному інстансі

ssh -L 30088:internal_ip:88 user1@external_ip -C -N

# тут internal_ip - це внутрішня локальна айпішка цього інстансу в хмарі, можна дізнатися за допомогою ifconfig

Відкриваємо в браузері:

http://127.0.0.1:30088/tree

Upd: далі вирішуємо питання підключення до впн але тепер вже в пайтоні
https://replace.org.ua/post/193738/#p193738