ノード内のdocker-swarmにアクセスする簡単な方法

ノード内のdocker-swarmにアクセスする簡単な方法

docker ファイルで使用してexposeポートを開きます。

しかし、それでもまだ問題は発生します。portsこの場合も、@BMitch の回答が必要な解決策となります。

今のところ、最初の問題は解決しました。ありがとうございます。


最新のアップデート。

マネージャーにログインして、サービスdocker service lsとコンテナを確認しましたdocker container ls

そして発見した

サービス ポートは開いていますが、コンテナー ポートは開いていません。

コンテナを手動で実行する場合は、次のように設定できます-p 8000:8000

ただし、この場合、コンテナはスタック構成 yml によって起動され、 portsサービスでは機能しますが、コンテナでは機能しません。

では、コンテナのポートを開くにはどうすればよいのでしょうか?

docker service ls

t402qi5kqifz        django_python           global              1/1                 registry:5000/myapp/djangosrc:latest   *:8000->8000/tcp
yadtkm6nhwdc        phpmyadmin_phpmyadmin   global              1/1                 phpmyadmin/phpmyadmin:latest             *:8009->80/tcp
3mvzc1rjc8pg        visualizer_app          global              1/1                 dockersamples/visualizer:latest          *:9009->8080/tcp

docker container ls

CONTAINER ID        IMAGE                                    COMMAND                  CREATED             STATUS                 PORTS               NAMES
1d2b50730959        registry:5000/myapp/djangosrc:latest   "uwsgi --socket :800…"   2 minutes ago       Up 2 minutes                               django_python.ne4qcvhmmtchn3popj26plcmz.20txv4hixixgsvwzw23jmhqln
fd5d42cd5fd6        dockersamples/visualizer:latest          "npm start"              2 hours ago         Up 2 hours (healthy)   8080/tcp            visualizer_app.ne4qcvhmmtchn3popj26plcmz.o60n8gzbxod6p6rmznvpls4z6
fd28f1efd77d        phpmyadmin/phpmyadmin:latest             "/docker-entrypoint.…"   2 hours ago         Up 2 hours             80/tcp              phpmyadmin_phpmyadmin.ne4qcvhmmtchn3popj26plcmz.v1flhjuez68lmhb9erlsoz8wc

docker-swarm にいくつかのサービスがあります。

サービスをグローバルに設定すると、簡単にアクセスできます

localhost:8000

ただし、外部から各ノードのサービスにアクセスしたいと考えています。

この場合は基礎練習が必要です。

私がやったことは以下の通りだ

1) オーバーレイネットワークを作った

docker container exec -it man docker network create --driver=overlay --attachable djangonet

2) マネージャーノードのポート 8000:8000 を開く

version: "3"
services:
  registry:
    container_name: reg
    image: registry:2.6
    ports:
      - 5000:5000
    volumes:
      - "./registry-data:/var/lib/registry"
  manager:
    container_name: man
    image: docker:18.05.0-ce-dind
    privileged: true
    ports:
      - 8000:8000 ## here
      - 8082:8082
      - 9009:9009
    depends_on:
      - registry
    expose:
      - 3375
    command: "--insecure-registry registry:5000"
    volumes:
      - "./stack:/stack"
  node01:
    container_name: node01
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"
  node02:
    container_name: node02
    image: docker:18.05.0-ce-dind
    privileged: true
    tty: true
    depends_on:
      - manager
      - registry
    expose:
      - 7946
      - 7946/udp
      - 4789/udp
    command: "--insecure-registry registry:5000"

3)service_portサービスに 8000 を設定し、ネットワークを外部に設定します。

services:
  python:
    image: registry:5000/myapp/djangosrc:latest
    environment:
      SERVICE_PORTS: 8000
    networks:
      - djangonet
    deploy:
      replicas: 1
      placement:
        constraints: [node.role != manager]
networks:
  djangonet:
    external: true

しかし、まだ動作しません。

さらにどこに設定すればいいでしょうか??


いくつかのスタッフを試していますが、無駄です。そのため、テスト目的で方法を変更します。

最も簡単な方法で、マネージャー上でサービスをグローバルとして設定します。

同じ方法で、phpmyadmin と visualizer にアクセスできます。

しかし、この場合でもlocalhost:8000にアクセスすることはできません

myapp/djangosrc のポートが何かブロックされているのではないかと思います。

それは起こるかもしれない??

w7g3h9poppb4        django_python           global              1/1                 registry:5000/myapp/djangosrc:latest   *:8000->8000/tcp
yadtkm6nhwdc        phpmyadmin_phpmyadmin   global              1/1                 phpmyadmin/phpmyadmin:latest             *:8009->80/tcp
3mvzc1rjc8pg        visualizer_app          global              1/1                 dockersamples/visualizer:latest          *:9009->8080/tcp



version: '3'
services:
  python:
    image: registry:5000/myapp/djangosrc:latest
    #command: uwsgi --socket :8001 --module myapp.wsgi --py-autoreload 1 --logto /tmp/mylog.log

    ports:
      - 8000:8000
    deploy:
      mode: global
      placement:
        constraints: [node.role == manager]

答え1

man2 番目の Compose ファイルをを使用してコンテナー内にデプロイしdocker stack deploy、このファイルのバージョンが 3 以上であると想定しています。

外部から docker 内で実行されているアプリケーションのポートにアクセスするには、そのポートを公開する必要があります。

version: '3'
services:
  python:
    image: registry:5000/myapp/djangosrc:latest
    environment:
      SERVICE_PORTS: 8000
    # include the below ports section to publish a port
    ports:
      - 8000:8000
    networks:
      - djangonet
    deploy:
      replicas: 1
      placement:
        constraints: [node.role != manager]
networks:
  djangonet:
    external: true

ポートにアクセスするために、swarm で外部または接続可能なネットワークを使用する必要はありません。接続可能を使用すると、同じネットワーク上で swarm モードの外部で他のコンテナを実行でき、外部を使用すると、スタック名のプレフィックスのない予測可能なネットワーク名が提供されます。

関連情報