La forma sencilla de acceder al nodo interno de Docker-swarm

La forma sencilla de acceder al nodo interno de Docker-swarm

Lo usé exposeen el archivo Docker y abrí el puerto.

Sin embargo, el problema persiste, la respuesta de @ BMitch portstambié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 lsy 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, portsfunciona 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_port8000 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 mancontenedor usando docker stack deployy 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.

información relacionada