Docker入門
Dockerに入門しようといろいろ調べたときの記録
細かいアーキテクチャよりも、全体的な関係性を重視
Docker 登場人物
Docker Image
- コンテナのベースとなるもの
- コンテナを起動するときに指定する
- これをDockerHubとPush/Pullしてやり取りする
Docker Container
- コンテナ本体
- 起動中は、ベースとなるImageを削除できない
- 起動したままにすると、仮想マシンと似たような挙動になる
- バックグラウンド起動可
- 起動時に特定のコマンドを実行して、即座に停止させることができる
- つまり、「特定の環境で動作するプロセス」を仮想化することができる
Dockerfile
- Docker Imageの作成(=オンプレミスでいう環境構築にあたる)を自動化する
- よく設定する項目は以下
ファイルシステム
- bind mount
- ホストOSのディレクトリをコンテナに提供
- volume
- ホストOSのボリューム(/var/lib/docker/volumes)をコンテナ内で使用
- 複数コンテナで共有可能
- データ専用コンテナを用意して、ユーザデータ領域として分離することで、バックアップにおける利便性、可搬性の向上をはかる
- tmpfs mount
- ホストOSのメモリをファイルシステムとしてコンテナに提供
- コンテナを停止すると消えるので、一時利用のみ
イメージとコンテナの保存/バックアップ/リストア
バックアップ/リストアの注意点
- コンテナexport ⇒ イメージload
- データボリュームとして定義されたディレクトリは"対象外"
- この場合、データボリュームはDockerfileで定義しなければならない
- コンテナstop&commit ⇒ イメージsave ⇒ イメージload
- データボリュームとして定義されたディレクトリも対象になる
同一ホスト上のコンテナ間通信
link
- 同一ホスト上にあるコンテナの環境変数を読み取ることができる
- 将来的に削除される可能性がある機能
bridgeネットワーク
- 同一ホスト上にあるコンテナ間で通信できるブリッジインターフェースを提供
マルチホストでのコンテナ間通信
- オーバーレイネットワーク
- Kubernatesとか、Docker Swarmで実現
- 対象コンテナをクラスタ化して、コンテナ通信用のオーバーレイネットワークを構築
- L3のうえに論理的なL2ネットワークを構築する"VXLAN"で実現している
- クラスタ内で、ホストOSはマネージャノードとワーカーノードに分かれる
- ワーカーノードを簡単にスケールアウトさせることができる
- スケールアウトした場合、仮想IPアドレスは共通のものを使用するため、仮想マルチプロセスによる負荷分散・耐障害性の向上が実現できる
MACVLAN
- ホストOSと同一のIP空間に、コンテナを配置するネットワーク構成にする仕組み
- ネットワークドライバとしてMacvlanを指定する
- Docker Swarmクラスタ環境で設定することもできる
- その他、サードパーティ製品(weave, etcd & flannel)でも実現できる
Docker Swarmクラスタにおける複数サービスの管理方法
- docker stack という機能を使用する
- yamlに、各イメージから生成されるコンテナが利用するネットワーク情報を記載
- どのノードに属するか
- どのオーバーレイネットワークに属するか