はじめに
この実験では、docker secret ls コマンドを効果的に使用して、Docker swarm 環境内のシークレットを管理および表示する方法を学びます。まず、Docker swarm を初期化し、サンプルのシークレットを作成します。その後、既存のすべてのシークレットを一覧表示する方法、シークレット名とラベルに基づいて出力をフィルタリングする方法を調べ、最後に、シークレット一覧の出力を整形して、読みやすさを向上させ、特定の情報を抽出する方法を学びます。この実践的な経験を通じて、Docker シークレットとして保存されている機密データを効率的に見つけて管理するスキルを身につけることができます。
すべてのシークレットを一覧表示する
このステップでは、Docker 環境内のすべてのシークレットを一覧表示する方法を学びます。Docker シークレットは、パスワード、TLS 証明書、SSH キーなどの機密データを管理するために使用されます。これらは Docker swarm 内に安全に保存され、swarm 内で実行されているサービスからアクセスできます。
シークレットを一覧表示する前に、Docker swarm を初期化する必要があります。swarm とは、Docker エンジンのクラスターです。テスト目的で単一ノード上で swarm を初期化することができます。
ターミナルを開き、以下のコマンドを実行して swarm を初期化します。
docker swarm init
swarm が初期化され、現在のノードがマネージャーになったことを示す出力が表示されるはずです。
swarm が初期化されたので、シークレットを作成することができます。値が my_secret_value で、名前が my_secret の単純なシークレットを作成します。
以下のコマンドを実行してシークレットを作成します。
echo "my_secret_value" | docker secret create my_secret -
このコマンドは、文字列 "my_secret_value" を取得し、それを docker secret create コマンドにパイプし、シークレットの名前を my_secret に設定します。末尾のハイフン - は、シークレットの値が標準入力から読み取られることを示しています。
では、Docker swarm 内に存在するシークレットを一覧表示しましょう。これには docker secret ls コマンドを使用できます。
以下のコマンドを実行します。
docker secret ls
作成したシークレットの ID、名前、作成時間が表示される、次のような出力が表示されるはずです。
ID NAME CREATED
<secret_id> my_secret About a minute ago
このコマンドは、現在 Docker swarm で管理されているすべてのシークレットを一覧表示します。次のステップでは、この出力をフィルタリングおよび整形する方法を学びます。
名前でシークレットをフィルタリングする
このステップでは、--filter フラグを使用した docker secret ls コマンドを使って、シークレットの一覧を名前でフィルタリングする方法を学びます。多数のシークレットがあり、特定のシークレットや似た名前のシークレットのグループを見つけたい場合に便利です。
前のステップで、my_secret という名前のシークレットを作成しました。フィルタリングを実演するために、もう 1 つのシークレットを作成しましょう。このシークレットの名前は another_secret とします。
以下のコマンドを実行して新しいシークレットを作成します。
echo "another_value" | docker secret create another_secret -
ここで、再度 docker secret ls を実行すると、両方のシークレットが表示されます。
docker secret ls
出力は次のようになり、my_secret と another_secret の両方が表示されます。
ID NAME CREATED
<secret_id_1> my_secret About 2 minutes ago
<secret_id_2> another_secret About a few seconds ago
my_secret という名前のシークレットのみを表示するように一覧をフィルタリングするには、--filter name=my_secret オプションを使用できます。
以下のコマンドを実行します。
docker secret ls --filter name=my_secret
これで、出力には my_secret という名前のシークレットのみが表示されます。
ID NAME CREATED
<secret_id_1> my_secret About 2 minutes ago
部分的な名前を使用してフィルタリングすることもできます。たとえば、名前に "secret" が含まれるシークレットをフィルタリングするには、同様のフィルターを使用できますが、正確な名前の一致には、前のコマンドの方が正確です。name フィルターは完全一致を行います。
このフィルタリング機能は、大量のシークレットがある環境で非常に役立ち、作業に必要な特定のシークレットをすばやく見つけることができます。
ラベルでシークレットをフィルタリングする
このステップでは、ラベルに基づいてシークレットをフィルタリングする方法を学びます。ラベルは、シークレットを含む Docker オブジェクトに付けることができるキーと値のペアで、オブジェクトを整理して分類するために使用されます。ラベルでフィルタリングすることは、複雑な環境でシークレットを管理する強力な方法です。
まず、新しいシークレットを作成し、作成時にラベルを追加しましょう。labeled_secret という名前のシークレットを作成し、environment=production というラベルを追加します。
以下のコマンドを実行して、ラベル付きのシークレットを作成します。
echo "production_value" | docker secret create --label environment=production labeled_secret -
このコマンドは、前の docker secret create コマンドと似ていますが、--label environment=production フラグを追加して、シークレットにラベルを付けています。
次に、異なるラベルを持つ別のシークレットを作成しましょう。このシークレットの名前を dev_secret とし、environment=development というラベルを付けます。
以下のコマンドを実行します。
echo "development_value" | docker secret create --label environment=development dev_secret -
ここで docker secret ls を使ってすべてのシークレットを一覧表示すると、3 つのシークレットがすべて表示されます。
docker secret ls
出力には、my_secret、another_secret、labeled_secret、dev_secret が表示されます。
environment=production というラベルが付いたシークレットのみを表示するようにフィルタリングするには、--filter label=environment=production オプションを使用できます。
以下のコマンドを実行します。
docker secret ls --filter label=environment=production
出力には labeled_secret のみが表示されるはずです。
ID NAME CREATED
<secret_id_3> labeled_secret About a minute ago
同様に、environment=development というラベルが付いたシークレットをフィルタリングするには、--filter label=environment=development を使用します。
以下のコマンドを実行します。
docker secret ls --filter label=environment=development
これにより、dev_secret のみが表示されます。
ID NAME CREATED
<secret_id_4> dev_secret About a minute ago
また、特定のラベルキーを持つシークレットを、その値に関係なくフィルタリングすることもできます。その場合は --filter label=environment を使用します。
以下のコマンドを実行します。
docker secret ls --filter label=environment
これにより、environment というラベルキーを持つ labeled_secret と dev_secret の両方が表示されます。
ID NAME CREATED
<secret_id_3> labeled_secret About 2 minutes ago
<secret_id_4> dev_secret About 2 minutes ago
ラベルでフィルタリングすることは、独自に定義したカテゴリに基づいてシークレットを管理し、取得する柔軟な方法です。
シークレットリストの出力をフォーマットする
このステップでは、--format フラグを使用して docker secret ls コマンドの出力をフォーマットする方法を学びます。これにより、表示する情報とその表示方法をカスタマイズでき、スクリプト作成やレポート生成に役立ちます。
デフォルトでは、docker secret ls は ID、NAME、CREATED の列を持つテーブルを出力します。Go テンプレート構文を使用した --format フラグを使って、このフォーマットを変更できます。
たとえば、シークレット名のみを表示するには、{{.Name}} というフォーマットを使用できます。
以下のコマンドを実行します。
docker secret ls --format "{{.Name}}"
これで、出力にはシークレットの名前のみが 1 行ごとに表示されます。
my_secret
another_secret
labeled_secret
dev_secret
複数のフィールドを指定し、テーブルとしてフォーマットすることもできます。たとえば、ID と名前をタブで区切って表示するには、table {{.ID}}\t{{.Name}} を使用できます。table キーワードを使用すると、出力が列に整列されます。
以下のコマンドを実行します。
docker secret ls --format "table {{.ID}}\t{{.Name}}"
出力は 2 列のテーブルになります。
ID NAME
<secret_id_1> my_secret
<secret_id_2> another_secret
<secret_id_3> labeled_secret
<secret_id_4> dev_secret
また、JSON 形式で情報を出力することもでき、これはプログラムによる処理に非常に便利です。json というフォーマットを使用します。
以下のコマンドを実行します。
docker secret ls --format "json"
出力は JSON 配列になり、各要素がシークレットを表します。
[
{
"ID": "<secret_id_1>",
"Name": "my_secret",
"CreatedAt": "2023-10-27 10:00:00 +0000 UTC",
"UpdatedAt": "2023-10-27 10:00:00 +0000 UTC",
"Labels": {}
},
{
"ID": "<secret_id_2>",
"Name": "another_secret",
"CreatedAt": "2023-10-27 10:01:00 +0000 UTC",
"UpdatedAt": "2023-10-27 10:01:00 +0000 UTC",
"Labels": {}
},
{
"ID": "<secret_id_3>",
"Name": "labeled_secret",
"CreatedAt": "2023-10-27 10:02:00 +0000 UTC",
"UpdatedAt": "2023-10-27 10:02:00 +0002 UTC",
"Labels": {
"environment": "production"
}
},
{
"ID": "<secret_id_4>",
"Name": "dev_secret",
"CreatedAt": "2023-10-27 10:03:00 +0000 UTC",
"UpdatedAt": "2023-10-27 10:03:00 +0000 UTC",
"Labels": {
"environment": "development"
}
}
]
--format フラグを使用すると、Docker シークレットに関する情報の表示と処理方法に大きな柔軟性が得られます。
まとめ
この実験では、docker secret ls コマンドを使用して Docker 環境内のすべてのシークレットを一覧表示する方法を学びました。まず、Docker swarm を初期化し、サンプルのシークレットを作成しました。その後、docker secret ls を使用して、作成したシークレットの ID、名前、作成時間を表示しました。
また、--filter フラグを使用してシークレットの一覧を名前とラベルでフィルタリングする方法や、docker secret ls コマンドの出力をより読みやすくするため、またはスクリプトで使用するためにフォーマットする方法も学びました。



