85438


Djangoの環境をDockerで作成したいと考えております。  
そのためDockerfileを下記のようにしました。

[code]

    FROM python:3.6-alpine
    ENV PYTHONUNBUFFERED 1
    RUN mkdir /app
    WORKDIR /app
    RUN pip install django==2.0
    COPY . /app
    EXPOSE 8000
    
[/code]

ビルド後、[Docker コンテナ内で動作する Web サーバにホスト OS からアクセスするには :
ポートフォワーディング](https://neos21.net/blog/2019/03/10-01.html)を参考に

[code]

    docker run -it --rm -p 8000:8000 --name コンテナ名 django /bin/ash
    
[/code]

を実行し、appディレクトリ移動後に

[code]

    python manage.py runserver
    
[/code]

により、サーバを立ち上げlocalhost:8000にアクセスしましたが"This page isn’t
working"が表示されるだけでした。curlコマンドでサーバがコンテナ内に立ち上がっていることは確認しました。  
続いて、[Dockerコンテナ内でlocalhostで起動するアプリに外部から接続する方法](https://www.codit.work/notes/7sgrfyoex15pt6njnjs9/)を参考にサーバ起動時に

[code]

    python manage.py コンテナネットワーク（172.XX.XX.XX）:8000
    
[/code]

を実行し、localhost:8000にアクセスしたところDjangoのwelcome pageが表示されました。

なぜ２つの記事の間で相違が出るのか理解できておりません。  
最初の参考URLで接続できているのに、同じように実行した際にホストマシンより接続できないのはDjango固有の問題なのでしょうか。それともポートフォワーディングとコンテナ内でサーバを立ち上げる際のポートは無関係なのでしょうか。


CC BY-SA 4.0
2021-12-31T19:51:34.137
85426
2022-01-02T00:01:56.987
30396
question
docker django
ホストマシンからdockerコンテナ内に接続したいが、ポートフォワーディングがうまくいかない


コンテナを起動した際のネットワークは次のリンク先の "bridge" 節の説明にあるとおりです:

  * [Docker network 概論](https://qiita.com/TsutomuNakamura/items/ed046ee21caca4a2ffd9) \- Qiita

> Linux bridge で仮想インタフェースを作成し、そのインタフェースに対してveth でDocker コンテナと接続する方式で、Docker
> ホストが属するネットワークとは異なる、仮想bridge 上のネットワークにコンテナを作成し、NAT 形式で外部のノードと通信する形式です。

django は、次のリンク先にあるとおり、デフォルトでは `127.0.0.1` で listen するため、外部ネットワーク(今回の場合は
host)のリクエストを受け付けないのでしょう。

  * [`django-admin` and `manage.py`](https://docs.djangoproject.com/en/dev/ref/django-admin/#runserver)

> Note that the default IP address, `127.0.0.1`, is not accessible from other
> machines on your network. To make your development server viewable to other
> machines on the network, use its own IP address (e.g. `192.168.2.1`) or
> `0.0.0.0` or `::` (with IPv6 enabled).

今回の事象については次のリンク先で順を追って説明されています:

  * [docker上のアプリにlocalhostでアクセスしたらERR_EMPTY_RESPONSEが出る](https://qiita.com/amuyikam/items/01a8c16e3ddbcc734a46) \- Qiita

* * *

コメントで提示されている追加の疑問点について:

`express-generator` で生成された雛形では
[`http`](https://nodejs.org/api/http.html#serverlisten) が利用されているようですが、

[code]

    var http = require('http');
    // 中略
    var server = http.createServer(app);
    server.listen(port);
    
[/code]

これは[デフォルト値が `0.0.0.0`](https://nodejs.org/api/net.html#serverlistenport-host-
backlog-callback) です(ので django とは異なりデフォルトで host からアクセス可能)。

> If host is omitted, the server will accept connections on the unspecified
> IPv6 address (`::`) when IPv6 is available, or the unspecified IPv4 address
> (`0.0.0.0`) otherwise.


CC BY-SA 4.0
2022-01-02T00:01:56.987
85438
2022-01-02T00:01:56.987
2808
85426
answer