dockerの基本的な使い方
docker、以前から個人的な勉強はしていたけど、初めて仕事で(検証用環境だけど)使って、なんとなく勝手がわかったので今後のためにメモしておく。
インストール
Dockerのコミュニティエディション、docker-ceをインストールする。
詳細手順ははググる。
なおGPUを使いたい場合は、nvidia-dockerなるものを入れると、ホストOSにGPUドライバだけ入れておけば、dockerイメージ上からGPUを認識できるらしい。
docker run --runtime=nvidia --rm nvidia/cuda nvidia-smi
のように--runtimeオプションを付けて動かすことになるみたいなんだが仕組みはよくわかってない。
詳細は下記ページ参照。
GitHub - NVIDIA/nvidia-docker: Build and run Docker containers leveraging NVIDIA GPUs
構築
docker hubで作りたい環境のもとになるイメージを探す。
pullで落とす。
docker pull [IMAGE NAME]
imageの一覧表示はdocker images
IMAGE NAMEについて
ユーザ名/イメージ名:タグ で表される。
タグを省略するとlatestとしたのと同義となる。
実行する
とりあえず構築作業を手でやるなら
docker run -it [IMAGE NAME] /bin/bash
Dockerfile使うのがベストだろうけどまだまともに使ったことない。
実行中のコンテナ一覧はdocker ps
停止中も含める場合はdocker ps -a
/bin/bashを実行したコンテナでexitをするとコンテナの実行は終了する。(停止する)
停止させないでホストのシェルに戻るにはCtrl-p Ctrl-qとする。
そのあと実行中のコンテナに入るには、
docker attach [CONTAINER ID]
作業の区切りで、コンテナを停止するときは
docker stop [CONTAINER ID]
停止した時点のコンテナをローカルリポジトリに登録するときは
docker commit [CONTAINER ID] [IMAGE NAME]:[TAG]
コミットするとき、TAGを指定しないとデフォルトでlatestになる。
コミット後のイメージにタグ付与もできる。
docker tag [IMAGE ID] [IMAGE NAME]:[TAG]
同じ名前のイメージにコミットすると、上書きになる。
普段の使い方としては、
docker commit
でコミットするときはタグをつけないでlatestとしておく- 特定のポイントで
docker tag
でタグつけていく
というのがわかりやすそう。
stopしたコンテナはstartで起動。
docker start [CONTAINER ID]
SSH接続できるイメージにする
※今回は検証環境で、同一の環境を複数立ち上げて複数人で使うことをなるべく短時間でやりたかったので、コンテナをSSH接続できるようにして複数実行するという方法を採った。
しかし本番環境などしっかりした用途ではコンテナでSSHを起動するのはバッドノウハウになりがちなので注意する。
参考:Dockerコンテナ内でsshdを実行してはいけない理由 | POSTD
以下、ubuntuの場合。
openssh-serverをインストール。
sudo apt-get install -y openssh-server
ユーザ作成してパスワード設定する。
sudo adduser [USER NAME]
ubuntuなら、sudoグループにいれる。
sudo gpasswd -a [USER NAME] sudo
dockerコンテナだとsudoコマンドがインストールされていない場合があるので、入れておく。
sudo apt-get install -y sudo
実行するときはポートマッピングと、バックグラウンドで/usr/sbin/sshdを実行するようにする。
docker run -d nane -p 22:[PORT] /usr/sbin/sshd -D
接続の時はポート指定で。
ssh [USER NAME]@[dockerコンテナのIP] -p [PORT]
ほか
構築中とかに資材移動のためにホストのディレクトリを共有したいときは、-vオプションでマウントする。
docker run [IMAGE NAME] -v /mnt/docker:/mnt/host
参考にしたページ
Docker 初心者 | ssh で接続できるサーバーを立てる