Lo usé expose
en el archivo Docker y abrí el puerto.
Sin embargo, el problema persiste, la respuesta de @ BMitch ports
también es la solución necesaria en este caso.
Por ahora, mi primer problema está resuelto. muchas gracias.
Última actualización.
Inicié sesión como administrador y verifiqué los servicios docker service ls
y contenedores docker container ls
.
luego descubrí
El puerto de servicio está abierto y el puerto de contenedores no está abierto.
Al ejecutar el contenedor manualmente, puede configurarlo como -p 8000:8000
.
Sin embargo, en este caso, el contenedor se inicia mediante la configuración de pila yml,
ports
funciona para el servicio pero no para el contenedor.
Entonces, ¿cómo puedo abrir el puerto del contenedor?
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
Tengo algunos servicios en Docker-swarm.
si pongo el servicio como global, se puede acceder a él simplemente
localhost:8000
Sin embargo, quiero acceder al servicio en cada nodo desde el exterior.
Necesito la práctica básica para este caso.
Lo que he hecho es así a continuación.
1) Hice la red superpuesta
docker container exec -it man docker network create --driver=overlay --attachable djangonet
2) abrir el puerto del nodo administrador 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) configurar service_port
8000 en servicios y configurar redes externas.
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
Sin embargo, todavía no funciona.
¿Dónde debería configurar más?
Estoy probando algunos bastones pero es en vano. Entonces cambio la forma para fines de prueba.
Poner mis servicios como globales en el gestor de la forma más sencilla.
De la misma manera puedo acceder a phpmyadmin y visualizador.
Pero incluso en este caso no puedo acceder a localhost:8000
Me temo que hay algo que bloquea los puertos en myapp/djangosrc.
¿Podría pasar?
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]
Respuesta1
Supongo que implementó el segundo archivo de redacción dentro del man
contenedor usando docker stack deploy
y que este archivo tiene una versión 3 o superior.
Para acceder a un puerto de cualquier aplicación que se ejecute dentro de Docker desde afuera, debe publicar ese puerto:
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
Tenga en cuenta que no es necesario utilizar una red externa o conectable con swarm para acceder al puerto. Adjuntable le permite ejecutar otros contenedores fuera del modo enjambre en la misma red, y externo proporciona un nombre de red predecible sin el prefijo del nombre de la pila.