1. 序章

プライベートDockerリポジトリは、クラウドアプリケーションやさまざまな理由でよく使用されます。 画像には共有できないコンテンツが含まれている場合や、他の人にとって役に立たない場合があります。

このチュートリアルでは、docker-composedockerloginコマンドを使用してプライベートリポジトリにアクセスする方法について説明します。

2. docker loginを使用する

Dockerを使用する場合、ログインせずにパブリックイメージをプルして実行することがよくあります。 プライベートリポジトリにアクセスする必要がある場合にのみログインする必要があります

dockerloginコマンドを使用してインタラクティブにそれを行う方法を見てみましょう。

$ docker login
...
Username: myuser
Password: 

Login Succeeded
$
$ docker pull myuser/hello-world
Using default tag: latest
latest: Pulling from myuser/hello-world
Digest: sha256:...
Status: Downloaded newer image for myuser/hello-world:latest
docker.io/myuser/hello-world:latest

クレデンシャルを再度入力しなくても、後でDockerログインを実行できます。 これは、それらがすでに私たちのマシンに保存されているためです

デフォルトのイメージだけでなく、任意のDockerレジストリを使用してイメージを保存できます。 多くの場合無料でサービスとして提供される多くのDockerレジストリから選択できます。

別のレジストリにログインするには、 dockerloginコマンドの後にレジストリを追加するだけです。

$ docker login some-other-docker-registry.io

この新しいレジストリのクレデンシャルにログインすると、マシンに保存されます。 その後、両方のレジストリに同時にログインします。

後で画像にアクセスするときは、リポジトリに明示的に言及する必要があります。

$ docker pull some-other-docker-registry.io/hello-world

3. logindocker-composeにどのように役立つか

docker-compose は、マルチコンテナーdockerアプリケーションを起動するための便利なツールです。 これにより、異なるレジストリに保存されている場合でも、すべての画像を1つのファイルで定義できます。

さまざまなレジストリとアクセスレベルで作業する必要があるとしましょう。 この場合、docker-compose.ymlファイルが次のように始まる可能性があります。

version: '3'

services:
  public:
    image: hello-world
  private:
    image: myuser/hello-world
  other-registry:
    image: some-other-docker-registry.io/myuser/hello-world

例を簡略化するために、hello-worldイメージを使用しました。 これは、Dockerの使用を開始する方法のみを印刷し、直後に終了する公式イメージです。

最初の2つのサービスは、デフォルトのDockerレジストリ内のイメージを参照します。 1つ目はパブリックイメージで、2つ目はプライベートイメージです。 3番目のイメージは、別のレジストリのプライベートリポジトリに保存されます。

docker-composeを初めて使用する前に、両方のレジストリにログインする必要があります。 そうすれば、クレデンシャルがマシンに保存されます。

$ docker login
Login with your Docker ID ...
Username: myuser
Password:
Login Succeeded
$
$ docker login some-other-docker-registry.io
Username: myuser
Password:
Login Succeeded

そうして初めて、docker-composeですべてのサービスを開始できます。

$ docker-compose up
Creating network "login_default" with the default driver
...
public_1          | Hello from Docker!
public_1          | ...
other-registry_1  | Hello from Docker!
other-registry_1  | ...
login_public_1 exited with code 0
private_1         | Hello from Docker!
private_1         | ...
login_private_1 exited with code 0
login_other-registry_1 exited with code 0
$
$ docker-compose down
...

それでおしまい! docker-composeがさまざまなレジストリのプライベートリポジトリにアクセスできるようにしました。

上記の成功した出力と、ログインしていないときに発生するエラーを比較してみましょう。 まず、エラーを確認するために、ログアウトしてローカルにダウンロードした画像を削除する必要がありました。

$ docker logout
Removing login credentials for https://index.docker.io/v1/
$ docker image rm myuser/hello-world
...
$
$ docker-compose up
Creating network "login_default" with the default driver
Pulling private (myuser/hello-world:latest)...
ERROR: pull access denied for myuser/hello-world, repository does not exist or may require 'docker login':
denied: requested access to the resource is denied

4. 結論

この短い記事では、ログインして初めてプライベートリポジトリにアクセスできることを学びました。

また、 docker-compose には、レジストリごとに1回 dockerloginが必要であることもわかりました。 その後、docker-composeは常に機能します。