止まっているコンテナを全て削除
docker system prune
コンテナ名を付ける
docker run --name <name> <image>
- 常に起動させるようなコンテナは名前をつけておく
- 共有サーバーを使うとき
- 他のプログラムを使用するとき
detached mode コンテナ起動後にdetachする(バックグランドで動かす)
docker run -d <image>
foreground mode コンテナをExit後に排除する(一回きりのコンテナ)
docker run --rm <image>
--rmをつけておくと停止後にすぐにコンテナを消してくれる
dockerfileをbuildするときにイメージに名前を付ける
docker build -t <name><directory>
-f でフィルタリングが可能
danglingはdangling imageなのかの指定をする
docker images -f dangling=true
Dockerfileがbuildコンテキストに入っていない場合は-fを使用してディレクトリを指定する
docker build -f ../Dockerfile.dev .
開発用で使うDockerfileは.devのサフィックスとする
-xでどのようなオプションがshで取れるか確認できる
sh -x
shのバッチ処理でインタラクティブな操作をしないようできる
sh <sh file> -b
Linuxコマンドマニュアル表示
man <cmd>
Docker イメージ未使用イメージ削除
docker rmi `docker images -q`
未使用ボリューム一括削除
docker volume prune
未使用ネットワーク削除
docker network prune
FROM, RUN, CMDが基本的に使用される
ベースのイメージをレイヤーとして呼び出す
好きなようなカスタマイズをしていく
RUN毎にイメージレイヤーが作られる
RUNを多様するとイメージが肥大化しやすい
RUN, COPY, ADDでレイヤーが生成される
特にRUNは多様するため気を付ける必要がある
&&でコマンドをつなげていくことで複数のコマンドを一つのRUNにまとめる(\で改行する)
cacheで使うことで追加分のみbuildすることで効率的に構築可能
追加分のコマンドは一旦分けて構築できてからRUNをまとめる
コンテナのデフォのコマンドを使用する
Dockerfileの最後に記述される
デフォで起動させるコマンドを入れると良い
- RUNはレイヤーは作る
- CMDはレイヤーを作らない
イメージレイヤーに含めたいものはRUNを使う
ホストからファイルやフォルダをコンテナに渡す
- 単純なコピーはCOPYを使う
- tarの圧縮ファイルをコピーして解凍したいときはADDを使う
- ホストで渡したいものが容量や階層が深いときに圧縮されたものをコンテナに送りたいときとか
- ENTRYPOINTはrun時に上書きされない
- ENTRYPOINTがあるとCMDはオプションを記述する形を取る
- run時に上書きできるCMD部分のみ
- コンテナをコマンドのように使いたいとき
環境変数の設定を行う
ENV <key> <value>
ENV <key>=<value>
ENV <key>=<value> <key>=<value>
RUNでcdしても必ずRootDirで実行されるためdirを変更したい場合はWORKDIRを使う
WORKDIR以降のコマンドは指定したdirで実行される
-v で指定のホストディレクトリをコンテナにマウントできる
デフォルトのコンテナはrootユーザーのためルート権限でマウントしたフォルダを操作できてしまうため気を付ける必要あり
docker run -it -v <host>:<continer dir> <image> bash
事前に作成していなくても上記コマンドで生成される
docker run -it -u $(id -u):$(id -g) -v <hostdir>:<continer dir> <image id> bash
-uでユーザー名とグループ名を指定できる
ホストとコンテナportを繋げる(パブリッシュする)
共有コンピュータ等を扱うときにコンピューターリソースを制限しないとすぐ枯渇する
- --cpus: CPU数
- --memory: メモリ容量(g->GBの単位として扱う)
docker inspect <conter id>
コンテナの情報を取得できる
docker inspect <conter id> | grep -i cpu
cpuの情報を取得できる
- Dockerレジストリを使う
- Dockerfileを送る
- Docker imageをtarにして送る
Docker imageをtarにして送るとインスタンスが外部ネットワークにつなぎに行ってビルドする必要がないためセキュアに環境を構築できる
Docker imageをtarファイルに圧縮して出力する
docker save <image id> > myimage.tar
SFTPを使ってファイルをAWSインスタンスに転送する
以下コマンドでインスタンスにsshで接続しsftpを開始する
sftp -i ~.pem username@host
get, putでファイル転送を行っていく
sftpで入った直前のローカルディレクトリからの位置となる
put local-file
get aws-file
tarで圧縮したdockerimageの解凍
docker load < myimage.tar
- nvidiaドライバーインストール
- nvidia Tesla等のエンタープライズ向けドライバ
- nvidia GTXクライアント向けドライバ
- nvidiaのドライバーインストール完了後以下コマンドでGPUにアクセスできるか確認する
nvidia-smi
- nvidia container toolkitをインストールする以下gitの手順で入れる
- https://github.com/NVIDIA/nvidia-docker
- Dockerは19.03以降のものが必要
- nvidia container toolkitインストール後に以下コマンドが実行できるか確認する
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
- GPU用にDockerfileを書き換える
- ベースはnvidia/cudaを使用する
- keras, scipy, tensorflow-gpuを入れる
docker run --gpus all -v $PWD:/work -p 8888:8888 <image id>
で実行する- kerasのmnistサンプルをコピーする
- コピーしたコードをJupyter notebookに貼り付け実行する
- GPUリソースを使っていることを確認するため
nvidia-smi -l
を別ターミナルで実行する
nvidiaドライバーとdockerfileのベースとするバージョンが合わないとdocker runでエラーが起こる可能性がある
- nvidiaドライババージョン確認
cat /proc/driver/nvidia/version
- 古いドライバ削除
sudo apt --purge remove nvidia*
- アップデート
sudo apt update
- 推奨ドライバ検索
ubuntu-drivers devices
- ドライバインストール
sudo apt install nvidia-driver-<version>
- ドライバ更新後に以下コマンドを実行してnvidia container toolkitを再度入れる
# Add the package repositories
distribution=$(. /etc/os-release;echo $ID$VERSION_ID)
curl -s -L https://nvidia.github.io/nvidia-docker/gpgkey | sudo apt-key add -
curl -s -L https://nvidia.github.io/nvidia-docker/$distribution/nvidia-docker.list | sudo tee /etc/apt/sources.list.d/nvidia-docker.list
sudo apt-get update && sudo apt-get install -y nvidia-container-toolkit
sudo systemctl restart docker
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
を実行してGPUリソースが繋がっている事を確認- GPUを使用するDockerfileをビルドし再度runする