나는 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_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은 스택 이름 접두사 없이 예측 가능한 네트워크 이름을 제공합니다.