概要
docker を使うたびに毎回ググっていて非効率的なので自分がよく使うものをまとめました。
そのうち内容を追加するかもしれないです。
本記事の任意の内容は暗黙的に (おれだったらこうする) の意を込めているので、参考にされる場合は適宜修正してもらえばと思います。
ベターな方法あるよ〜 / 間違ってるよ〜などあったら教えていただけると助かります。
前提
リモートサーバー上にコンテナを立てて中で機械学習したい。
コンテナ編
コンテナを立てる
コンテナを立てる時にすることは、
-
コンテナに名前をつける
--name $CONTAINER_NAME
-
マウントするディレクトリを指定する
-v $DIR_SERVER:$DIR_CONTAINER
- マウントするディレクトリが前、コンテナ内にマウントしたディレクトリを配置する場所が後
- ディレクトリの指定は絶対パスで行う
-
ポートを指定する
-p $PORT_SERVER:$PORT_CONTAINER
- サーバーのポートが前、コンテナのポートが後
この3つ。なお、これらの操作はコンテナを立てた後には変更できないので、変更したい場合はコンテナを作り直す必要がある。
自分のいつも使っているコマンドはこんな感じ。
docker run --runtime=nvidia -it --privileged -v /home/$USER:/home/$USER -p 6006:6006 -p 8888:8888 --name $CONTAINER_NAME $IMAGE_NAME
① ホームディレクトリをマウントしつつ、② 6006
と 8888
のポートを外と繋げる。
ポートを増やしたい or マウントするディレクトリを追加したい
前述の通り、これらの操作はコンテナを立てる時にしか実行できないので、
- 新しくイメージからコンテナを立て直す
- 現在使用しているコンテナをイメージ化して再びコンテナを立て直す
のどちらかを行う。前者は普通に docker run
でOK。
後者は docker commit
でコンテナをイメージ化して docker run
する。
docker stop $CONTAINER_NAME
docker commit $CONTAINER_NAME $IMAGE_NAME
docker run ...
コンテナに入りたい
バックエンドで起動しているコンテナに入りたい → docker attach $CONTAINER_NAME
終了しているコンテナに入りたい → docker start $CONTAINER_NAME
+ docker attach $CONTAINER_NAME
コンテナから抜けたい
バックエンドで起動したまま抜けたい → ctrl + q + p
コンテナ自体を終了させたい → exit
サーバー編
ポート設定
jupyter notebook や tensorboard をブラウザ上で使いたい場合、ローカルとリモートサーバを繋ぐ設定をする必要がある。
- ローカルのポートとサーバのポートを繋ぐ
ssh -L $PORT_LOCAL:$PORT_SERVER
- ローカルのポートが前、サーバーのポートが後
- 踏み台サーバを経由する場合は、踏み台のポートも繋ぐ
- ex)
ssh -L $PORT_ROCAL:$PORT_VIA:$PORT_SERVER
- サーバのポートとコンテナのポートを繋ぐ
docker run -p $PORT_SERVER:$PORT_CONTAINER
の2つをやればOK。
自分の場合、2. に関しては、サーバの 8888
とコンテナの 8888
を繋いだので、
- はローカルの
18888
(任意のポート番号) とサーバの8888
を繋げば、localhost:18888
でコンテナの8888
にアクセスできる。
ssh $SERVER_NAME -L 18888:8888 -L 16006:6006
ポートを複数繋げたいときは上記のように適宜 -L
オプションを増やす。