web-dev-qa-db-ja.com

Docker Desktop for Windows:Windowsコンテナーモードで公開ポートのサービスにアクセスできません

次のDockerfilesを使用して、Jenkinsを実行するコンテナーをWindows 10デスクトップのWindowsコンテナーで実行するコンテナーを作成しますDocker Desktop for Windowsバージョン17.03

FROM Microsoft/windowsservercore

RUN powershell -Command wget 'http://javadl.Oracle.com/webapps/download/AutoDL?BundleId=210185' -Outfile 'C:\jreinstaller.exe' ; Start-Process -filepath C:\jreinstaller.exe -passthru -wait -argumentlist "/s,INSTALLDIR=c:\Java\jre1.8.0_91" ; del C:\jreinstaller.exe

ENV Java_HOME c:\\Java\\jre1.8.0_91  
RUN setx PATH %PATH%;%Java_HOME%\bin

CMD [ "Java.exe" ]

このdockerファイルからイメージを作成します。

docker build -t windows-Java:jre1.8.0_91 .

これにJenkinsをインストールするために使用している2番目のDockerfile:

FROM windows-Java:jre1.8.0_91

ENV HOME /jenkins  
ENV JENKINS_VERSION 2.58  
RUN mkdir \jenkins  
RUN powershell -Command "wget -Uri https://updates.jenkins-ci.org/latest/jenkins.war -UseBasicParsing -OutFile /jenkins/jenkins.war"

EXPOSE 8080  
EXPOSE 50000  

CMD Java -jar C:\\jenkins\\jenkins.war


docker build -t jenkins-windows:2.0 .

次に、次のようにコンテナを起動します。

docker run --name jenkinsci -p 8080:8080 -p 50000:50000  jenkins-windows:2.0

コンテナーが正常に実行され、ログがすべて正常に表示されているのがわかります

PS C:\Users\mandeep\ringba\ringba-jenkins-setup-windows\jenkins-master> docker ps
CONTAINER ID        IMAGE                 COMMAND                  CREATED             STATUS              PORTS                                              NAMES
85ba2ef525a1        jenkins-windows:2.0   "cmd /S /C 'Java -..."   8 hours ago         Up 8 hours          0.0.0.0:8080->8080/tcp, 0.0.0.0:50000->50000/tcp   jenkinsci

ただし、ホストマシンのWebブラウザのhttp://localhost:8080で実行されているjenkinsサーバーにアクセスできません。

それが役立つかどうかはわかりませんが、同じマシンでLinux containerモードでdockerを実行していたときに、公式のdockerイメージを使用してhttp://localhost:8080のjenkinsサーバーにアクセスできました。

12
Mandeep Singh

これは現在、Windowsの既知の問題です。 localhost/127.0.0.1を使用して、自身のホストからコンテナーエンドポイントにアクセスすることはできません。 Dockerには、WindowsでLinuxコンテナーを実行するためのMoby/Linux実装に固有の特別な回避策が含まれているため、今日Linuxコンテナーを使用することは可能です。

現在、この問題の修正に取り組んでいますが、本日は次のいずれかの方法で回避することをお勧めします。

  • 別のホストからコンテナーエンドポイントにアクセスします。コンテナーを実行しているホストのIPアドレスと、そのホスト上のコンテナーの公開ポートを使用します。
  • または同じホストのコンテナーにアクセスし、コンテナーの内部IPアドレスと公開ポートを使用します(docker network inspect <network name>またはdocker exec <container ID> ipconfig>コンテナエンドポイント自体のIPアドレスを取得します)
12

@ Kallie-Microsoftの投稿を完了するには:

docs.docker.comがセクションで更新されましたlocalhostと公開ポートのWindowsコンテナーの制限


Docker for Windowsには、WindowsコンテナーとLinuxコンテナーを切り替えるオプションがあります。 Windowsコンテナーを使用している場合、Windowsの現在の実装により、ネットワークに関していくつかの制限があることに注意してくださいNAT(WinNAT)。これらの制限は、Windowsコンテナープロジェクトとして解決される可能性があります進化する。

すぐに遭遇する可能性があることの1つは、Windowsコンテナーの公開されたポートがローカルホストにループバックしないことです。代わりに、コンテナエンドポイントは、コンテナのIPおよびポートを使用してホストからのみ到達可能です。

したがって、Dockerを使用してイメージをプルし、次のようなコマンドでWebサーバーを実行するシナリオでは、

docker run -d -p 80:80 --name webserver nginx

Curl http:// localhost を使用するか、または http:// localhost でWebブラウザーをポイントすると、nginx Webページが表示されません(Linuxコンテナーの場合と同様)。

ローカルホストからWindowsコンテナーに到達するには、サービスを実行しているコンテナーのIPアドレスとポートを指定する必要があります。

いくつかの--formatオプションとコンテナーのIDまたは名前を指定したdocker inspectを使用して、コンテナーのIPアドレスを取得できます。上記の例の場合、コマンドは次のようになります。コンテナーIDの代わりにコンテナー(webserver)に付けた名前を使用します。

$ docker inspect \
  --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' \
  webserver
4
Alexandre Roux

この問題は以前ほど退屈ではないようです。以下のドキュメント https://docs.docker.com/engine/reference/run/#expose-incoming-ports コンテナのポートが必要なホストマシンでIPアドレスを指定できます露出する。

-p=[] : Publish a container's port or a range of ports to the Host
               format: ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort
               Both hostPort and containerPort can be specified as a
               range of ports. When specifying ranges for both, the
               number of container ports in the range must match the
               number of Host ports in the range, for example:
                   -p 1234-1236:1234-1236/tcp
               When specifying a range for hostPort only, the
               containerPort must not be a range.  In this case, the container port is published somewhere within the specified hostPort range. (e.g., `-p 1234-1236:1234/tcp`)
               (use 'docker port' to see the actual mapping)

おそらくそれは127.0.0.1であり、Windowsシステム上の公開されたDockerコンテナポートへのアクセスに関する問題を解決します。コンテナーを実行するときは、IPアドレスを指定して-pスイッチを使用するだけです。

docker run --rm -it -p 127.0.0.1:3000:3000 ubuntu:latest
0
Egeshi