fuzzy study

仕事・趣味で勉強したことのメモ

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で作りたい環境のもとになるイメージを探す。

nvidiaのCUDA関連インストール済みのイメージはココ

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

参考にしたページ

UbuntuにDocker CEをインストールする

Docker 初心者 | ssh で接続できるサーバーを立てる

Ubuntuユーザ追加とsudo権限付与。ユーザ/グループ操作まとめ | WWWクリエイターズ

dockerイメージのリポジトリ名とタグを設定する - Taker's インフラ関連技術調査ログ