Der einfache Weg, auf den Docker-Swarm innerhalb von Node zuzugreifen

Der einfache Weg, auf den Docker-Swarm innerhalb von Node zuzugreifen

Ich habe exposedie Docker-Datei verwendet und den Port geöffnet.

Das Problem tritt jedoch weiterhin auf. Die Antwort von @BMitch portsist auch in diesem Fall die erforderliche Lösung.

Vorerst ist mein erstes Problem gelöst. Vielen Dank.


Neuestes Update.

docker service lsIch habe mich beim Manager angemeldet und Dienste und Container überprüft docker container ls.

dann fand heraus

Der Service-Port ist geöffnet und der Container-Port nicht geöffnet.

Wenn Sie den Container manuell ausführen, können Sie Folgendes einstellen -p 8000:8000:

In diesem Fall wird der Container jedoch durch die YML-Stapelkonfiguration gestartet und portsfunktioniert für den Dienst, aber nicht für den Container.

Also, wie kann ich den Containerhafen öffnen?

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

Ich habe einige Dienste in Docker-Swarm.

Wenn ich den Dienst als global einstelle, kann er einfach aufgerufen werden

localhost:8000

Allerdings möchte ich von außen auf den Dienst in jedem Knoten zugreifen.

Ich brauche für diesen Fall die Grundpraxis.

Was ich getan habe, ist wie folgt

1) Ich habe das Overlay-Netzwerk erstellt

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

2) Öffnen Sie den Manager-Knoten-Port 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) Stellen Sie service_port8000 in den Diensten ein und stellen Sie die Netzwerke auf extern ein.

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

Funktioniert jedoch immer noch nicht.

Wo soll ich mehr einstellen??


Ich habe einige Stäbe ausprobiert, aber vergebens. Also habe ich die Methode testweise geändert.

Legen Sie meine Dienste auf einfachste Weise als global im Manager ab.

Auf die gleiche Weise kann ich auf phpMyAdmin und Visualizer zugreifen.

Aber auch in diesem Fall kann ich nicht auf localhost:8000 zugreifen

Ich befürchte, dass etwas die Ports in myapp/djangosrc blockiert??

Es könnte passieren??

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]

Antwort1

Ich gehe davon aus, dass Sie die zweite Compose-Datei mithilfe von im manContainer bereitgestellt haben docker stack deployund dass diese Datei die Version 3 oder höher hat.

Um von außerhalb auf den Port einer beliebigen Anwendung zuzugreifen, die innerhalb von Docker ausgeführt wird, müssen Sie diesen Port veröffentlichen:

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

Beachten Sie, dass es nicht notwendig ist, ein externes oder anschließbares Netzwerk mit Swarm zu verwenden, um auf den Port zuzugreifen. Mit Anschließbar können Sie andere Container außerhalb des Swarm-Modus im selben Netzwerk ausführen, und extern gibt einen vorhersehbaren Netzwerknamen ohne das Stapelnamenpräfix.

verwandte Informationen