Dockerとは (かなり意訳して説明)
Dockerとは,あるPC(ホストPC)の中に仮想環境上の機能(コンテナ)を作成する仕組みであり,自分が作りたい仮想的な機能(コンテナ)群をカスタマイズして構築する事ができる.ここで言う「自分が作りたい仮想的な機能」とは,例えばUbuntu16にCUDA8を搭載してPytorchをインストールしたマシンなどです.
仮想的な機能はイメージという形で一度作成しておけば,何度でもイメージから仮想的な機能(コンテナ)を起動して利用(コンテナ上で作業)する事ができる.
では,そんな仮想的な機能のイメージをどの様に作成するのか,その設計図に当たるのがDockerfileと言うテキストファイルになる.Dockerfileは仮想的な機能(コンテナ)にどの様なOSやパッケージ(wgetやcmake)を搭載するのか,また,どの様なファイルを格納しておくのか(ホストPCのファイルを事前にイメージにコピー)を定義する役割をもつ.
使い方の流れ
- 公開されているdockerイメージがあればそれをpullして利用する
- dockerイメージを独自に作成する場合は,DockerFileとDocker buildコマンドでdocker imageを作成する
- docker runコマンドでdocker imageからコンテナを起動する
Basic command on Docker
# check Docker info
docker info
# バージョン確認
docker --version
# イメージの取得
docker pull <Docker image>
# ex) docker pull ubuntu:18.04
# Dockerfileからイメージの作成
docker build
docker build [ -t {イメージ名} [ :{タグ名} ] ] {Dockerfileのあるディレクトリ}
# pytorchをGitHubからクローンしてビルドするケース
docker build -t pytorch -f docker/pytorch/Dockerfile .
docker build -t (tagの名前) .
# DockerコンテナのDockerイメージ化
docker commit [コンテナ名] [新規イメージ名]
# DockerイメージをDocker Hubにアップロード
docker push
# メモリ関連
docker stats [コンテナ名]
docker run --memory=60g ...
##イメージの操作
# 保有しているイメージの一覧を表示
docker images
# Dockerイメージの削除(不要になったDockerイメージの削除)
docker rmi IMAGE_ID
# 削除
docker image rm {IDもしくは image name}
# 未使用のイメージを全て削除する
docker images -aq | xargs docker rmi
##コンテナの操作
コンテナとはイメージを起動したもの
# 保有しているコンテナを確認
docker container ls -a
# DockerイメージからDockerコンテナの作成(と起動)
docker run -itd --name <container name what you like> <image name>
# --nameオプションがないとランダムなコンテナ名が付けられる
# docker run -itd --name centos1 centos /bin/bashなどとしてシェル指定できる。
# -vオプションではホストPCのディレクトリをマウントする
# docker run -v <host pc dir>:<container dir> <image name> /bin/bash
# -dはバックグラウンド。-dがないとexitするとコンテナも停止する。
# -pでポートのマッピングもできる。-p 8888:80とすると、ホストの8888をコンテナの80にマップできる。
# GPU利用可能なコンテナの起動(--gpus allのオプションを使用)
docker run --gpus all -itd --name nvidia_cuda_cont nvidia/cuda:10.0-cudnn7-devel-ubuntu16.04
# 起動中のDockerコンテナを確認
docker ps
# Dockerコンテナ上の環境に対しコマンド実行
docker exec
# ex) docker exec -it ubuntu18.04 /bin/bash
# ファイルのコピー
docker cp
# ホストからコンテナへ
docker cp tmp.txt <コンテナID>:/etc/tmp.txt
# コンテナからホストへ
docker cp <コンテナID>:/etc/tmp.txt tmp.txt
# Dockerコンテナの停止
docker stop CONTAINER_ID_or_NAMES
# コンテナ内の作業状況は保持されている
# 停止中のDockerコンテナの再スタート
docker start CONTAINER_ID_or_NAMES
# Dockerコンテナの削除
docker rm CONTAINER_ID_or_NAMES
# コンテナ内の作業状態は破棄される