Docker

出典: フリー百科事典『ウィキペディア(Wikipedia)』
ナビゲーションに移動 検索に移動
Docker
Docker (container engine) logo.png
作者 Solomon Hykes
開発元 Docker, Inc.
初版 2013年3月13日 (2013-03-13)
最新版 19.03.12 - 2020年6月18日(44日前) (2020-06-18[1][±]
リポジトリ github.com/docker/docker-ce
プログラミング言語 Go言語
対応OS Linux, macOS, Windows
プラットフォーム x86-64
種別 仮想化
ライセンス Apache License 2.0
公式サイト www.docker.io
テンプレートを表示

Docker(ドッカー[2])は、コンテナ仮想化を用いてアプリケーションを開発・配置・実行するためのオープンソースソフトウェアあるいはオープンプラットフォームである[3]

Dockerはコンテナ仮想化を用いたOSレベルの仮想化英語版によりアプリケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を可能にする。かつその環境自体をアプリケーションと同じようにコード(イメージ)として管理可能にする[4]。Dockerを開発・テスト・デプロイに用いることで「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大きく短縮できる[5]

概要[編集]

アプリケーションソフトウェアは開発環境でコーディングされ、テスト環境で動作確認され、ステージング環境にデプロイされ、本番環境でサービス提供をおこない、開発環境でデバッグされる。ソフトウェア開発ではただアプリケーションのコードを書くのではなく、上記すべての環境整備と環境へのアプリケーションデプロイを行う必要がある。かつ複数人による開発では上記すべてを全員で一貫性をもって共有しなければならない。

これらを達成するには様々な状況(動作OS、既存環境)へ同一の環境とアプリケーションをできるだけ低コストで届ける必要がある。動作OS(ホストOS)や既存環境からの隔離手法にはOSレベルの仮想化英語版があり、その一種にカーネルをホストと共有しプロセス・ファイルシステムを隔離するコンテナ仮想化がある。環境をアプリケーションごとコンテナへ隔離しコンテナのイメージファイルを配布することで、ランタイムが用意されたあらゆる状況へ同一環境・同一アプリケーションを配備できる。

Dockerはこのコンテナ仮想化を核としたアプリケーションのためのオープンプラットフォームである。環境およびアプリケーションをDockerイメージとしてバンドルし、DockerエンジンによりDockerコンテナとして配備・実行できる。Linux・Windows・Macすべてに対応したDockerエンジンは開発・テスト・本番・デバッグなど様々な状況で容易かつ高速なアプリケーション配備・実行を可能にする。またDockerイメージのレジストリ登録・Dockerイメージに基づいた派生イメージ生成・差分管理による派生イメージの低容量化により、容易な独自イメージ生成と高速/低負荷なコンテナ生成が可能になる。かつ標準仕様化を含むDockerソフトウェアのコンポーネント化により、コンテナ仮想化レベル自体の制御を含む独自コンテナ仮想化システムが構築可能になっている。このようにDockerは広範なアプリケーション開発のためのプラットフォームとして現在では機能している。

Dockerがもたらす環境/アプリケーション展開の効率化は継続的インテグレーション(CI)継続的デプロイ(CD)によるサービス提供の高頻度化をさらに加速させた。またクラウドコンピューティングが提供するマネージドサービスと展開コンテナ数調整によってサービスのスケーリングは容易になり、サービスの柔軟性やコスト構造にも影響を及ぼしている。このようにDockerの採用はアプリケーション開発・運用、それが生み出すビジネスまで影響を与えている。

主な利点[編集]

資源の効率化[編集]

一台のサーバ上に複数のオペレーティングシステム (OS) を走らせる仮想化技術は従来から存在していた。例えば、ハイパーバイザ型のHyper-Vやホスト型のVirtualBox等である[6]。仮想化の本来の目的は、一台のハードウエア内に出来る限り多くのサーバー用アプリケーションを実行する事である[要出典]が、上記種類の仮想化では仮想環境毎にOSを丸ごとインストールする必要があり、アプリケーションに必要のないサービスやファイルまで伴っていた。これは資源(resource)の浪費であった。

アプリケーションとは直接関係の無いライブラリやデータは仮想環境内で共有する事が望ましかった。これを実現するのがコンテナ型の仮想化である。実際にDockerは、ホストOSのカーネルを共有する[7]。それぞれの仮想環境はDockerコンテナと呼ばれ、一台のサーバ上でそれぞれが隔離される事で複数のインスタンスが動作しているように見える[7]

アプリ実行環境構築の容易さ[編集]

一般にアプリケーションを開発もしくは動作させるまでには、設定ファイルの編集や必要なライブラリのインストール等、本来の目的には関係のない煩雑な作業が必要である。Dockerはアプリケーションとライブラリを同一のコンテナ内に固めてしまう。一度固めたコンテナは軽量であるため移動が容易であり、比較的どの環境でも素早く目的のアプリケーションを動作させる事が可能である[8]。これをDocker社は、Build, Ship, and Run Any App, Anywhere と表現している[9]。Docker DesktopによりDockerはWindowsOS上・MacOS上でも機能するため、コンテナの"移動"はOSをまたいでおり可搬性は高い[10]

設定間違いなどの不可逆的操作の廃棄の容易さ[編集]

複雑なシステムであると、一度設定を間違えると、その操作の影響範囲の特定に時間がかかり、復旧には導入時間以上に時間がかる可能性がある。 Dockerでは、にっちもさっちも行かなくなったシステムは瞬時に削除できる。 Docker fileによる設定の変更での再構築の時間が短い。また、イメージを段階的に残してあれば、設定間違いの前の状態へ戻ることも容易である。 これらの際に、上記資源の効率の良さと、構築の容易さが効いてくる。廃棄が気軽にできるのが利点である。

利用[編集]

アプリケーション開発環境[編集]

Dockerコンテナはアプリケーション開発環境に利用できる(Developing inside a Container [11])。

コンテナは外部と隔離されている。ゆえに開発環境のセットアップが既存環境を破壊する、あるいは既存環境が開発環境へ予期せぬ影響を与える可能性がない。このようにアプリケーション開発用のサンドボックスとしてDockerコンテナを利用できる(development container[12]

またコンテナはイメージから生成されるため配布することが可能である。ゆえに複数の開発者がそれぞれ開発環境を用意せずとも、配布されたイメージからコンテナを生成するだけで開発環境が利用できる。開発環境を破壊した場合でもそのコンテナを破棄し配布イメージから再生成することですみやかな開発環境の修正が可能である。

コンテナがもつ可搬性によりホストに依存しない一貫した開発が可能になる。コンテナはDockerのランタイム上で動作するためホスト側のOSや設定に影響を受けず、同一イメージからWindowsユーザーもLinuxユーザーも開発環境コンテナを利用できる[13]

開発コンテナには複数種類の利用方法がある。

  • 全てをコンテナ内で完結: コンテナ上のターミナルでコンテナ内のコードを編集
  • volumeマウントを利用: ホスト上のコードをコンテナのvolumeへマウントし、コード編集はホスト・実行とその環境はコンテナ
  • ホスト-コンテナ間連携: コンテナ内のエディタサーバーを通じてホストのエディタUIからコンテナ内コードを操作・実行

などがある。すべてをコンテナ内で完結させればホストはDockerのみで動作する。volumeマウントは実行環境の隔離に近い。ホスト-コンテナ連携をした場合、ホストはDockerとエディタのみに依存する。

コンテナ化されたアプリケーション[編集]

Dockerコンテナはアプリケーションとその実行環境のセットとして利用できる(containerized application[14], Container Deployed Applications[15])。

Dockerイメージはファイルシステムと実行時設定の集合である(参考: Open Container Initiative#OCI Image)。アプリケーションおよび実行に必要なソフトウェアさらに実行時設定が含まれているDockerイメージを基にコンテナを生成すれば、コンテナは起動と共にアプリケーションとして機能する。このようにDockerコンテナはすべてのDocker環境へデプロイ可能なアプリケーションとして機能する。

Dockerイメージは配布が可能でありかつ環境によらず一貫して機能する可搬性を持つため、コンテナ化されたアプリケーションとしてアプリを作成すれば、テスト環境・ステージング環境・本番環境へ容易に一貫したアプリケーションをデプロイできる。

評価[編集]

Dockerがもたらす環境/アプリケーション展開の効率化は開発から運用まで幅広い領域に大きな影響を与えている。

Dockerイメージ生成による環境生成はOS・ミドルウェアレベルのInfrastructure as Code(IaC)であり、高速/低負荷なコンテナ生成/破棄は実利用可能なImmutable Infrastructureとみなせる[16]。これら高効率な環境展開はテスト・ビルド等の継続的インテグレーション(CI)・サービス提供まで含む継続的デプロイ(CD)をより容易にした。クラウドコンピューティングサービスがDockerコンテナ実行マネージドサービスを提供し始めたことで、開発者はローカルに作成したDockerイメージをクラウド上へホストを意識せず展開可能になった。生成/破棄が容易なコンテナをホストを意識せず利用できるマネージドサービスでデプロイすることで、アプリケーション運用者は展開コンテナ数調整による容易かつ柔軟なアプリケーションのスケーリングが可能になった。コンテナ仮想化による運用が広まるにつれてコンテナ連携によるサービス提供、すなわちマイクロサービスアーキテクチャのDockerコンテナ群による実装が構想され、コンテナ連携を指揮するコンテナオーケストレーションソフトウェアおよびそのマネージドサービスが実利用され始めている。このようにDockerはプラットフォームとしてアプリケーション開発とビジネスへ影響を与えている。

Dockerのコンテナー管理の手軽さやインスタンス操作の高速性は、クラウドサービスビッグデータ基盤などを管理するためのIT基盤として高く評価され、2014年12月日経BP社より「ITインフラテクノロジーAWARD 2015」グランプリに選出されている[17]

2014年、GoogleはDockerとは言及していないが、コンテナ型仮想技術を利用しており、毎週20億個のコンテナを自社サービスのために起動していると発表した[18]

技術的な特徴[編集]

コンテナ仮想化[編集]

ホストカーネルを直接利用しながらプロセス・ファイルシステムを隔離するコンテナ仮想化を提供する。仮想化はGo言語で実装されたソフトウェア libcontainer によって行われる。古いDocker実装ではLXCが利用されていた。

差分管理[編集]

コンテナのファイルシステムはいくつかのドライバによって提供される。現在推奨されるoverlay2[19]およびかつて推奨されていたAufsでは、Dockerコンテナ内に作成されたファイルが元のDockerイメージ (雛形) の差分として蓄えられる[8]。差分しかディスク容量を消費しないので、より少ないリソースでコンテナを作成し実行する事が可能である。これが他の仮想化手法と比較して容易かつ高速な仮想化環境の生成/破棄を可能にしている。なお当初はaufsのみのサポートだったが、その後btrfsDevice MapperOverlayFS、vfsが選択可能となっている。

Dockerfile[編集]

DockerではDockerfileからコンテナイメージを生成できる。

DockerではDocker imageがインスタンス化されコンテナとして動作する。imageの実体はJSONファイルおよびファイルシステムの.tarであり(c.f. OCI Image) 手動で記述・生成できる。DockerはDockerfileと呼ばれる設定ファイルからコンテナイメージファイルを作成(build)する機能を提供している。

標準仕様[編集]

DockerコンテナはOpen Container Initiativeが策定したOCI RuntimeおよびOCI Image Format仕様の下敷きになっており、現在のDockerコンテナはOCIに準拠している。OCIへの準拠によりOCI Runtimeを実装する任意のランタイムを利用することができるため、セキュリティを重視したランタイムや速度を重視したランタイムに切り替えることが可能である。

永続化[編集]

Dockerは揮発性のコンテナに対して永続化可能なストレージを提供している。そのマウントは実装方法により以下に分類される。

  • Volumes: ホストのファイルシステム内でDockerが管理する領域に保存される[20]。推奨されるマウントタイプ[21]
  • Bind mounts: ホストの任意の場所に保存される[22]。Docker以外のホストプロセスも操作しうる[23]
  • tmpfs mounts: ホストのメモリ上に保存される(ホストで揮発性)[24]

ネットワーク[編集]

Dockerはネットワーク隔離されたコンテナ同士を繋ぐネットワーキング機能を持つ。

Dockerコンテナはnamespaceを利用してコンテナをホストのネットワークから隔離している。そのためネットワーク設定をnoneにした場合、外部からのネットワークアクセスができない。これは隔離環境という意味では理想的だが、コンテナ間の協調による機能提供ができない。そこでDockerエンジンはネットワークドライバーによるネットワークの提供を行っている。

主に用いられるドライバはbridgeである。ユーザー定義bridgeネットワークは所属コンテナへのIPアドレス提供とコンテナ名によるドメイン名解決 (automatic service discovery) を提供する[25]。また--alias オプションを利用することで1つのドメイン名に複数のコンテナを紐づけることができ[26]DNSラウンドロビンが可能である。

コンテナ連携[編集]

DockerはCompose (docker-compose) による複数コンテナの実行・連携を提供する[27]docker-compose.yml でコンテナセット・ネットワークを定義することで、単一のホストマシン上にコンテナ群をデプロイできる[28]。さらにDocker Swarmを用いることでマルチホスト環境へのデプロイも可能になる[29]

ロギング[編集]

Dockerはコンテナで発生したデータログ/サーバログを処理する機能(ロギング機能)を提供している。Docker Deamonはデフォルトでコンテナのstdout/stderrを捕捉しており、docker logs コマンドでログを表示できる[30]。ロギングはカスタム可能なlogging driverとして実装されており、logging driver pluginsを用いれば独自実装も可能である[31]。デフォルトのlogging driverはjson-fileであり、他にはsyslogfluentd、特定クラウドプロバイダに特化したawslogsgcplogsなどが存在する。

fluentdlogging driverはコンテナログをデータコレクタであるFluentdへforwardする[32]。デフォルトではTCPでlocalhost:24224へ送信するが、オプションにより他のTCPポートあるいはUNIXドメインソケットへ送信が可能である[33]。fluentdデーモンはホストマシン上のプロセス、あるいはポートマッピングをおこなったコンテナとして機能させる[34]

欠点[編集]

ホストLinuxカーネルとの関係[編集]

コンテナ仮想化はコンテナ内部からホストカーネルを直接利用するため、エッジケースではホストカーネルのバージョンとDockerに依存した問題が発生する(以下の内容は他の仮想化手法でも類似した形で存在する)。

Dockerイメージは主としてLinuxディストリビューションイメージ、例えばUbuntuイメージを基にして作成されている。ところでLinuxディストリビューションは特定バージョンのLinuxカーネルを含んでいる。例えばUbuntu 18.04.4LTSはv5.3を[35]、Debian 10はv4.19を[36]含んでいる。ゆえにある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エンジンバージョンの組み合わせによるバグもある。カーネルパニックをおこすエッジケースも存在 [27][28][29] している(あらゆる仮想化はホストと仮想化エンジンの不整合リスクを抱えている)。

エコシステム[編集]

オーケストレーション[編集]

実際のアプリの動作は複数のコンテナ同士が協調し合う事が多いとされる[37]。このため多数のコンテナを自動的に管理する (オーケストレートする) ソフトウエアが必要となる。KubernetesDocker Swarmは当該機能を提供する。

Docker社は、2018年1月KubernetesをDockerに統合したバージョンのベータ版を提供し始めた[38]

イメージレジストリ[編集]

Docker Imageはレジストリを利用した公開・共有が可能である。公開されたイメージはdocker pullコマンドにより取得されコンテナ化できる。広く利用できるレジストリの存在により、Dockerfileを用いたイメージ生成の際にレジストリへ登録されたイメージをベースイメージとすることが可能となっている。docker pullはURL-likeなイメージ識別子(URLからプロトコル名を除いたもの。例:quay.io/assemblyline/ubuntu)を受け入れるため様々なレジストリを利用できる[39]

Docker Hub[編集]

Docker Hubはdocker pullがデフォルトで利用する公開レジストリである。2014年にDockerコンテナの共有サービスの場として発表された[40]。DockerHubのイメージを利用する際はレジストリアドレスを省略できる([organization/]image:tag形式。例: fluent/fluentdubuntu)。

Amazon Elastic Container Registry[編集]

Amazon ECRはAmazon Web Servicesが提供するプライベートレジストリである[41]。プライベート、すなわち非公開のレジストリであり、docker loginによる認証情報の読み込みが必須である。レジストリアドレスは<aws_account_id>.dkr.ecr.<region>.amazonaws.comである。

構成要素[編集]

現在のDockerはコンテナランタイム・デーモン・CLI・GUI・イメージレジストリ等、数多くの(取替え可能な)コンポーネントからなっている。

  • Docker Engine : クライアント-サーバー型のアプリケーションパッケージ[42]
    • server: ホストマシン上で稼働するデーモン [43]
      • (高レベル)コンテナランタイム
        • (低レベル)コンテナランタイム・OCIランタイム
    • REST API: デーモンが提供するインターフェース[44]
    • CLI client: CLIクライアント[45]。内部で上記のDocker REST APIを叩いている[46]
  • registry: Dockerイメージの保存庫[47]

現在のDocker(プラットフォーム)は以下のソフトウェアスタックをデフォルトで使用している。

  • Docker Engine: docker-ce(Linux), Docker Desktop (Windows, MacOS)
  • registry: Docker Hub[49]

「Docker」は2013年に登場した際、単一アプリケーションの名称であった。しかし標準化を含む発展に伴って上記のように複数の(取替え可能な)コンポーネントから構成されるようになっており、現在の「Docker」はアプリケーションではなく「プラットフォーム」であるとされている[50]。一般に「Docker」という単語が指す意味は非常に曖昧である。

Dockerを構成する要素は上記のデフォルト以外のものを利用できる。以下はその一例である。

またいわゆる「コンテナオーケストレーション」を行う際はdockerCLIをユーザーが直接利用するのではなく、オーケストレーションツールからdockerd、あるいはより直接的にcontainerdが利用される。

関連項目[編集]

参照[編集]

  1. ^ Releases · docker/docker-ce · GitHub”. 2020年7月1日閲覧。
  2. ^ IT用語辞典 e-Words”. 2018年1月3日閲覧。
  3. ^ Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. Docker Documentations - Docker overview
  4. ^ Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. Docker Documentations - Docker overview
  5. ^ By taking advantage of Docker’s methodologies for shipping, testing, and deploying code quickly, you can significantly reduce the delay between writing code and running it in production. Docker Documentations - Docker overview
  6. ^ 第1回 Dockerとは”. 2018年1月3日閲覧。
  7. ^ a b さわって理解するDocker入門”. 2018年1月3日閲覧。
  8. ^ a b Dockerを理解するための8つの軸”. 2018年1月3日閲覧。
  9. ^ Docker”. 2018年1月3日閲覧。
  10. ^ Dockerをどっかーらどうやって使えばいいんでしょう。TOPPERS/FMP on RaspberryPi with Macintosh編 5つの関門”. 2018年2月11日閲覧。
  11. ^ Docker container as a full-featured development environment. [1]
  12. ^ This container can be used to run an application or to sandbox tools, libraries, or runtimes needed for working with a codebase. [2]
  13. ^ Docker Containers Are Everywhere: Linux, Windows, Data center, Cloud, Serverless, etc. [3]
  14. ^ Deploying a containerized web application [4]
  15. ^ Container Deployed Applications: You deploy your application into one or more containers and would like to work locally in the containerized environment. [5]
  16. ^ 大瀧隆太 (2014年5月16日). “いまさら聞けないDocker入門(1):アプリ開発者もインフラ管理者も知っておきたいDockerの基礎知識”. ITmedia. 2016年12月22日閲覧。
  17. ^ 「ITインフラテクノロジーAWARD 2015」を発表”. 日経BP社. 2017年1月3日閲覧。
  18. ^ すでにGoogleは全部のソフトウェアをコンテナに乗せており、毎週20億個ものコンテナを起動している”. 2017年1月3日閲覧。
  19. ^ overlay2 is the preferred storage driver, for all currently supported Linux distributions, and requires no extra configuration. [6]
  20. ^ Volumes are stored in a part of the host filesystem which is managed by Docker [7]
  21. ^ Volumes are the best way to persist data in Docker. [8]
  22. ^ Bind mounts may be stored anywhere on the host system. [9]
  23. ^ Non-Docker processes on the Docker host or a Docker container can modify them at any time. [10]
  24. ^ tmpfs mounts are stored in the host system’s memory only, and are never written to the host system’s filesystem. [11]
  25. ^ containers can not only communicate by IP address, but can also resolve a container name to an IP address. This capability is called automatic service discovery. [12]
  26. ^ Create a network alias for a container [13]
  27. ^ Compose is a tool for defining and running multi-container Docker applications. docker docs - Overview of Docker Compose
  28. ^ Define the services that make up your app in docker-compose.yml so they can be run together in an isolated environment. docker docs - Overview of Docker Compose
  29. ^ Docker Swarm, a Docker-native clustering system, exposes the same API as a single Docker host, which means you can use Compose against a Swarm instance and run your apps across multiple hosts. [14]
  30. ^ By default, docker logs shows the command’s STDOUT and STDERR. docker docs
  31. ^ 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
  32. ^ The fluentd logging driver sends container logs to the Fluentd collector as structured log data. docker docs
  33. ^ 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
  34. ^ To use this logging driver, start the fluentd daemon on a host. We recommend that you use the Fluentd docker image. docker docs
  35. ^ Ubuntu 18.04.4 ships with a v5.3 based Linux kernel [15]
  36. ^ Linux kernel 4.19 series [16]
  37. ^ Kubernetesとは”. 2018年1月3日閲覧。
  38. ^ Kubernetesを統合したDockerがついにリリース。Docker for Mac with Kubernetesのベータ版が公開”. 2018年1月11日閲覧。
  39. ^ By default, docker pull pulls images from Docker Hub. It is also possible to manually specify the path of a registry to pull from. docker docs
  40. ^ Dockerコンテナをクラウドサービス上で共有できる「Docker Hub」を使ってみる”. 2018年1月3日閲覧。
  41. ^ Amazon Elastic Container Registry (ECR) は、完全マネージド型の Docker コンテナレジストリです。 Amazon Elastic Container Registry
  42. ^ Docker Engine is a client-server application with these major components: [17]
  43. ^ a b A server which is a type of long-running program called a daemon process (the dockerd command). [18]
  44. ^ A REST API which specifies interfaces that programs can use to talk to the daemon and instruct it what to do. [19]
  45. ^ a b A command line interface (CLI) client (the docker command). [20]
  46. ^ The CLI uses the Docker REST API to control or interact with the Docker daemon through scripting or direct CLI commands. [21]
  47. ^ A Docker registry stores Docker images. [22]
  48. ^ By default, the Docker daemon automatically starts containerd. [23]
  49. ^ Docker Hub is a public registry that anyone can use, and Docker is configured to look for images on Docker Hub by default. [24]
  50. ^ Docker is an open platform for developing, shipping, and running applications. [25]
  51. ^ Docker Trusted Registry (DTR) is the enterprise-grade image storage solution from Docker.[26]

外部リンク[編集]