Docker
↑ By default, docker logs shows the command’s STDOUT and STDERR. docker docs
↑ Each Docker daemon has a default logging driver, which each container uses unless you configure it to use a different logging driver. In addition to using the logging drivers included with Docker, you can also implement and use logging driver plugins. docker docs
↑ The fluentd logging driver sends container logs to the Fluentd collector as structured log data. docker docs
↑ By default, the logging driver connects to localhost:24224. Supply the fluentd-address option to connect to a different address. tcp(default) and unix sockets are supported. docker docs
↑ To use this logging driver, start the fluentd daemon on a host.
コンテナ仮想化はコンテナ内部からホストカーネルを直接利用するため、エッジケースではホストカーネルのバージョンとDockerに依存した問題が発生する(以下の内容は他の仮想化手法でも類似した形で存在する)。
Dockerイメージは主としてLinuxディストリビューションイメージ、例えばUbuntuイメージを基にして作成されている。ところでLinuxディストリビューションは特定バージョンのLinuxカーネルを含んでいる。例えばUbuntu 18.04.4LTSはv5.3を、Debian 10はv4.19を含んでいる。ゆえにあるDockerイメージがUbuntu 18.04LTSイメージを基にしている場合一見するとカーネルはv5.3かと思うが、コンテナ仮想化はホストカーネルを利用するためDebian10ホスト上でDockerを動作した場合は動作カーネルはv4.19である。またDockerもkernel v4.19上で動作している。
コンテナ仮想化が持つ上記の特性から、いくつかの注意点・欠点がある。
まず異なるホストOSを利用した際の可搬性である。
Dockerコンテナは高い可搬性が特徴だが、異なるホストOS例えばUbuntuホストとDebianホストで同一コンテナを動作させた際、カーネルバージョンに違いに起因するコンテナ間で一貫しない動作のリスクが存在する。例えばDebian 8ホストでは発生したカーネル由来のバグがDebian 9ホスト上では修正されて発生しない可能性がある。
また新しいバージョンのLinuxカーネルに依存したイメージが古いLinuxカーネルのホスト上で動かないという問題がある。Ubuntu 18.04.4LTSイメージ(ディストリビューションのカーネルはv5.3)上に構築したアプリケーションがDebian 10(Kernel v4.19)に存在しないカーネル機能を利用していた場合、Debian10ホスト上でこのコンテナを実行すると存在しないカーネル機能を利用しようとしてエラーを起こしてしまう。Linuxカーネルの非常に高い後方互換性から、逆のパターンすなわち古い機能が新しいカーネルのホスト上で動かないパターンは非常にまれと考えられる。
またホストカーネルバージョンとDockerエンジンバージョンの組み合わせによるバグもある。カーネルパニックをおこすエッジケースも存在 している(あらゆる仮想化はホストと仮想化エンジンの不整合リスクを抱えている)。
コンテナのファイルシステムはいくつかのドライバによって提供される。現在推奨されるoverlay2およびかつて推奨されていたAufsでは、Dockerコンテナ内に作成されたファイルが元のDockerイメージ (雛形) の差分として蓄えられる。差分しかディスク容量を消費しないので、より少ないリソースでコンテナを作成し実行する事が可能である。このことが他の仮想化手法と比較して容易かつ高速な仮想化環境の生成/破棄を可能にしている。なお当初はaufsのみのサポートだったが、その後btrfs、Device Mapper、OverlayFS、vfs、ZFSが選択可能となっている。
ホストカーネルを直接利用しながらプロセス・ファイルシステムを隔離するコンテナ仮想化を提供する。仮想化はGo言語で実装されたソフトウェア libcontainer によって行われる。古いDocker実装ではLXCが利用されていた。
DockerはCompose (docker-compose) による複数コンテナの実行・連携を提供する。docker-compose.yml でコンテナセット・ネットワークを定義することで、単一のホストマシン上にコンテナ群をデプロイできる。さらにDocker Swarmを用いることでマルチホスト環境へのデプロイも可能になる。