docker-composewithPrivateRepositoriesを使用する
1. 序章
プライベートDockerリポジトリは、クラウドアプリケーションやさまざまな理由でよく使用されます。 画像には共有できないコンテンツが含まれている場合や、他の人にとって役に立たない場合があります。
このチュートリアルでは、docker-composeがdockerloginコマンドを使用してプライベートリポジトリにアクセスする方法について説明します。
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レジストリから選択できます。
別のレジストリにログインするには、 dockerloginコマンドの後にレジストリを追加するだけです。
$ docker login some-other-docker-registry.io
この新しいレジストリのクレデンシャルにログインすると、マシンに保存されます。 その後、両方のレジストリに同時にログインします。
後で画像にアクセスするときは、リポジトリに明示的に言及する必要があります。
$ docker pull some-other-docker-registry.io/hello-world
3. loginがdocker-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は常に機能します。