SEワンタンの独学備忘録

IT関連の独学した内容や資格試験に対する取り組みの備忘録

【Docker】(超初心者向け)Dockerを初めて使用した際に発生したエラー対応

Dockerを初めてみようとしたのはいいものの実際に私が初めて使用したときに発生したものです。
↓の記事。

www.wantanblog.com


エラーが起きれば理解が深まる。
学習のためにやっているうちは教科書通りに実行してエラーが起きたら喜んでいきましょう。


私の場合はLinux(EC2)上にインストールしています。
その点はご承知おきください。

コンテナが起動できない

Dockerをインストールして、よしコンテナを起動しようとしたらさっそくエラー・・・

docker: Cannot connect to the Docker daemon at unix

単純にインストールした状態ではDockerが起動していない可能性があります。
インストールすると勝手に起動されますと書いてあったりもしたのですが・・・

ステータスを確認にして

sudo service docker status

docker is stopped

と表示される場合に起動しましょう。

sudo service docker start

これで行いたかった起動コマンドを再度実行します。

nginxコンテナが起動できない その①

nginxのDockerイメージをダウンロードして以下のコマンドでコンテナを起動させようとしました。

sudo docker container run --name webserver -d -p 80:80 nginx

エラー・・・

sudo docker container run --name webserver -d -p 80:80 nginx
docker: Error response from daemon: Conflict. The container name "/webserver" is already in use by container "a6558130aab43ef5c2bbc7a85b74c8f3629fa622ecea5ef8edf2a4bc9ea1ccbe". You have to remove (or rename) that container to be able to reuse that name.
See 'docker run --help'.
|

エラー内容を見るとなんとなくわかるかもしれないですが、指定した名前(今回の場合はwebserver)が既に使用されている可能性があります。

早々と対策に移りたくなりますが、冷静に現状を確認します。
まずは起動しているコンテナを確認します。

sudo docker ps

その後、停止しているコンテナも確認してみます。

sudo docker ps- a

どちらかの一覧に起動しようとしているコンテナの名前が表示されている場合には私と同じ事象である可能性が高いです。

そもそもあまり理解せずに使用していた以下の「run」コマンドはコンテナの起動コマンドであり生成コマンドでもあるので指定の名前でコンテナを生成させようとします。

sudo docker container run

なので既に存在している場合には重複となりエラーとなったのでしょう。
繰り返し実行していくとデーモンに溜まっていくらしいです。

対策としてはいくつか考えられます。

対策①
別の名前で起動する。
既にある名前でダメなら別名指定すればいいじゃんという発想です。
ただ、前のコンテナが無駄に残るし、明示的に前のコンテナを残したい場合でなければ根本的な解決にはならないでしょう。

対策②
既存のコンテナを削除する。
以下のコマンドでコンテナの削除を行います。
こちらも根本的な解決にならなそうですが、私と同じくここで躓くレベルならば削除コマンドを試してみるという意味で試してみてもよいと思います。

sudo docker rm [コンテナID]

ちなみにコンテナIDは「docker ps」コマンドで表示されていたものを指定すればOKです。

対策③
純粋な起動コマンドで起動する。
さきほど実行したrunコマンドは生成も含みますので2回目以降の実行にはこちらのstartコマンドを用いるのが普通みたいです。

sudo docker container start [コンテナ名]

反省点:コマンドの意味をしっかり理解しましょう。

nginxコンテナが起動できない その②

私の場合はさらにそこから続きがありました。

sudo docker container start [コンテナ名]

startコマンドを実行しても以下のエラー・・・

Error response from daemon: driver failed programming external connectivity on endpoint webserver (a1f63e0bf9b7bb1e3c47d53c914a883fcd326a48dff2901b779faaf68ed21217): Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
Error: failed to start containers: webserver

原因はまぁポート番号が衝突していると予測できるでしょう。

とりあえずホストのポート使用状況を確認してみましょう。

sudo lsof -i -P | grep "LISTEN"

以下のように80番ポートがApacheなどに使用されている場合は私と同じ事象の可能性があるでしょう。

httpd 14542 apache 4u IPv6 11771 0t0 TCP *:80 (LISTEN)

対策としては二つ考えられます。

対策①
別のホストポート番号を指定して起動する。
runコマンドまで立ち戻って、生成時の「-p」オプションは
「-p ホストのポート番号:コンテナのポート番号」
という指定なので前半部分を使用されていないポート番号に書き換えて再度実行してみます。

sudo docker container run --name webserver -d -p 8080:80 nginx

ブラウザなどから動作確認する場合にはポート番号を「:8080」で指定するのを忘れずに!
この辺の動作で内部のNAPTがイメージできますね。

対策②
ホストの80番ポートを使用しているサービスを停止する。

停止コマンド

sudo service httpd stop -k

httpd (80番ポートを使用しているサービス)が停止をしたのを確認したら再びコンテナの起動コマンドを実行します。

これでうまく起動はできました。