複数のポートを持つコンテナーがあります。このドッカーの外部にあるポート(9001
)の1つにリモートアクセスしたいです。
172.17.0.1
172.19.0.23
です192.168.1.131
です私はそれについて検索し、expose port
キーワードを見つけましたが、実行しましたが機能しませんでした。
コンテナーを外部からアクセスできるようにするためにDockerポートを公開する方法
参照
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
を使用して、以前に許可するポートを設定しました
任意の助けいただければ幸いです。
以下の手順で問題が解決しました:
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"
実際にポートをマッピングする場合は、使用する必要があります
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