2025/05/04 Updated by 
Docker Image を自作する (6)
PyTorch23.07 + sshd + jupyter
[Up]

このページ内での表記:
「ホストOSの対話環境」は背景色を黄色(lightyellow)で表す。
「Conainer 内の root 権限の対話環境」は背景色を水色(azure)であらわす。
「Conainer 内の一般ユーザ権限の対話環境」は背景色を赤色(#ffeeee)であらわす。
「他のPCの対話環境」は紫色(#eeeeff)で表す。
目的
前提条件
- nVidia のGPU を装備した Windows 11 マシンに、
Docker on Windows (GPU) の手順で
Docker Desktop がインストールされている。
-
Docker Host (= Windows) の Ubuntu (WSL2) から
docker コマンドが実行できる。
Python, PyTorch, TensorFlow のバージョンについての検討事項
- 公式の github の README.md の python インストールの記述を見ると、
Python 3.10
を想定しているようだ。
ゼロから学ぶLLM/設定/01_オプションのPythonセットアップ設定/
https://github.com/rasbt/LLMs-from-scratch/tree/main/setup/01_optional-python-setup-preferences"

- 公式の github からソースコードをダウンロードする。
| 公式コードをダウンロードする |
$ git clone https://github.com/rasbt/LLMs-from-scratch.git
Cloning into 'LLMs-from-scratch'...
remote: Enumerating objects: 7575, done.
remote: Counting objects: 100% (50/50), done.
remote: Compressing objects: 100% (38/38), done.
remote: Total 7575 (delta 18), reused 19 (delta 12), pack-reused 7525 (from 3)
Receiving objects: 100% (7575/7575), 15.12 MiB | 15.19 MiB/s, done.
Resolving deltas: 100% (4281/4281), done.
$ ls LLMs-from-scratch
appendix-A appendix-D ch02 ch05 CITATION.cff pkg reasoning-from-scratch
appendix-B appendix-E ch03 ch06 LICENSE.txt pyproject.toml requirements.txt
appendix-C ch01 ch04 ch07 pixi.toml README.md setup
|
- ソースコードの中の requirements.txt に、実行に必要なパッケージが記述されている。
| LLMs-from-scratch/requirements.txt |
torch>=2.2.2,<2.6; sys_platform == 'darwin' and platform_machine == 'x86_64' # Intel macOS
torch >= 2.2.2; sys_platform != 'darwin' or platform_machine != 'x86_64' # all chapters
jupyterlab >= 4.0 # all
tiktoken >= 0.5.1 # ch02; ch04; ch05
matplotlib >= 3.7.1 # ch04; ch06; ch07
tensorflow>=2.16.2; sys_platform == 'darwin' and platform_machine == 'x86_64' # Intel macOS
tensorflow >= 2.18.0; sys_platform != 'darwin' or platform_machine != 'x86_64' # ch05; ch06; ch07
tqdm >= 4.66.1 # ch05; ch07
numpy >= 1.26 # dependency of several other libraries like torch and pandas
pandas >= 2.2.1 # ch06
psutil >= 5.9.5 # ch07; already installed automatically as dependency of torch
|
- PyTroch のバージョンは 2.2.2 以上 2.6 未満。
- TensorFlow のバージョンは 2.16.2 以上または 2.18.0 以上。
nVidia GPU (CUDA) に対応した Docker Image を探す: PyTorch
- PyTorch 2.2.2 を使うことにする。
- PyTorch のバージョンと CUDA の関係を調べる。
PyTorch の公式ドキュメント
Install previous versions of PyTorch
を見ると、PyTorch 2.2.2 には、
CUDA 11.8 または CUDA 12.1
が対応しているようだ。
| Install previous versions of PyTorch |
v2.2.2
Conda
OSX
# conda
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 -c pytorch
Linux and Windows
# CUDA 11.8
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=11.8 -c pytorch -c nvidia
# CUDA 12.1
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 pytorch-cuda=12.1 -c pytorch -c nvidia
# CPU Only
conda install pytorch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 cpuonly -c pytorch
Wheel
OSX
pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2
Linux and Windows
# ROCM 5.7 (Linux only)
pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/rocm5.7
# CUDA 11.8
pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu118
# CUDA 12.1
pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cu121
# CPU only
pip install torch==2.2.2 torchvision==0.17.2 torchaudio==2.2.2 --index-url https://download.pytorch.org/whl/cpu
|
- nVidia が公開している PyTorch Docker Image を調べる。
NVIDIA Optimized Frameworks: PyTorch Release Notes
- Python 3.10 を採用しているのは PyTorch:23.05-24.10
- CUDA 12.1 を採用しているのは PyTorch:23.03-23.07
- 両者の AND 集合は PyTorch:23.05, 23.06, 23.07
- Docker Image のベースとして PyTorch:23.07 を採用する。詳細な仕様は以下の通り。
https://catalog.ngc.nvidia.com/orgs/nvidia/containers/pytorch/tags?version=25.09-py3
PyTorch Release 23.07
Ubuntu 22.04 including Python 3.10
NVIDIA CUDA® 12.1.1
NVIDIA cuBLAS 12.1.3.1
NVIDIA cuDNN 8.9.3
NVIDIA NCCL 2.18.3
NVIDIA RAPIDS™ 23.06
Apex
rdma-core 39.0
NVIDIA HPC-X 2.15
OpenMPI 4.1.4+
GDRCopy 2.3
TensorBoard 2.9.0
Nsight Compute 2023.1.1.4
Nsight Systems 2023.2.3.1001
NVIDIA TensorRT™ 8.6.1.6
Torch-TensorRT 1.5.0.dev0
NVIDIA DALI® 1.27.0
MAGMA 2.6.2
JupyterLab 2.3.2 including Jupyter-TensorBoard
TransformerEngine 0.10.0+96ed6fc
PyTorch quantization wheel 2.1.2
Container Ubuntu CUDA PyTorch TensorRT
version Toolkit
--------- -------- ------- --------------- --------
23.07 22.04 12.1.1 2.1.0a0+b5021ba TensorRT 8.6.1.6
(参考) nVidia GPU (CUDA) に対応した Docker Image を探す: TensorFlow
TensorFlow Release 23.07
Ubuntu 22.04
Note:
The 23.07-tf2-py3 container image contains Python 3.10.6.
NVIDIA CUDA® 12.1.1
NVIDIA cuBLAS 12.1.3.1
cuTENSOR 1.7.0.1
NVIDIA cuDNN 8.9.3
NVIDIA NCCL 2.18.3
NVIDIA DALI® 1.27.0
NVIDIA RAPIDS™ 23.06
Horovod 0.28.1
OpenMPI 4.1.4+
OpenUCX 1.15.0
SHARP 3.0.2
GDRCopy 2.3
NVIDIA HPC-X 2.15
TensorBoard2.12.0
rdma-core 39.0
NVIDIA TensorRT™ 8.6.1.6
TensorFlow-TensorRT (TF-TRT)
Nsight Compute 2023.1.1.4
Nsight Systems 2023.2.3.1001
JupyterLab 2.3.2 including Jupyter-TensorBoard
Container Ubuntu CUDA TensorFlow TensorRT
version Toolkit
--------- -------- ------- --------------- --------
23.07 22.04 12.1.1 2.12.0 TensorRT 8.6.1.6
「つくって学ぶ!LLM自作入門」が動作する Docker Image (GPU 版) を作成する
方針
- NVIDIA PyTorch Container 23.07 をベースに用いて docker image を生成する。
- ssh サーバ (sshd) を自動起動する。
- サーバの自動起動には supervisord を用いる。
- Container の初回起動時に、SSH のポート番号を設定する。(SSHD_PORT 変数, デフォルト値: 22)
- Container の初回起動時に、新規ユーザを作成する。(デフォルト値: geust)
- Container の初回起動時にコマンドが与えられた場合は、フォアグラウンドで実行する。
- 生成する Docker Image 名は llm_diy_torch2307
作成手順
- Windows11 上の Ubuntu-20.04 (WSL) を使って作業を進める。
Windows において WSL のファイルシステムは \\wsl$\Ubuntu-20.04\home\nitta にあることに注意すること。
Ubuntu-20.04 から、Windows11 のホームディレクトリは /mnt/c/User/nitta/ として見える。
- 作業用フォルダを作成する
$ cd /mnt/c/Users/nitta/Documents/docker
$ mkdir -p llm_diy_torch2307
- 作業用フォルダの中に Dockerfile を作成する。
- Dockerfile中の パスワード の部分は、推測されにくい文字列に必ず変更すること。
- Dockerfile 中の Run 命令は docker image を build する時に実行されるので、変数を使っていても build時の値で固定される。
- Container の初回起動時に変数の値を変更したいコマンド(たとえば、SSHD_PORT )は、ENTRYPOINT で呼び出すシェルスクリプトの中で実行する。
- OpenSSH サーバをインストールする。
- supervisor サーバをインストールする。これはContainer を起動するたびに他のサーバを自動起動する役目を担う。
| Dockerfile |
# ゲストOS: Ubuntu 22.04 LTS
FROM nvcr.io/nvidia/pytorch:23.07-py3
# Change Your Own UNAME, UID, GID, PASS
ENV UNAME=guest
ENV UID=3000
ENV GID=3000
ENV PASS=password
ENV SSHD_PORT=22
# 必要なパッケージのインストール
RUN apt-get update && \
DEBIAN_FRONTEND=noninteractive apt-get install -y \
sudo \
bash \
openssh-server \
supervisor \
&& rm -rf /var/lib/apt/lists/*
# SSH 設定: パスワード認証を有効化
RUN sed -i 's/#PasswordAuthentication yes/PasswordAuthentication yes/' /etc/ssh/sshd_config && \
sed -i "s/^#Port.*/Port ${SSHD_PORT}/" /etc/ssh/sshd_config && \
mkdir /var/run/sshd
# supervisord の設定ファイルを設置する (Daemon 起動用)
RUN mkdir -p /var/log/supervisor
COPY supervisord.conf /etc/supervisor/conf.d/supervisord.conf
# "Build a LLM from scratch"
WORKDIR /app
# RUN git clone https://github.com/rasbt/LLMs-from-scratch.git
COPY LLMs-from-scratch/requirements.txt /app/LLMs-from-scratch/
WORKDIR /app/LLMs-from-scratch
RUN pip install --no-cache -r requirements.txt
# ポート開放
EXPOSE 22
# Copy Shell Script "entrypoint.sh"
COPY entrypoint.sh /entrypoint.sh
RUN chmod +x /entrypoint.sh
######
ENTRYPOINT ["/entrypoint.sh"]
CMD []
|
- 作業用フォルダの中に entrypoint.sh を作成する
- Contaienr の初回起動時に、SSHサーバの待ち受けポート番号を設定する。
- Container が起動されるたびに supervisor デーモンを起動する。SSHサーバの起動は supervisor が行う。
| entrypoint.sh |
#!/bin/bash
set -e
if [ ! -f /var/app/.initialized ]; then
######## First Time ########
echo "First run. Setting up ..."
mkdir -p /var/app
touch /var/app/.initialized
# ユーザーが存在しない場合のみ作成する
if id "${UNAME}" &>/dev/null; then
echo "User ${UNAME} already exists. Skipping creation."
else
# 同名グループが無ければ作成する
if ! getent group "${UNAME}" &>/dev/null; then
echo "Creating group ${UNAME} with GID=${GID}"
groupadd -g ${GID} ${UNAME}
else
echo "Group ${UNAME} already exists. Skipping group creation."
fi
echo "Creating user ${UNAME} with UID=${UID}, GID=${GID}"
useradd -m -u ${UID} -g ${GID} -s /bin/bash ${UNAME}
echo "${UNAME}:${PASS}" | chpasswd
usermod -aG sudo ${UNAME}
fi
# ホームディレクトリの Owner が root:root になることがあるので明示的に変更する。
chown -v ${UNAME}:${UNAME} /home/${UNAME}
# SSHD のポート番号を変更する
sed -i "s/^Port.*/Port ${SSHD_PORT}/" /etc/ssh/sshd_config
else
######## Second Time or Later ########
echo "Starting for the second time or later ..."
fi
# supervisord start (background)
/usr/bin/supervisord -c /etc/supervisor/supervisord.conf &
# Execute Commands in CMD
if [ "$#" -gt 0 ]; then
exec "$@"
else
echo "No command provided. Starting bash ..."
exec bash
fi
|
- 作業用フォルダの中に supervisord.conf を作成する
- supervisord の設定ファイルは /etc/supervisor/supervisord.conf にあり、追加の設定は /etc/supervisor/conf.d/*.conf で
記述するように設定する。
- sshd のログをとるために sshd に -e オプションをつけて起動して、sshdプロセスの標準出力にログを出力させる。
- 標準出力と標準エラー出力をそれぞれ /var/log/sshd_std{out,err}.log というファイルに記録する。
| supervisord.conf |
# supervisord の設定ファイル
[supervisord]
nodaemon=true
# sshd を起動する
[program:sshd]
command=/usr/sbin/sshd -D -e
autostart=true
autorestart=true
stdout_logfile=/var/log/sshd_stdout.log
stderr_logfile=/var/log/sshd_stderr.log
|
- 上記で作成したファイルを以下のように配置する。llm_diy_torch2307.zip
llm_diy_torch2307/
|
+-- Dockerfile
|
+-- entrypoint.sh
|
+-- supervisord.conf
|
+-- LLMs-from-scratch/
|
+-- requirements.txt
- Image を build する。
$ docker build -t llm_diy_torch2307 .
...
成功
- 生成した Image を確認する
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
llm_diy_torch2307 latest 122a76367d82 8 hours ago 29GB
...
- (注意) 上で用意した supervisod.conf は、Container の
/etc/supervisor/conf.d/supervisord.conf
というパスにコピーしている。
supervisord を起動するときに設定ファイルとして指定しているのは、標準でインストールされる
/etc/supervisor/supervisord.conf
である。このファイルには /etc/supervisor/conf.d/*.conf をインクルードするように記述されている。
| [参考] 標準の /etc/supervisor/supervisord.conf |
; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock ; (the path to the socket file)
chmod=0700 ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL for a unix socket
; The [include] section can just contain the "files" setting. This
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves.
[include]
files = /etc/supervisor/conf.d/*.conf
|
Container 用の永続的なファイルシステムを作成する
コンテナに永続的なファイルシステムを提供するために、1777 のパーミッションでフォルダを作っておく。
skicky bit が on (1777) のフォルダには、
「誰でもファイルを作成できるが、作成した本人だけがファイルを変更したり消したりできる」
という特徴がある。
$ sudo mkdir -p /home/docker
← ディレクトリを作成する
$ sudo chmod 1777 /home/docker
← 誰でもファイルを作成できるが、作成した本人にしか消去できないモードに設定する
$ ls -ld /home/docker
← ディレクトリのsticky bit が on になっていることを確認する。
drwxrwxrwt 3 root root 4096 4月 26 15:47 /home/docker
Docker Container を生成する
Image llm_diy_torch2307
のデフォルトのユーザ情報とSSHサーバ情報を用いて、
新しい Container
llmdiy_01
を生成する。
- Image から Container を生成して起動する。ユーザ情報はデフォルト値 (guest) を利用する。
Container のファイルシステム内にホストOSのディレクトリをマウントする。
Container を起動するたびに、sshd サーバが起動される。
$ docker run --name llmdiy_01 \
--shm-size=1g --ulimit memlock=-1 --ulimit stack=67108864 --gpus all \
--restart always \
-p 7076:22 -p 8086:8888 \
-v /home/docker/llmdiy_01:/mnt/hostos \
-it llm_diy_torch2307
起動オプション
- --name: 生成する Container の名前は llmdiy_01
- --restart always: docker が起動すると、このコンテナも自動起動する。
- -p: ホストOSのポートへのアクセスを、Container のポートにフォワーディングする。
| ポート番号 |
| ホストOS | ゲストOS |
| 7076 | 22 |
| 8086 | 8888 |
- -v: ホストOSの /home/docker/llmdiy_01 が Container の /mnt/hostos としてマウントされる。
| マウントポイント |
| ホストOS | ゲストOS |
| /home/docker/llmdiy_01 | /mnt/hostos |
- -it: 対話モード。ホストOSの端末をそのまま、Container 内の bash との対話環境として使う。
- 使用する Docker Image は llm_diy_torch2307
- Container を起動した対話環境が、そのまま Container 内で動作する bash との対話環境になる。root権限でloginした状態である。
First run. Setting up ... ← 生成された Container 内で entrypoint.sh が実行される
Creating group guest with GID=3000
Creating user guest with UID=3000, GID=3000
ownership of '/home/guest' retained as guest:guest
No command provided. Starting bash ...
root@af401d3cdf85:/# 2025-05-11 09:32:40,710 CRIT Supervisor is running as root. Privileges were not dropped because no user is specified in the config file. \
If you intend to run as root, you can set user=root in the config file to avoid this message.
2025-05-11 09:32:40,711 INFO supervisord started with pid 38
2025-05-11 09:32:41,715 INFO spawned: 'sshd' with pid 41
2025-05-11 09:32:42,717 INFO success: sshd entered RUNNING state, process has stayed up for > than 1 seconds (startsecs)
# ← Container 内の対話環境 (root権限の bash) が動く
- (重要) (Container 内で) 直ちに新規ユーザ guest のパスワードを変更する。
$ passwd guest
New password: ← 新しいパスワード を入力する。
Retype new password: ← もう一度新しいパスワード を入力する。
passwd: password updated successfully
- (Container 内で) ホストOSのマウントポイントを調べる。
# ls -ld /mnt/hostos
drwxr-xr-x 2 root root 4096 May 11 09:32 /mnt/hostos
- (Container 内で) 新規ユーザのホームディレクトリを調べる。
# ls -ld /home/guest
drwxr-x--- 2 guest guest 4096 May 11 09:32 /home/guest
# ls -la /home/guest
total 20
drwxr-x--- 2 guest guest 4096 May 11 09:32 .
drwxr-xr-x 1 root root 4096 May 11 09:32 ..
-rw-r--r-- 1 guest guest 220 Mar 31 2024 .bash_logout
-rw-r--r-- 1 guest guest 3771 Mar 31 2024 .bashrc
-rw-r--r-- 1 guest guest 807 Mar 31 2024 .profile
- (Container 内で) Control-P と Control-Q を順にタイプして、ホストOSの対話環境に戻る。
Container 内のシェルは動作したままとなる。
# ^p ^q ← Container の対話環境を抜ける
$ ← ホストOS 内の対話環境に戻る
- (ホストOS上) Container からマウントされているホストOSのディレクトリを調べる。
$ ls -ld /home/docker/llmdiy_01
drwxr-xr-x 2 root root 4096 Nov 3 09:00 /home/docker/llmdiy_01
- (ホストOS上) docker 上の実行中の container の状態を調べる
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ef13be3f778 llm_diy_torch2307 "/entrypoint.sh" 10 hours ago Up 10 hours 0.0.0.0:7076->22/tcp, llmdiy_01
[::]:7076->22/tcp,
0.0.0.0:8086->8888/tcp,
[::]:8086->8888/tcp,
[::]:8086->8888/tcp
...
- (ホストOS上) docker 上のすべての(停止中を含む) container の状態を調べる
$ docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2ef13be3f778 llm_diy_torch2307 "/entrypoint.sh" 10 hours ago Up 10 hours 0.0.0.0:7076->22/tcp, llmdiy_01
[::]:7076->22/tcp,
0.0.0.0:8086->8888/tcp,
[::]:8086->8888/tcp,
[::]:8086->8888/tcp
...
- (ホストOS上) docker 上の Image の一覧を表示する。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
llm_diy_torch2307 latest ae6c6c06ccf1 10 hours ago 29GB
torch2302_sshd latest 642c2e1fae87 3 weeks ago 20.6GB
nvcr.io/nvidia/pytorch 23.07-py3 bd784c42fdf0 2 years ago 19.8GB
nvcr.io/nvidia/pytorch 23.02-py3 7c3375e220ea 2 years ago 20.5GB
Docker Host から ssh を用いてContainer 内の対話環境にアクセスする
- ホストOSから、Continer の guest ユーザのアカウントに ssh でアクセスする。
- localhost からのアクセスはファイアウォールの干渉を受けないので、
ファイアウォールが動作していてもアクセス可能である。
- Container 作成時の -p 7076:22 オプションの指定により、
ホストOSの 7076 番ポートへのアクセスは Container の 22 番ポートにポートフォワーディングされる。
$
ssh -p 7076 guest@localhost
← ホストOSの 7076 番ポートに sshアクセスする
The authenticity of host '[localhost]:7076 ([127.0.0.1]:7076)' can't be established.
ECDSA key fingerprint is SHA256:l7tsXhvQOaz9nn7Aa2JuAyjHN5QTVrxlywRxklHDixA.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[localhost]:7076' (ECDSA) to the list of known hosts
guest@localhost's password:
← パスワードを入力する。エコーバックされない。Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-25-generic x86_64).
...
$ ← Container 内の guest 権限の対話環境が開始する
- (Container 内の guest 権限で) ユーザ名を表示する。
$ whoami
guest
- (Container 内の guest 権限で) ホームディレクトリを表示する。
$ pwd
/home/guest
- (Container 内の guest 権限で) ホームディレクトリにあるファイルの一覧を表示する。
$ ls -la
total 24
drwxr-x--- 3 guest guest 4096 Nov 3 01:08 .
drwxr-xr-x 1 root root 4096 Nov 3 01:04 ..
-rw-r--r-- 1 guest guest 220 Jan 6 2022 .bash_logout
-rw-r--r-- 1 guest guest 3771 Jan 6 2022 .bashrc
drwx------ 2 guest guest 4096 Nov 3 01:07 .cache
-rw-r--r-- 1 guest guest 807 Jan 6 2022 .profile
-rw-r--r-- 1 guest guest 0 Nov 3 01:08 .sudo_as_admin_successful
- (Container 内の guest 権限で) ssh 経由の対話環境を終了する。
guest@af401d3cdf85:~$ exit

logout
Connection to localhost closed.
$
他のPCからネットワーク経由で Container 内の対話環境にアクセスする
- (ホストOS上) 外部のPCからネットワーク経由で Container にアクセスするためには、ホストOSの 7076 番ポートを開けておく必要がある。
Docker の公式文書では、「docker のポートフォワーディングは ufw のフィルタリングよりも前に行わるために、ufw の影響を受けない」
と記述されている (2025年春時点) が、これは現時点では間違いのようだ。
Containerに外部からアクセスするためには、ホストOSのポートを開けておく必要がある。
Windows 11 の場合:
「設定」→「ネットワークとインターネット」→「ネットワークの詳細設定」→「Windows ファイアウォール」→ 詳細設定
- ssh 用のポートを開ける。
ローカルコンピューターのセキュリティ
→ 受信の規則
→ 新しい規則
→ 規則の種類「ポート」 → 次へ
→ プロトコルおよびポート → TCP → 特定のローカルポート → 7070-7079 → 次へ
→ 操作「接続を許可する」→ 次へ
→ プロファイル: ドメイン、プライベート、パブリックのすべてをチェックする
→ 名前: docker ssh → 完了
- WWWサーバ (jupyter) 用のポートを開ける
上と同様で → ... →
→ プロトコルおよびポート → TCP → 特定のローカルポート → 8080-8089 → 次へ → ...
→ 名前: docker http → 完了

Ubuntu 24.04LTS の場合:
ufw を用いる
- (ホストOS上) ファイアウォール ufw を有効化する。(既に有効化してあれば必要なし)
$ sudo apt update
← aptのデータベースを更新する
$ sudo apt install -y ufw
← ufw をインストールする。
$ sudo systemctl enable ufw
← ufw を有効化する
$ sudo systemctl restart ufw
← ufw を再起動する
- (ホストOS上) ホストOSの 7076 番ポートを開放する。
$ sudo ufw allow 7076
← 7076 番ポートを開放する
ルールを追加しました
ルールを追加しました (v6)
- (ホストOS上) ファイアウォールの状態を確認する。
$ sudo ufw status 7076
← 7076 番ポートを開放する
...
状態: アクティブ
To Action From
-- ------ ----
...
7076 ALLOW Anywhere
...
7076 (v6) ALLOW Anywhere (v6)
...
- (ネットワーク上の他のPC) 他のマシンから、ホストOS上の Container に ssh 接続する。
以下は、ホストOSの IPアドレスが 192.168.12.10 の場合の、ssh アクセスの様子である。
(他のPCから)
$
ssh -p 7076 guest@192.168.12.10
guest@192.168.12.10's password:
← パスワードを入力する。エコーバックされない。
Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-25-generic x86_64)
...
guest $
whoami
← Container に
guest 権限でアクセスできる
guest
guest $
exit
logout
Connection to 192.168.12.10 closed.
$
Container が再起動すると sshd も自動起動されることを確認する
- (ホストOS上で) Container を停止する
$ docker container stop llmdiy_01
- (ホストOS上で) Container が停止されたことを確認する
$ docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- (ホストOS上で) 停止中の Container を起動する
$ docker start llmdiy_01
- (ホストOS上で) Container に ssh でアクセスして、sshd が自動的に起動していることを確認する。
$
ssh -p 7076 guest@localhost
← ホストOSの 7076 番ポートに sshアクセスする
guest@localhost's password:
← パスワードを入力する。エコーバックされない。Welcome to Ubuntu 24.04.2 LTS (GNU/Linux 6.11.0-25-generic x86_64)
...
$ ← Container 内の guest 権限の対話環境が開始する
「つくって学ぶ!LLM自作」入門のソースコードを使って jupyter サーバを動作させる。
- guest ユーザとして ssh 接続する。
- github からそーそコードをダウンロードする。
$ git clone https://github.com/rasbt/LLMs-from-scratch.git
- ./LLMs-from-scratch/ フォルダに移動してから、jupyter lab を起動する。
$ cd LLMs-from-scratch
$ jupyter lab --allow-root --ip=0.0.0.0 --no-browser
- 他のマシンからアクセスするには "--ip=0.0.0.0" の指定が必要。
- rootユーザとして jupyter を起動するには --allow-root が必要。今は guest ユーザ権限で起動しているので必要ない。
- 表示される URL の中の "token=..." を記憶する。
- 動作中の jupyter notebook の token を知るには、同じマシンの別のシェルで以下のコマンドを実行する。
$ jupyter lab list
外部のマシンからブラウザで jupyter サーバに接続する。
- ローカルネット内のリモートマシンからアクセスする。
http://192.168.12.10:8086/lab?token=...
- インターネット上のリモートマシンからアクセスする場合の URL:
http://ynitta.net:18086/lab?token=...
(ルータで 18086 番ポートを 192.168.12.10:8086 にポートフォワーディングしている場合)