web-dev-qa-db-ja.com

ホストからのトラフィックを受け入れるDockerコンテナーを実行する

次の設定があります:
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

何か助けは?

16
eduartua

エラーはかなりはっきりしているようです:

FATA [0002]デーモンからのエラー応答:コンテナを起動できません

「既に使用されているアドレス」と書いてあります。これは、システム上の何か(おそらくApacheのようなWebサーバー)がすでにポート80でリッスンしていることを意味します。次のいずれかを行う必要があります。

  • webサーバーを停止します。
  • -pdocker run引数で別のホストポートを選択する、または
  • -p引数を削除するだけです。

Dockerは要求されたポート転送をセットアップできないため、コンテナーを起動しません。

オプション(a)と(b)はどちらも、コンテナーがホストのポート80にバインドできるようにします。これは、ホスト以外の場所からコンテナーにアクセスする場合にのみ必要です。

オプション(c)は、Docker Hostからコンテナーにアクセスしたいだけで、ローカルネットワークでコンテナーを公開したくない場合に便利です。この場合、dockerによって割り当てられたコンテナーIPアドレスを使用します。これは、docker inspectを実行して出力を閲覧するか、次のように実行することで取得できます。

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_id
15
larsks

ポート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出力からプロセスツリーを上に移動して、この親プロセスを特定し、それも殺すことができます。

21
Scott Stensland

Ubuntuを実行している場合は、実行します

Sudo /etc/init.d/Apache2 stop

次に、Dockerイメージをリロードします

docker reload
9
Maurice Elagu

私はそのような解決策を見つけました:

$ 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

そして今は動作します。

0
Kasia Kasia