#はじめに
- 自己紹介:UbuntuでPythonを書いてデータ分析とか異常検知してます
- CUDAのバージョン管理のためにDockerをやろうと思った
- 専門用語が多すぎて脳が混乱したので用語集を作った
- これからDockerを始めたいけどガチで何もわからないという人向けにまとめた
- PCで見てほしい(スマホQiita勢、いるのか…?)
#Dockerことはじめ
- いろんな仮想環境構築が簡単にできて嬉しいシステム
- 仮想環境とは:好きなOS+好きなソフトと思っとけばOK
- 今までの仮想化(ホストOS型仮想化)の悪いところ
- 仮想環境がホストOSや仮想化ソフトウェアのバージョンに依存してしまう
- DockerはホストPCの中に全く別のPCを用意する様なものなのでホストの環境に依存しない
- つまり、いつ誰が使っても同じ結果になる=これを「冪等性」という
- 冪等性がなくてつらいことになる例
- web系の人:開発環境と本番環境が違って動かない
- 機械学習の人:CUDAとかミドルウェアのバージョン管理が死ぬほどめんどくさい - 動作がもっさり、ファイル容量が大きいので共有が大変
- Dockerは仮想環境(Container)の型(Image)を保存・配布する方式なので、管理や共有が楽
#Docker運用の流れ
- ホストPCにDockerをインストール
- Dockerfileを書く
- Dockerfileを元に、Docker Imageを作る(build)
- Docker Imageを元に、Docker Containerを作り、仮想環境を有効にする(run)
- 仮想環境内でなんやかんや好きなことをする
- 終わったらContainerを停止させ(stop)、削除する(rm)
- 「この前と同じ仮想環境作りたいな〜」と思ったら、同じImageを元にContainerを作る(run)
- Tips
- Imageは基本的に削除しないけど、もう使わないものがあまりに増え過ぎたら消してOK
- Docker HubというGithub的なリポジトリから既存のImageをダウンロードできる(pull)
#用語集(超基礎)
- Dockerfile
- 拡張子のないテキストファイル。
DSLというDocker用言語を使って「どんな仮想環境を作りたいか」を書くもの - 「DSL」はDomain Specific Language(あるドメインに特化した固有言語)という意味でした。すみません(2020/2/13追記)
-
DSL言語Dockerfileで使うコマンドの例
- FROM:どのOSやミドルウェアの環境を作るか
- RUN:Imageを作る時に、どういうコマンドを実行するか
- COPY:どのファイルをホストPCからコンテナに移動させるか - Docker Image
- Dockerfileを基に作られるもの。後述のContainerの型のようなもの
- Imageを作ることをbuildと言う
- オブジェクト指向的に言えばクラス
- Docker Hubで公開されてるImageをDLしてきてもOK。これをpullという
- Docker Container
- Docker Imageを基に作られる仮想環境そのもの
- オブジェクト指向的に言えばインスタンス
- Containerを作り実行することをrunという
- Imageの形で保存・配布して、仮想環境を作りたくなったらContainerにしてね〜という感じ
- やりたい事が終わったら消す。Imageは残しておき、同じ環境が作りたくなったらまたrunさせる
#用語集(ちょっとむずかしい)
- Docker Engine
- 常駐アプリ。Dockerシステムの親玉
- Docker Compose
- yml形式のテキストファイル
- 1個のホストPC上で複数個のコンテナを動かす時、その方法を指示する
- 複数個のコンテナをいっぺんに起動とかもできて便利
- Docker Machine
- 「Dockerを持つホストPC」の中に「Dockerを持つPC」環境を作れる
- クラウド上にDocker環境作る時に便利
- Docker Swarm
- 複数台のホストPCがある時、それらをまとめて制御できる
- 例えば、ホストをまたいだコンテナ間の通信をどう制御するかなど
- これを「オーケストレーションシステム」という
- Service
- ホストPCが1台&コンテナが1個 → container runコマンドでコンテナを起動
- ホストPCが1台&コンテナが1個 → Composeを使ってまとめてコンテナを起動
- ではホストPCが複数台のときは? → Serviceというコンテナのまとまりを作って起動
- 1つのアプリしか扱えない
- Stack
- Serviceのまとまり
- 複数のServiceを扱うことで、複数のアプリを扱うことができるようになる
- Kubernetes
- Swarmと同じく、オーケストレーションシステムの1つ
- Compose, Swarm, Stackを合わせたような便利なやつ
#Dockerにおけるデータ管理
- データ管理関連
- 仮想環境作ってからいちいちデータをダウンロードしてたらめんどくさい
- ホストPC上にデータを管理して、それをコンテナにマウントする手法が取られる
- データ通信関連
- コンテナ間で通信できるし、ホストをまたいで通信する事もできる
#Dockerを勉強しててひっかかったところ
- 「Dockerfile」という名前の情報のなさ
- Dockerfileという固有名詞があると最初わからなかった
- Docker関係のファイル全般のことだと思ってた
- Docker Imageもコンテナっぽいこと
- Imageに「OS+ミドルウェア+アプリ」を放り込むんだからコンテナ感あるよね
- あくまでContainerは仮想環境の実体、Imageはその型
#おわりに
- 自分の理解が進んだら随時追記します
- 「ここがわからなかった」「ここがまちがってる」「わかりやすかった」などコメントお待ちしてます
#参考