Тема: запуск 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