1. 序章

12ファクターアプリの多くの哲学の1つは、構成を環境に保存する必要があるということです。 実際には、これは、コードとは別に構成を保存することを意味します。

このチュートリアルでは、Dockerシークレットがこの目標の達成にどのように役立つかを見ていきます。 Dockerシークレットを作成および管理する方法を見ていきます。 次に、アプリケーションのデプロイの一部としてDockerシークレットを利用する方法を見ていきます。

2. 秘密は何ですか?

一般に、シークレットは、実行時にアプリケーションが読み取ることができるデータを安全に保存するメカニズムを提供します。 シークレットは、アプリケーションコードとは別に機密データを保存する上で重要な役割を果たします。 これには、パスワード、ホスト名、SSHキーなどのデータが含まれます。

たとえば、アプリケーションにデータベース接続が必要だとします。 これを行うには、ホスト名、ユーザー名、およびパスワードが必要です。 さらに、開発、テスト、および本番用に別のデータベースサーバーがあります。

シークレットを使用すると、各環境で独自のデータベース情報をアプリケーションに提供できます。 アプリケーションコードは、どの環境で実行されているかを知る必要はありません。 値を検索するための一貫した方法が必要なだけです。

Dockerシークレットは比較的新しい機能ですが、ほとんどのクラウドプラットフォームは、長年にわたって何らかの形のシークレットを提供してきました

たとえば、Amazon WebServicesとGoogleCloudの両方にSecretsManagerツールがあり、AzureはKeyVaultサービスを提供しています。 Kubernetes は、シークレットのファーストクラスのサポートも提供します。

Dockerのシークレットの実装では、前述のシステムと同じ機能の多くを使用します。

  • シークレットは、アプリケーションとは別に作成および管理されます
  • 最小特権および知る必要のあるアクセスの原則に従います
  • さまざまな異なるデータタイプを保存する柔軟性

Dockerシークレットの基本を理解した上で、それらを管理する方法を見てみましょう。

3. Dockerシークレットの管理

このセクションでは、Dockerシークレットの作成から削除までを管理する方法を見ていきます。

3.1. Dockerの要件

現在、Dockerシークレットはスウォームサービスでのみ使用できます。 これは、スタンドアロンコンテナがシークレットにアクセスできないことを意味します。

したがって、これらのシークレットを使用するには、次のコマンドを使用して、swarm用にクラスターを構成する必要があります。

docker swarm init --advertise-addr <MANAGER-IP>

どこ Dockerによってマネージャーノードに割り当てられたIPアドレスです。

WindowsおよびMac用のDockerデスクトップでは、コマンドを簡略化できます。

docker swarm init

クラスターがスウォーム用に構成されたので、シークレットを作成できます。

3.2. Dockerシークレットの作成

Dockerシークレットは、文字列またはバイナリで表すことができるほぼすべてのタイプのデータを格納できます。

  • ユーザー名とパスワード
  • ホスト名とポート
  • SSHキー
  • TLS証明書

唯一の実際の制限は、データのサイズが500KB未満である必要があることです

シークレットを作成するとき、コマンドはコマンドラインからの入力を受け入れます。

docker secret create my_secret -

この形式では、コマンドを使用してシークレットの値を入力でき、複数行のデータもサポートします。 データの入力を完了するには、EOF信号(UnixベースのシステムではCtrl + D)を与える必要があります。

ただし、キーボードを使用して手動で入力を入力することは、エラーが発生しやすく、自動フローと組み合わせると実用的ではありません。 したがって、ファイルの内容を使用してシークレットを作成することもできます。

docker secret create my_secret /path/to/secret/file

3.3. Dockerシークレットの表示

シークレットを作成したら、それが成功したことを確認できます。

docker secret ls
ID                          NAME        DRIVER    CREATED          UPDATED
2g9z0nabsi6v7hsfra32unb1o   my_secret             30 minutes ago   30 minutes ago

これにより、すべてのシークレットと、それらに割り当てられた一意のIDが表示されます。 個々の秘密も調べることができます。

docker secret inspect my_secret
[
    {
        "ID": "2g9z0nabsi6v7hsfra32unb1o",
        "Version": {
            "Index": 15
        },
        "CreatedAt": "2022-05-13T00:34:41.2802246Z",
        "UpdatedAt": "2022-05-13T00:34:41.2802246Z",
        "Spec": {
            "Name": "my_secret",
            "Labels": {}
        }
    }
]

3.4. Dockerシークレットの削除

シークレットが不要になったら削除することをお勧めします。 たとえば、コマンドラインからシークレットを完全に削除できます。

docker secret rm my_secret

シークレットがサービスによって使用されている場合、このコマンドは機能しないことに注意してください。

4. Dockerシークレットの使用

シークレットを管理する方法を理解したので、アプリケーションでシークレットを実際に使用する方法を確認できます。 Dockerエコシステムのほとんどのものと同様に、これを行うには複数の方法があります。

4.1. Dockerサービス

Dockerシークレットでは、クラスターがスウォームモードである必要があるため、通常のDocker runコマンドからシークレットにアクセスすることはできません。 代わりに、サービスを作成する必要があり、コマンドラインで1つ以上のシークレットを指定できます。

docker service create --name my_app --secret my_secret openjdk:19-jdk-alpine

4.2. DockerCompose

Docker Compose バージョン3以降では、シークレットを使用するための2つのオプションがあります。 以下は、サービスとシークレットを定義する簡単な例です。

version: '3.1'
services:
  my_app:
    image: my_app:latest
    secrets:
     - my_external_secret
     - my_file_secret
secrets:
  my_external_secret:
    external: true
  my_file_secret:
    file: /path/to/secret/file.txt

この例では、2つの秘密を定義します。 1つ目は外部です。つまり、Docker secretコマンドを使用して作成されたシークレットを参照します。 2つ目はファイルを参照し、Dockerによる初期設定は必要ありません。

ファイルアプローチを使用すると、Dockerシークレットを使用する利点のほとんどがバイパスされることに注意してください。 また、ファイルはサービスが実行される可能性のあるすべてのホストで利用可能である必要があり、Docker以外のメカニズムを使用してそのコンテンツを保護するように注意する必要があります。

4.3. 秘密へのアクセス

Dockerは、シークレットをファイルとしてアプリケーションで利用できるようにします。 デフォルトの動作では、各シークレットをディレクトリ / run /secrets内の独自のファイルにします。 前の例を使用すると、my_secretの内容はファイル/run / secrets /my_secretで利用できます。

サービスでファイルを指定することにより、ファイルの場所を変更できます。

docker service create
  --name my_app
  --secret source=my_secret,target=/different/path/to/secret/file,mode=0400

これは、アプリケーションが特定の場所で期待する情報がシークレットに含まれている場合に役立ちます。 たとえば、シークレットを使用してNginx構成ファイルを保存し、それを標準の場所( /etc/nginx/conf.d/site.conf )で使用できるようにすることができます。

5. 結論

シークレットは、コードと構成を分離しておくという目標を達成するのに役立つため、コンテナーベースのアーキテクチャにとって重要なツールです。 さらに、Dockerシークレットは、機密データを安全に保存し、それを必要とするアプリケーションが利用できるようにする方法を提供します。