1. 概要

Dockerコンテナーを起動すると、「コンテナーで既に使用されている名前」エラーが発生する場合があります。

この短いチュートリアルでは、この一般的な問題を見ていきます。これは簡単に修正できます。 

まず、このエラーの原因を説明します 。 次に、その理由を説明します。 最後に、それを修正する方法を示します。

2. エラーの原因

2.1. Dockerイメージの取得

この例では、最初にDockerイメージを選択しましょう。

無料で公開されているNginxデモ画像を使用します。 NGINX は、次のような多くの企業で使用されている無料のオープンソースWebサーバーです。 Netflix CloudFare 、 と Airbnb 。 使用するDockerデモイメージは、ホスト名、IPアドレス、ポートなどのいくつかの基本的なプロパティを備えたWebページを提供します。

2.2. 複数のコンテナを実行してエラーを発生させる

エラーを発生させるには、同じ名前baeldung_nginxを使用する2つのインスタンスを実行する必要があります。

コンテナの名前さえ必要な理由を検討する価値があります。 名前は、実行中のコンテナーのリストに意味を追加するための便利な方法です。 さらに、名前はDockerネットワークで参照として使用できます。

最初のコンテナを始めましょう:

docker run --name baeldung_nginx -p 80:80 -d nginxdemos/hello:plain-text

コンテナはデタッチモードで実行されています。つまり、バックグラウンドで実行されます。 コンテナのポート80をホストマシンの同じポートに公開しています。 最後に、コンテナのカスタム名baeldung_nginxを指定しました。

ここで、ブラウザで http:// localhost を開くと、次のようなものが表示されます。

Server address: 123.45.6.7:80
Server name: e378ad49d49d
Date: 08/Apr/2022:22:08:44 +0000
URI: /
Request ID: 7bda7e3234cb6d1e51900fccc89320d5

次に、2番目のコンテナを実行してみましょう。 ホストポート80はすでに最初のコンテナによって使用されているため、2番目のインスタンスにポート81を割り当てます。

docker run --name baeldung_nginx -p 81:80 -d nginxdemos/hello:plain-text

残念ながら、これは機能しません。 エラーが発生します:

docker: Error response from daemon: Conflict. The container name "/baeldung_nginx" is already in use by container "76da8f6d3accc9b6d41c8a98fd492d4b8622804220ee628a438264b8cf4ae3d4". 
You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.

3. エラーの根本原因の説明

すべてのDockerコンテナには、一意の名前が割り当てられています。 dockerrunコマンドでオプションのname引数を使用しない場合、Dockerはランダムな名前を割り当てます。

この例では、同じ名前 baeldung_nginx、を2つの異なるコンテナーに割り当てたいと思いました。 同じDockerイメージを使用している場合でも、 dockerrunコマンドごとに新しいコンテナーが作成されることに注意してください。

2番目のコンテナはすでに使用されている名前を使用できなかったため、エラーが発生しました。

4. それを修正する方法

4.1. コンテナの再起動

このソリューションは、Dockerコンテナの名前が baeldung_nginx はすでにシステムに存在し、それが正しい状態です。 この場合、同じ名前の2つの異なるインスタンスは必要ありません。 代わりに、既存のコンテナを再起動します。

既存のコンテナを再起動するには、 使用する必要があります Dockerスタート の代わりに Docker Run 指図。 

Docker Run 画像の新しいコンテナを作成します。 同じイメージのクローンをできるだけ多く作成できます。 一方、 docker startは、以前に停止したコンテナを起動します。

したがって、既存のコンテナを再起動するほど新しいコンテナを起動しようとしていない可能性があります。その場合、これが解決策です。 ただし、既存のコンテナを新しいイメージで置き換えたい場合があります。

4.2. 既存のコンテナの削除

新しいコンテナに名前を引き継がせることが確実で、この名前の他のコンテナを停止した場合は、次の名前の前のコンテナを削除するだけです。

docker rm baeldung_nginx

残念ながら、このコマンドは常に機能するとは限りません。 たとえば、他のコンテナが正しく機能するには、コンテナが必要な場合があります。 その場合でもコンテナを削除したい場合は、removeコマンドでforceフラグを使用できます。

docker rm -f baeldung_nginx

以前のコンテナが削除されると、選択した名前で新しいコンテナを自由に起動できます。

4.3. コンテナに異なる名前を使用する

同じイメージの2つのインスタンスを実行したい場合はどうなりますか? この場合の解決策は簡単です。 ポートだけでなく、2つの異なる名前を使用するだけです。

docker run --name baeldung_nginx_1 -p 80:80 -d nginxdemos/hello:plain-text
docker run --name baeldung_nginx_2 -p 81:80 -d nginxdemos/hello:plain-text

次に、次のDockerコマンドを使用して、実行中のコンテナーを一覧表示します。

docker ps

これに似たものが表示されるはずです。

CONTAINER ID   IMAGE                         COMMAND                  CREATED          STATUS          PORTS                NAMES
f341bb9fe165   nginxdemos/hello:plain-text   "/docker-entrypoint.…"   2 seconds ago    Up 2 seconds    0.0.0.0:81->80/tcp   baeldung_nginx_2
33883c2b31a7   nginxdemos/hello:plain-text   "/docker-entrypoint.…"   12 seconds ago   Up 11 seconds   0.0.0.0:80->80/tcp   baeldung_nginx_1

5. 結論

この記事では、Dockerで「コンテナですでに使用されている名前」エラーを修正する方法を学びました。

まず、エラーを再現する方法を確認しました。 次に、エラーの根本的な原因を調べました。

最後に、問題を修正するための3つの異なる解決策を見ました。