

VirtulBox上にCentOSをインストールし、CentOS内でDockerを動かしております。  
以下の様なDockerfile作成後、ビルド→docker runを実行しましたが、ローカルPC（ホストPC）のブラウザから  
Docker内のアプリにアクセスしましたが接続できない状況です。

原因を調べてみると、ポートフォーワーディングの設定が必要とのことで以下のポートフォワーディングの設定を行いました。  
・ホストOSとVirtulBoxの5000ポートを紐づけ  
・VirtulBoxとコンテナの5000ポートの紐づけ

上記の設定を行っても、ローカルPCのブラウザから  
Docker内のアプリにアクセスしましたが接続できず困っております。

どなたかアドバイスの程、よろしくお願い致します。

[code]

    FROM ubuntu:bionic
    
    RUN apt update -y && apt install -y python3-pip python-dev
    
    # ローカルにあるファイルをコンテナ内にコピー
    COPY ./requirements.txt requirements.txt
    
    RUN pip3 install -r requirements.txt
    
    # 現在のディレクトリにあるファイル一覧をコンテナ内にコピーする
    COPY . .
    
    # 実行コマンド
    ENTRYPOINT ["python3"]
    
    # 上記に対する引数(python3 app.pyが実行される)
    CMD ["app.py"]
    
[/code]

[code]

    FROM ubuntu:bionic
    
    RUN apt update -y && apt install -y python3-pip python-dev
    
    # ローカルにあるファイルをコンテナ内にコピー
    COPY ./requirements.txt requirements.txt
    
    RUN pip3 install -r requirements.txt
    
    # 現在のディレクトリにあるファイル一覧をコンテナ内にコピーする
    COPY . .
    
    # 実行コマンド
    ENTRYPOINT ["python3"]
    
    # 上記に対する引数(python3 app.pyが実行される)
    CMD ["app.py"]
    
[/code]

ビルド実行

[code]

    docker build -t my_flask .
    
[/code]

[code]

    # 実行結果
    [+] Building 1.6s (10/10) FINISHED
     => [internal] load build definition from Dockerfile                       0.0s
     => => transferring dockerfile: 549B                                       0.0s
     => [internal] load .dockerignore                                          0.0s
     => => transferring context: 2B                                            0.0s
     => [internal] load metadata for docker.io/library/ubuntu:bionic           1.4s
     => [1/5] FROM docker.io/library/ubuntu:bionic@sha256:8aa9c2798215f99544d  0.0s
     => [internal] load build context                                          0.0s
     => => transferring context: 423B                                          0.0s
     => CACHED [2/5] RUN apt update -y && apt install -y python3-pip python-d  0.0s
     => CACHED [3/5] COPY ./requirements.txt requirements.txt                  0.0s
     => CACHED [4/5] RUN pip3 install -r requirements.txt                      0.0s
     => [5/5] COPY . .                                                         0.0s
     => exporting to image                                                     0.0s
     => => exporting layers                                                    0.0s
     => => writing image sha256:e0a22348a4d5f0358d482a71115172622ce66604ab0cf  0.0s
     => => naming to docker.io/library/my_flask                                0.0s
    [root@localhost flask_app]#
    
[/code]

イメージの確認

[code]

    REPOSITORY   TAG       IMAGE ID       CREATED              SIZE
    my_flask     latest    e0a22348a4d5   About a minute ago   562MB
    
[/code]

コンテナ起動

[code]

    docker run -it e0a22348a4d5
    
[/code]

起動結果メッセージ

[code]

    * Serving Flask app "app" (lazy loading)
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: off
     * Running on all addresses.
       WARNING: This is a development server. Do not use it in a production deployment.
     * Running on http://172.17.0.2:5000/ (Press CTRL+C to quit)
    
    
[/code]

自分のPCから、http://172.17.0.2:5000/へアクセスしても、  
このサイトにアクセスできません。172.17.0.2 からの応答時間が長すぎます。となってしまいます。


