web-dev-qa-db-ja.com

Mac OSXでDockerポートの公開に失敗する

最初にチュートリアルを実行し、コンテナ内のチュートリアルからflaskアプリを開始しました。それは機能しました。

seraf$ docker run -d -P training/webapp python app.py

次に、仮想マシンのIPを

seraf$ boot2docker ip
192.168.59.103

そして、http://192.168.59.103:49157のサンプルアプリにアクセスできます。

チュートリアルのイメージDockerfileは次のとおりです。

FROM ubuntu:12.04
MAINTAINER Docker Education Team <[email protected]>
RUN apt-get update
RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q curl python-all python-pip wget
ADD ./webapp /opt/webapp/
WORKDIR /opt/webapp
RUN pip install -r requirements.txt
EXPOSE 5000
CMD ["python", "app.py"]

現在、Dockerコンテナ内で独自のflaskアプリを実行しようとしています。イメージを作成しています:

FROM ubuntu:12.04
MAINTAINER Serafim Suhenky <[email protected]>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update
RUN apt-get install -y python-dev
RUN apt-get install -y python-pip
RUN pip install gunicorn
RUN pip install flask
#VOLUME /web
ADD ./casa-web /web
WORKDIR /web
EXPOSE 5000
ENTRYPOINT python casa-web.py

次に、コンテナを作成します。

docker run -d -P seraf1m/web-app

または、より単純な画像の場合:

docker run -d -P seraf1m/web-app python casa-web.py

またはこれ:

docker run -d -p 5000:5000 seraf1m/web-app python casa-web.py

そして、これまでのところすべてがうまくいっています。コンテナが起動し、ポートが公開され、アプリのログを確認できます。

しかし、http://192.168.59.103:49158またはdocker psが表示する他のポートを介してアプリにアクセスできません。

同時に、チュートリアルアプリにアクセスできました。

私の画像の何が問題になっている可能性がありますか?多分仮想マシンで何か?

seraf$ docker -v
Docker version 1.5.0, build a8a31ef

私もこの修正を試しました。それがどのように機能するかわからない:

#!/bin/bash
for i in {49000..49900}; do
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "tcp-port$i,tcp,,$i,,$i";
 VBoxManage modifyvm "boot2docker-vm" --natpf1 "udp-port$i,udp,,$i,,$i";
done

仮想マシンを実行する前にオフにしました。次にスイッチを入れても何も変わりません。ロールバックしました。

8
Serafim Suhenky

それはばかげた間違いでした。すべてがdockerでうまく機能しました。

問題はFlaskアプリで、デフォルトではローカルホストのみをリッスンしています。ネットワークをリッスンさせるには、設定する必要があります

app.run(Host = '0.0.0.0')

それで、これがすべてがどのように機能するかです:

  1. Boot2dockerは仮想マシンをMacにインストールします。 boot2docker sshを使用してSSHで接続できます。
  2. その仮想マシンは、実行中のコンテナへのゲートウェイのようなものです。各コンテナは、そのゲートウェイの背後にある仮想PCです。 vmにSSH接続した場合は、コンテナーにpingを実行できます。コンテナのIPを見つけるには、コンテナに添付する必要があります

docker exec -it bash

今、あなたはコンテナの中にいます。 ifconfigまたはip addr showを実行して、コンテナのIPを確認できます。

  1. コンテナのIPを取得したら、VMからpingを実行できます。そして、公開されたポートに接続してみてください。 (0.0.0.0:49155->5000/tcpdocker psが表示されている場合は、5000になります)

curl container_ip:container_port

私にとっては接続を拒否しましたが、コンテナ自体からcurl localhost:5000を介して接続できました

それが私がそれを理解した方法です。

9
Serafim Suhenky