web-dev-qa-db-ja.com

ホストからDockerコンテナーのWebサーバーにアクセスする方法

Boot2docker 1.3.1で実行しています。

uwsgi --http :8080経由でWebサーバーを実行するDockerコンテナーがあります。

コンテナに接続すると、lynx http://127.0.0.1:8080を使用してWebサイトを閲覧できるため、サーバーが機能していることがわかります。

コンテナを次のように実行しました:

$ docker run -itP --expose 8080 uwsgi_app:0.2

次の詳細があります。

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS                     NAMES
5248ad86596d        uwsgi_app:0.2     "bash"              11 minutes ago      Up 11 minutes       0.0.0.0:49159->8080/tcp   cocky_hypatia
$ docker inspect --format '{{ .NetworkSettings.IPAddress }}' 5248ad86596d
172.17.0.107

http://172.17.0.107:49159にアクセスして、ホストからそのWebサイトにアクセスできると思いました。

これは動作しません。 Chromeに「接続しています...」と表示され、どこにも行きません。

私は何を間違えていますか?

53
Anentropic

わかりました、私は愚かな、私はboot2dockerのドキュメントで答えを見つけました https://docs.docker.com/installation/mac/#container-port-redirection

コンテナのIPではなく、boot2docker vmのIPアドレスを使用する必要がありました。

$ boot2docker ip
192.168.59.103

http://192.168.59.103:49159/のホストからサイトを閲覧できます

ホストにrouteを追加する必要はありませんでした

35
Anentropic

拡張 Anentropic'sanswerboot2dockerはMacおよびWindows用の古いアプリで、docker-machineは新しいアプリです。

まず、マシンをリストします。

$ docker-machine ls

NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100:2376

次に、いずれかのマシン(デフォルトのマシンはdefaultと呼ばれます)を選択します。

$ docker-machine ip default

192.168.99.100
92
HankCa

コンテナのIPアドレスを見つけるには、追加インストールなしが必要です。

docker inspect <container>

これは豊富な情報を提供します。 grepそれはIPアドレスです。

10
JellicleCat

here で説明されているように、boot2dockerポートマッピングオプション-Lを使用できます。

だから、あなたの場合は

boot2docker ssh -L 0.0.0.0:8080:localhost:8080

その後

docker run -it -p 8080:8080 uwsgi_app:0.2

そうすれば、boot2dockerのIPアドレスを使用する必要はありません。localhostまたは独自のIPアドレスを使用できます(また、Dockerコンテナには外部からアクセスできます)。

4
Magic Wand

同じ問題があり、私の場合はAWS EC2インスタンスを使用していました。コンテナIPを試してみましたが、うまくいきませんでした。次に、AWSホストの実際のパブリックIPをIPとして使用しましたが、機能しました。

1
Siva Dorai

Boot2dockerは時代遅れですが、同じコンテナがLinuxでも動作する場合でも、WindowsまたはMacのDockerでこの問題が発生する可能性があります。 1つの症状は、コンテナ内のサーバーのページにアクセスしようとすると、「接続できませんでした」ではなく、「データを送信しませんでした」というエラーが表示されることです。

その場合、Win/Macでは コンテナホストは独自のIPを持っています であり、Linuxのようにローカルホストではない可能性があります。 IP 0.0.0.0でDjangoを実行してみてください。つまり、次のように、すべてのIPからの接続を受け入れます。

python manage.py runserver 0.0.0.0:8000

または、サーバーがローカルリクエスト(nginx、Apache、gunicornなどのローカルプロキシなど)にのみ応答するようにする必要がある場合は、hostname -iによって返されるホストIPを使用できます。

そして、-pコマンドでdocker runポート転送オプション を正しく使用していることを確認してください。

すべてが正常であると仮定すると、ホストマシンで実行されているブラウザで http:// localhost でサーバーにアクセスできるはずです。

1
Jonathan Stray

[編集:元のバージョンは問題の-Pを無視していました]

ポートを「公開」せずにコンテナにアクセスしたい場合(番号を変更する場合)、適切なランスルー here があります。

重要なのは次の行です。

Sudo route -n add 172.17.0.0/16 172.16.0.11

これは、DockerコンテナがオンになっているVirtualBox VM内のプライベートネットワークにルーティングする方法をMacに指示します。

1
Bryan

ローカルホストブラウザーでホストアプリケーションの問題をトラブルシューティングする方法

この場合、以下のコマンドでコンテナを起動します。私の場合は次のとおりです。

[root@centoslab3 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
1b81d8a0e3e1        centos:baseweb      "/bin/bash"         8 minutes ago       Exited (0) 24 seconds ago                       webtest
[root@centoslab3 ~]# docker run --name=atul -v /root/dockertest:/var/www/html -i -t -p 5000:8000 centos:baseweb /bin/bash

Httpd構成:

[root@adb28b08c9ed /]# cd /etc/httpd/conf
[root@adb28b08c9ed conf]# ll
total 52
-rw-r--r--. 1 root root 34419 Sep 19 15:16 httpd.conf

リスナでポート8000​​を使用してファイルを編集し、サーバー名の下のコンテナIPとポートを更新します。

Httpdサービスを再起動すると完了です。

お役に立てれば

0
Atul