CC BY-SA 4.0
2023-05-01T23:59:00.400
94713
2023-05-04T00:58:44.193
question
linux docker
Docker内のアプリにPCから接続できない


まずは、VirtualBoxのネットワークをブリッジとしましょう  
それで、ゲストは、ホストのネットワークに直接接続される形となります。


CC BY-SA 4.0
2023-05-02T00:21:19.737
94714
2023-05-02T00:21:19.737
27481
94713
answer


## 回答

こちらの環境でも似たような現象が発生しました。  
最初はapp.runの実引数を`app.run(debug=True)`としていましたが、  
`app.run(host="0.0.0.0", port=5000, debug=True)`にすることにより現象は解消しました。

* * *

こちらの環境ではDockerを動かすOracle
VirtualBoxのVMにはネットワークアドレス`192.168.200.0`に属する固定IPを設定しています。  
今回は`192.168.200.115`です。  
ネットワークアドレス192.168.200.0に属するIPをホストオンリーアダプタにルーティングすることによってホストPCでのリクエストをVMにとばしています。  
ホストPCは業務のネットワークに接続することもあるため、ブリッジは使っていません。ホストPC内に閉じたネットワークを構成して動作確認を行っています。

* * *

## ファイル

  * Dockerfile

[code]

    FROM ubuntu:bionic
    RUN apt update -y && apt install -y python3-pip python-dev
    # ローカルにあるファイルをコンテナ内にコピー
    COPY ./requirements.txt requirements.txt
    RUN pip3 install -r requirements.txt
    # 現在のディレクトリにあるファイル一覧をコンテナ内にコピーする
    COPY . .
    # 実行コマンド
    ENTRYPOINT ["python3"]
    # 上記に対する引数(python3 app.pyが実行される)
    CMD ["app.py"]
    
[/code]

  * requirements.txt

[code]

    flask
    
[/code]

  * app.py

[code]

    from flask import Flask,render_template
    app = Flask(__name__)
    @app.route("/")
    def hello():
        return "Hello World"
    @app.route("/index")
    def index():
        return render_template("index.html")
    if __name__ == "__main__":
        # app.run(debug=True)
        app.run(host="0.0.0.0", port=5000, debug=True)
    
[/code]

* * *

### Dockerの操作

  * ビルド

[code]

    docker build -t my_flask .
    
[/code]

  * 起動

[code]

    docker run -p 5000:5000 -it my_flask
    
[/code]

[code]

     * Serving Flask app 'app' (lazy loading)
     * Environment: production
       WARNING: This is a development server. Do not use it in a production deployment.
       Use a production WSGI server instead.
     * Debug mode: on
     * Running on all addresses.
       WARNING: This is a development server. Do not use it in a production deployment.
     * Running on http://172.17.0.2:5000/ (Press CTRL+C to quit)
     * Restarting with stat
     * Debugger is active!
     * Debugger PIN: 586-744-614
    
[/code]

* * *

### Oracle VM VirtualBoxマネージャーの設定

  * ファイル - ツール - Network Manager

    * VirtualBox Host-Only Ethernet Adapter 
      * IPv4  
192.168.200.1

      * IPv4ネットマスク  
255.255.0.0

  * ノード選択 - 設定 - ネットワーク

    * アダプタ1  
NATネットワーク

    * アダプタ2  
ホストオンリーアダプタ

* * *

### VM(OS:CentOS Stream 9)の設定

  * IP(enp0s8) 固定IP  
inet 192.168.200.115/24

* * *

### ホスト(OS:Win10)の設定

  * ルーティング設定

[code]

    route add -p 192.168.200.0/24 192.168.200.1
    
[/code]

* * *

### 実行結果(ホストPC)

[code]

    >curl 192.168.200.115:5000
    Hello World
    
[/code]

[/code]

[code]


CC BY-SA 4.0
2023-05-04T00:58:44.193
94735
2023-05-04T00:58:44.193
35558
94713
answer