次の設定があります:
Dockerfile
FROM centos
MAINTAINER Eduar Tua <[email protected]>
RUN yum -y update && yum clean all
RUN yum -y install httpd && yum clean all
RUN echo "Apache works" >> /var/www/html/index.html
EXPOSE 80
ADD run-Apache.sh /run-Apache.sh
RUN chmod -v +x /run-Apache.sh
CMD ["/run-Apache.sh"]
Run-Apache.shスクリプト:
#!/bin/bash
rm -rf /run/httpd/* /tmp/httpd*
exec /usr/sbin/apachectl -D FOREGROUND
それから私はイメージをビルドします:
Sudo docker build --rm -t platzi/httpd .
その後
Sudo docker run -d -p 80:80 platzi/httpd
その後、80ポートのホストからの接続を受け入れるコンテナを実行しようとすると、次のようになります。
67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657
FATA[0002] Error response from daemon: Cannot start container 67ed31b50133adc7c745308058af3a6586a34ca9ac53299d721449dfa4996657: Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use
何か助けは?
エラーはかなりはっきりしているようです:
FATA [0002]デーモンからのエラー応答:コンテナを起動できません
「既に使用されているアドレス」と書いてあります。これは、システム上の何か(おそらくApacheのようなWebサーバー)がすでにポート80でリッスンしていることを意味します。次のいずれかを行う必要があります。
-p
のdocker run
引数で別のホストポートを選択する、または-p
引数を削除するだけです。Dockerは要求されたポート転送をセットアップできないため、コンテナーを起動しません。
オプション(a)と(b)はどちらも、コンテナーがホストのポート80にバインドできるようにします。これは、ホスト以外の場所からコンテナーにアクセスする場合にのみ必要です。
オプション(c)は、Docker Hostからコンテナーにアクセスしたいだけで、ローカルネットワークでコンテナーを公開したくない場合に便利です。この場合、dockerによって割り当てられたコンテナーIPアドレスを使用します。これは、docker inspect
を実行して出力を閲覧するか、次のように実行することで取得できます。
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id
ポート80がビジーであると言っています...これを実行して、ポート80を使用しているユーザーを確認します
Sudo netstat -tlnp | grep 80
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1380/nginx -g daemo
tcp6 0 0 :::80 :::* LISTEN 1380/nginx -g daemo
右端までスクロールして、ポート80を保持しているプロセスの問題のあるPIDを確認します...そのPID 1380なので、プロセスリストを実行してそのpidを確認しましょう
ps -eaf | grep 1380
root 1380 1 0 11:33 ? 00:00:00 nginx: master process /usr/sbin/nginx -g daemon on; master_process on;
ポート80を解放する問題のあるプロセスを破棄する
Sudo kill 1380 # if you know the pid ( 1380 for example )
__または__
Sudo fuser -k 80/tcp # just kill whatever pid is using port 80 tcp
上記を実行した後もまだビジーと言っている場合は、おそらく殺したプロセスが自動的に再起動された場合、そのウォッチャーを終了する必要がありますが、netstat出力からプロセスツリーを上に移動して、この親プロセスを特定し、それも殺すことができます。
Ubuntuを実行している場合は、実行します
Sudo /etc/init.d/Apache2 stop
次に、Dockerイメージをリロードします
docker reload
私はそのような解決策を見つけました:
$ docker stop container_name
$ docker commit container_name image_name
$ docker rm container_name
次に、イメージから新しいコンテナを作成できます。
$ docker run -d -P --name container_name_the_same_or_new image_name
そして今は動作します。