노드 내부의 docker-swarm에 액세스하는 간단한 방법

노드 내부의 docker-swarm에 액세스하는 간단한 방법

나는 exposedocker 파일을 사용하고 포트를 열었습니다.

그러나 여전히 문제가 발생하지만 @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_port서비스에 8000을 설정하고 외부 네트워크를 설정합니다.

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과 시각화 도구에 액세스할 수 있습니다.

하지만 이 경우에도 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

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을 사용하면 동일한 네트워크의 스웜 모드 외부에서 다른 컨테이너를 실행할 수 있으며, external은 스택 이름 접두사 없이 예측 가능한 네트워크 이름을 제공합니다.

관련 정보