web-dev-qa-db-ja.com

docker-composeを使用してdocker / containerの外部でコンテナーポートを公開する方法

複数のポートを持つコンテナーがあります。このドッカーの外部にあるポート(9001)の1つにリモートアクセスしたいです。

  • 私のdocker IPは:172.17.0.1
  • 私のコンテナIPは172.19.0.23です
  • 私のサーバーIPは192.168.1.131です

私はそれについて検索し、expose portキーワードを見つけましたが、実行しましたが機能しませんでした。

コンテナーを外部からアクセスできるようにするためにDockerポートを公開する方法
参照


これは私のdocker-composeファイルです:

version: '3'

services:
  nginx:
      image: nginx:latest
      container_name: nginx
      ports:
        - "8010:8010"

      volumes:
        - .:/code
        - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

      links:
        - ivms

      restart: unless-stopped

  ivms:
      build: .
      container_name: ivms
      command: bash bashes/createDB.sh
      volumes:
        - .:/code
      expose:
        - "8010"
        - "9001"  # exposed disired port
      ports:
        - "9001:9001"

上記のdocker-composeファイルで実行します:$ docker-compose up -d

  • しかしserver_IP:9001 --> 192.168.1.131:9001またはdocker_IP:9001 --> 172.17.0.1:9001を使用すると、それにアクセスできません(リモートモードまたはローカルモード)。
  • しかしcontainer_IP:9001 --> 172.19.0.23:9001を使用すると、これはローカルで機能します。

server_IP:9001 --> 192.168.1.131:9001にアクセスするにはどうすればよいですか?


[[〜#〜]ノート[〜#〜]]:

  • createDB.shでは、ZMQ on 9001 portの作成など、いくつかの操作を実行します。

  • $ ufw allow 9001を使用して、以前に許可するポートを設定しました

  • Ubuntu 16.04とUbuntu-Server 16.04を試しました

任意の助けいただければ幸いです。

7
Benyamin Jafari

以下の手順で問題が解決しました:

ZMQアプリ(ivmsコンテナー内)では、次のようにサーバーIPから接続のバインドに使用しました。

import zmq

if __name__ == '__main__':
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.setsockopt(zmq.SUBSCRIBE, "")
    socket.bind("tcp://192.168.1.131:9001")  # doesn't work with server or docker IP

    while True:
        data = socket.recv_json()

それは以下のようにのみ機能していました:

socket.bind("tcp://192.168.1.131:9001")  # works, but can't access as remote

今、私はこの行を次のように編集しました:

socket.bind("tcp://*:9001")  # Works both locally and remotely.

そして、これは私のdocker-compose.yml設定です:

version: '3'

services:
  nginx:
      image: nginx:latest
      container_name: nginx
      ports:
        - "8010:8010"

      volumes:
        - .:/code
        - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

      links:
        - ivms

      restart: unless-stopped

  ivms:
      build: .
      container_name: ivms
      command: bash bashes/createDB.sh
      volumes:
        - .:/code
      expose:
        - "8010"
      ports:
        - "9001:9001"
0
Benyamin Jafari

実際にポートをマッピングする場合は、使用する必要があります

ivms:
  build: .
  container_name: ivms
  command: bash bashes/createDB.sh
  volumes:
    - .:/code
  ports:
    - "8010:8010"
    - "9001:9001"  # now you can access them locally

これら2つのサービスivmsとnginxに同じポートを使用していることを警告

EXPOSE命令は、コンテナーが実行時に指定されたネットワークポートでリッスンすることをDockerに通知します。ポートがリッスンするTCPまたはUDPのいずれであるかを指定できます。プロトコルが指定されていない場合、デフォルトはTCPです。

EXPOSE命令は実際にはポートを公開しません。これは、イメージを作成する人とコンテナを実行する人の間の一種のドキュメントとして機能します。ポートについては、公開する予定です。 -Docker Docs

1
g3org3