Я использовал 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 и 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 дает предсказуемое сетевое имя без префикса имени стека.