Ich habe expose
die Docker-Datei verwendet und den Port geöffnet.
Das Problem tritt jedoch weiterhin auf. Die Antwort von @BMitch ports
ist auch in diesem Fall die erforderliche Lösung.
Vorerst ist mein erstes Problem gelöst. Vielen Dank.
Neuestes Update.
docker service ls
Ich 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
ports
funktioniert 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_port
8000 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 man
Container bereitgestellt haben docker stack deploy
und 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.