Простой способ получить доступ к внутреннему узлу docker-swarm

Простой способ получить доступ к внутреннему узлу docker-swarm

Я использовал exposeфайл Docker и открыл порт.

Однако проблема все равно возникает, ответ @BMitch portsтакже является необходимым решением в этом случае.

На данный момент моя первая проблема решена. Большое спасибо.


Последнее обновление.

Я вошел в менеджер и проверил службы 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_port8000 и настроить внешние сети.

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

Я предполагаю, что вы развернули второй файл Compose внутри контейнера manс помощью 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. Attachable позволяет запускать другие контейнеры вне режима swarm в той же сети, а external дает предсказуемое сетевое имя без префикса имени стека.

Связанный контент