最初にチュートリアルを実行し、コンテナ内のチュートリアルから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
仮想マシンを実行する前にオフにしました。次にスイッチを入れても何も変わりません。ロールバックしました。
それはばかげた間違いでした。すべてがdockerでうまく機能しました。
問題はFlaskアプリで、デフォルトではローカルホストのみをリッスンしています。ネットワークをリッスンさせるには、設定する必要があります
app.run(Host = '0.0.0.0')
それで、これがすべてがどのように機能するかです:
boot2docker ssh
を使用してSSHで接続できます。docker exec -it bash
今、あなたはコンテナの中にいます。 ifconfig
またはip addr show
を実行して、コンテナのIPを確認できます。
0.0.0.0:49155->5000/tcp
にdocker ps
が表示されている場合は、5000になります)curl container_ip:container_port
私にとっては接続を拒否しましたが、コンテナ自体からcurl localhost:5000
を介して接続できました
それが私がそれを理解した方法です。