public note

Docker入門

Dockerに入門しようといろいろ調べたときの記録

細かいアーキテクチャよりも、全体的な関係性を重視

Docker 登場人物

Docker Image

  • コンテナのベースとなるもの
  • コンテナを起動するときに指定する
  • これをDockerHubとPush/Pullしてやり取りする

Docker Container

  • コンテナ本体
  • 起動中は、ベースとなるImageを削除できない
  • 起動したままにすると、仮想マシンと似たような挙動になる
  • バックグラウンド起動可
  • 起動時に特定のコマンドを実行して、即座に停止させることができる
  • つまり、「特定の環境で動作するプロセス」を仮想化することができる

Dockerfile

  • Docker Imageの作成(=オンプレミスでいう環境構築にあたる)を自動化する
  • よく設定する項目は以下
    • ベースImageの指定(OS別に提供されているものが主流)
    • アプリケーションのインストール
    • プロキシの設定
    • ポートフォワードの設定
    • サービス起動方法の指定
    • その他、chmodや特定のスクリプトを実行するなど、個別のコマンドも実行可能
    • Windowsスタートアップのように、起動時に実行するスクリプトの指定もできる(EntryPoint)

ファイルシステム

  • bind mount
  • volume
    • ホストOSのボリューム(/var/lib/docker/volumes)をコンテナ内で使用
    • 複数コンテナで共有可能
    • データ専用コンテナを用意して、ユーザデータ領域として分離することで、バックアップにおける利便性、可搬性の向上をはかる
  • tmpfs mount
    • ホストOSのメモリをファイルシステムとしてコンテナに提供
    • コンテナを停止すると消えるので、一時利用のみ

イメージとコンテナの保存/バックアップ/リストア

  • commit
    • コンテナをイメージとして保存
  • export/import
  • save/load

バックアップ/リストアの注意点

  • コンテナ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に、各イメージから生成されるコンテナが利用するネットワーク情報を記載
    • どのノードに属するか
    • どのオーバーレイネットワークに属するか

参考

https://www.docker.com/resources/what-container

https://knowledge.sakura.ad.jp/13265/