Docker CLIを使用してDocker Hubおよびプライベートレジストリにログインする方法
新しいDockerのインストールは、デフォルトでDocker Hubとの公開インタラクションになります。ログインすると、プライベートコンテンツにアクセスでき、より制限の少ないDocker APIのレート制限の恩恵を受けることができます。
このガイドでは、Docker CLIにログインする方法を示します。Docker Hubの認証と、独自のプライベートレジストリの両方をカバーします。また、Dockerの資格情報ストレージに関する一般的な問題についても見ていきます。
Docker Hub にログインする
Docker Hubにログインすると、Docker CLIがあなたのアカウントにアクセス可能なプライベートコンテンツにアクセスできるようになります。また、認証されていないクライアントに提供される6時間ごとの100プルに対して、6時間ごとに200イメージプルの高いレート制限のしきい値が与えられます。
docker login コマンドを使用して、認証情報を供給し、サーバーに認証します:
docker login
Username:
Password:
インタラクティブにユーザー名とパスワードを入力するように促されます。Dockerは、資格情報を使用してDocker Hubにログインしようとします。詳細が受け入れられた場合は、Login Succeededと表示されます。Dockerは、発行された認証トークンを.docker/config.jsonファイルに保存します。
docker login
Login Succeeded
2FAログイン用のアクセストークン
二段階認証が有効になっているDocker Hubのアカウントは、パスワードの代わりにアクセストークンを使用する必要があります。Docker HubのウェブUIを使用して、右上のプロファイルアイコンをクリックし、メニューから「アカウント設定」を選択します。左のサイドバーを使用して「セキュリティ」タブに切り替えます。
青い「新しいアクセストークン」ボタンをクリックして、パーソナルアクセストークンを作成してください。表示されるトークンキーをメモしておくことに注意してください。将来的に復元することはできません。このトークンを、CLIでdocker loginを実行する際の通常のパスワードの代わりに使用してください。
非インタラクティブログイン
コマンドラインフラグとしてユーザー名とパスワードを入力できます:
docker login --username demo --password exampleこれは、プログラムでログインする場合やCIパイプラインの一部としてログインする場合に便利です。セキュリティを強化するために、--password-stdinフラグを使用してDockerにパスワードをSTDINから読み取るよう指示します。これにより、パスワードファイルをパイプすることができ、プレーンテキストがシェルの履歴やCIジョブのログにキャプチャされるのを防ぐことができます。
cat password.txt | docker login --username demo --password-stdinプライベートレジストリへのログイン
docker loginは、自己ホスティングのレジストリにもログインできます。コマンドの最初の引数として、レジストリのホスト名とポートを指定してください。引数を指定しない場合は、常にDocker Hubが使用されます。
docker login registry.example.com
Username:
Password:
カスタムレジストリで作業する際に、--username、--password、および--password-stdinフラグを引き続き使用できます。複数のレジストリに同時にログインできます - 必要な回数だけdocker loginコマンドを繰り返してください。
手動で資格情報を追加する
時々、Dockerの設定ファイルに既存の認証トークンを追加することで、手動でレジストリにログインしたい場合があります。これは、パイプライン変数として事前に取得したトークンを提供したいCI環境で便利です。
自分で認証トークンを追加するには、.docker/config.json ファイルを編集します。ファイルの先頭にある auths フィールド内に、レジストリのための新しいキーを追加します。そのキーの値としてオブジェクトを提供します。このオブジェクトには、あなたのトークンを含む単一の auth プロパティが必要です。以下は、registry.example.com レジストリの例です:
{
"auths": {
"registry.example.com": {
"auth": "aWxtaW9ud..."
}
}
}
レジストリURLとして https://index.docker.io/v1/ を使用して、Docker Hubトークンを追加できます。
1つのレジストリに複数のアカウント
認証メカニズムの大きな制限は、レジストリがユーザーアカウントと一対一でマッピングされる必要があることです。同じレジストリに複数のユーザーで同時にログインすることは、ネイティブには不可能です。これは、プロジェクトやチームにわたって権限を分けるプライベートレジストリを使用している場合にはしばしば望ましいことです。
資格情報を複数の設定ファイルに分割することで問題を軽減できます。Docker CLI は、各呼び出しに使用するファイルを決定するために --config フラグまたは DOCKER_CONFIG 環境変数を使用します。
Authenticate as user-1
docker --config ~/docker/user-1.conf login registry.example.com --username user-1 --password foobar
Authenticate as user-2
docker --config ~/docker/user-2.conf login registry.example.com --username user-2 --password foobar
Pull an image from registry.example.com as user-1
docker --config ~/docker/user-1.conf pull my-team/my-project:latest
Push an image to registry.example.com as user-2
docker --config ~/docker/user-2.conf push my-team/my-project:latest
多数のプロジェクトに取り組んでいるときは、シェルエイリアスや関数を使用して、dockerを作業ディレクトリに適した設定ファイルを自動的に選択するコマンドに書き換えることができます。
alias docker="docker --config ~/docker/$(basename $PWD).conf $1"認証ヘルパー
Dockerはデフォルトで、あなたの資格情報を不安定に~/.docker/config.jsonに保存します。認証ヘルパーユーティリティを統合することで、より多くの保護を追加できます。有効なヘルパーは、CLI操作に応じてDockerから発行された資格情報のstore、get、およびeraseコマンドを処理することができます。
設定ファイルのcredHelpersフィールドを使用して、特定のヘルパーユーティリティにレジストリを関連付けることができます:
{
"credHelpers": {
"registry.example.com": "pass"
}
}
この例では、registry.example.comの資格情報を設定ファイルではなくPassに保存するためにpass資格情報ヘルパーを使用しています。Passヘルパーは、macOSのキーチェーン、Windowsの資格情報マネージャ、およびD-Busシークレットサービスとの統合も含まれるDockerのdocker-credential-helpersバンドルの一部として提供されています。
ログアウト中
レジストリのセクションを手動で .docker/config.json ファイルから削除するか、docker logout コマンドを使用することでログアウトできます。
docker logoutコマンド docker login と同様に、ログアウトはデフォルトで Docker Hub を対象とします。コマンドの唯一の引数としてホスト名を渡すことで、プライベートレジストリからログアウトすることができます:
docker logout registry.example.com一般的な問題
ほとんどのDockerの認証問題は、資格情報が不足しているか無効であることから生じます。以前にログインしたことがあるが認証が機能しない場合は、一度ログアウトして再度ログインしてみてください:
docker logout
OR
docker logout registry.example.com
docker login
OR
docker login registry.example.com
一貫して拒否された資格情報は、あなたのレジストリアカウントに問題があることを示している可能性があります。Docker Hubの場合、2FAで保護されたアカウントでパスワードの代わりにパーソナルアクセストークンを使用するためのガイダンスに従ったことを確認してください。
複数のDocker設定ファイルがある場合、混乱が生じることもあります。画像をプッシュおよびプルするたびに、正しい設定を読み込むために--configフラグまたはDOCKER_CONFIG環境変数を使用していることを確認してください。
要約
Docker CLIをDocker Hubアカウントやプライベートレジストリに接続するには、通常docker loginコマンドを使用するのが最適です。資格情報を対話的に、フラグとして、またはパイプでつなげたパスワードファイルを介して提供できます。二要素認証が有効な場合は、パスワードの代わりにパーソナルアクセストークンを使用することを確認してください。
複数のレジストリに認証するためのシームレスなサポートはありますが、1つのレジストリから複数のアカウントを扱うのはより面倒です。可能な限り別々の設定ファイルを使用するか、各環境に適した特別にスコープされたユーザーアカウントでレジストリを設定してください。

