Docker swarm не отображает порты правильно - проблемы с подключением - PullRequest
0 голосов
/ 31 декабря 2018

Я следую руководству по докеру, и я нахожусь на часть 4: рои , которая включает в себя настройку роя между двумя виртуальными машинами.Я думаю, что рой неправильно отображает порты моего контейнера.Когда я запускаю приложение с роем, я не могу подключиться к своему приложению, когда пытаюсь посетить IP-адрес, предоставленный моей виртуальной машиной.Однако, если я вручную запускаю приложение, когда SSH-соединение с виртуальной машиной, я могу получить к нему доступ.

Причина, по которой я считаю, что Swarm неправильно отображает порты, заключается в том, что когда я развернул приложение через Swarm, я попытался просмотреть сопоставления портов контейнера, выполнив что-то вроде docker port CONTAINER_NAME, и ничего не отобразилось.После развертывания вручную и запуска этой команды для указанного контейнера я вижу что-то вроде 80 / tcp -> 0.0.0.0:80

Например, вот что происходит, когда я пытаюсь использовать curl

curl 192.168.99.100:80
curl: (7) Failed to connect to 192.168.99.100 port 80: Connection refused 

Я сделал этот пост некоторое время назад, в котором более подробно, но это осталось без ответа, и я думаю, что новая информация, которую я имею, может быть более полезной.

Что нене работает

Когда я пытаюсь развернуть w / swarm docker stack deploy -c docker-compose.yml getstartedlab, я не могу подключиться к приложению через веб-браузер или curl.Я считаю, что все было развернуто правильно, потому что я могу запустить docker stack ps getstartedlab и просмотреть все службы, работающие и распределенные между двумя моими виртуальными машинами.

Что работает

Я взялвниз по стеку с помощью docker stack rm getstartedlab, затем я ssh'd в два виртуальных компьютера, которые я создал, и вручную запустил приложение, указав сопоставление портов следующим образом:

docker run -p 80:80 -td myusername/get-started:part2

Затем перейдя к 192.168.99.100, я смог увидетьприложение и больше не было проблем с подключением.Я почти уверен, что это означает, что это проблема Docker, а не проблема виртуальной машины.

Другая информация - может быть полезна

Вот мой файл docker-compose.yml.Я пробовал порты с "4000: 80" и "80:80"

version: "3"
services:
  web:
    image: myusername/get-started:part2
    deploy:
      replicas: 5
      resources:
        limits:
          cpus: "0.1"
          memory: 50M
      restart_policy:
        condition: on-failure
    ports:
      - "4000:80"
    networks:
      - webnet
networks:
  webnet:

Подводя итог, я не могу получить доступ к приложению, когда пытаюсь запустить его с помощью роя.Если я запускаю вручную из виртуальной машины и указываю сопоставление портов (без использования роя), я могу получить доступ к приложению с IP-адреса виртуальной машины.

Обновления

Я удалил работающий стек, перезапустил виртуальные машины и перезапустился с docker stack deploy -c docker-compose.yml getstartedlab

$ docker service ls
ID                  NAME                MODE                REPLICAS            IMAGE                         PORTS
4kn46vue9ka3        getstartedlab_web   replicated          5/5                 myusername/get-started:part2   *:4000->80/tcp

$ docker service ps 4kn46vue9ka3
ID                  NAME                  IMAGE                         NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
a34u4jijc5d6        getstartedlab_web.1   myusername/get-started:part2   myvm1               Running             Running 20 minutes ago                       
8fvukpo95ko4        getstartedlab_web.2   myusername/get-started:part2   myvm2               Running             Running 20 minutes ago                       
lywca2zwtjfa        getstartedlab_web.3   myusername/get-started:part2   myvm2               Running             Running 20 minutes ago                       
u3cw40tjmujb        getstartedlab_web.4   myusername/get-started:part2   myvm1               Running             Running 20 minutes ago                       
c0tiyxu5o5x5        getstartedlab_web.5   myusername/get-started:part2   myvm2               Running             Running 20 minutes ago  

Вот журналы

$ docker service logs 4kn46vue9ka3
getstartedlab_web.4.u3cw40tjmujb@myvm1    |  * Serving Flask app "app" (lazy loading)
getstartedlab_web.4.u3cw40tjmujb@myvm1    |  * Environment: production
getstartedlab_web.4.u3cw40tjmujb@myvm1    |    WARNING: Do not use the development server in a production environment.
getstartedlab_web.4.u3cw40tjmujb@myvm1    |    Use a production WSGI server instead.
getstartedlab_web.4.u3cw40tjmujb@myvm1    |  * Debug mode: off
getstartedlab_web.4.u3cw40tjmujb@myvm1    |  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
getstartedlab_web.1.a34u4jijc5d6@myvm1    |  * Serving Flask app "app" (lazy loading)
getstartedlab_web.1.a34u4jijc5d6@myvm1    |  * Environment: production
getstartedlab_web.1.a34u4jijc5d6@myvm1    |    WARNING: Do not use the development server in a production environment.
getstartedlab_web.1.a34u4jijc5d6@myvm1    |    Use a production WSGI server instead.
getstartedlab_web.1.a34u4jijc5d6@myvm1    |  * Debug mode: off
getstartedlab_web.1.a34u4jijc5d6@myvm1    |  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
getstartedlab_web.3.lywca2zwtjfa@myvm2    |  * Serving Flask app "app" (lazy loading)
getstartedlab_web.3.lywca2zwtjfa@myvm2    |  * Environment: production
getstartedlab_web.3.lywca2zwtjfa@myvm2    |    WARNING: Do not use the development server in a production environment.
getstartedlab_web.3.lywca2zwtjfa@myvm2    |    Use a production WSGI server instead.
getstartedlab_web.3.lywca2zwtjfa@myvm2    |  * Debug mode: off
getstartedlab_web.3.lywca2zwtjfa@myvm2    |  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
getstartedlab_web.2.8fvukpo95ko4@myvm2    |  * Serving Flask app "app" (lazy loading)
getstartedlab_web.2.8fvukpo95ko4@myvm2    |  * Environment: production
getstartedlab_web.2.8fvukpo95ko4@myvm2    |    WARNING: Do not use the development server in a production environment.
getstartedlab_web.2.8fvukpo95ko4@myvm2    |    Use a production WSGI server instead.
getstartedlab_web.2.8fvukpo95ko4@myvm2    |  * Debug mode: off
getstartedlab_web.2.8fvukpo95ko4@myvm2    |  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)
getstartedlab_web.5.c0tiyxu5o5x5@myvm2    |  * Serving Flask app "app" (lazy loading)
getstartedlab_web.5.c0tiyxu5o5x5@myvm2    |  * Environment: production
getstartedlab_web.5.c0tiyxu5o5x5@myvm2    |    WARNING: Do not use the development server in a production environment.
getstartedlab_web.5.c0tiyxu5o5x5@myvm2    |    Use a production WSGI server instead.
getstartedlab_web.5.c0tiyxu5o5x5@myvm2    |  * Debug mode: off
getstartedlab_web.5.c0tiyxu5o5x5@myvm2    |  * Running on http://0.0.0.0:80/ (Press CTRL+C to quit)

Я запустил это как с локального компьютера, так и с виртуальной машины, результаты были одинаковыми

$ docker container exec getstartedlab_web.1.a34u4jijc5d69m7rqry1jpfo9 curl http://127.0.0.1
OCI runtime exec failed: exec failed: container_linux.go:348: starting container process caused "exec: \"curl\": executable file not found in $PATH": unknown

Я также запустил рой только с одним узлом, но мне все равно не удалось подключиться к 192.168.99.100 /

$ docker-machine ssh myvm2
docker@myvm2:~$ docker swarm leave

Затем снова на моей локальной машине

$ docker-machine stop myvm2
$ docker stack deploy -c docker-compose.yml getstartedlab
$ docker node ls
ID                            HOSTNAME            STATUS              AVAILABILITY        MANAGER STATUS      ENGINE VERSION
gjkde7aw2rznl9y68zti3lqrj *   myvm1               Ready               Active              Leader              18.09.0
qu6qymppl1msxatll9m0sh7tn     myvm2               Down                Active                                  18.09.0
$ docker stack ps getstartedlab
ID                  NAME                  IMAGE                         NODE                DESIRED STATE       CURRENT STATE            ERROR               PORTS
vr0w3riw1cnz        getstartedlab_web.1   myusername/get-started:part2   myvm1               Running             Running 22 seconds ago                       
pvr93rqi64dw        getstartedlab_web.2   myusername/get-started:part2   myvm1               Running             Running 22 seconds ago                       
gucfa7asiwvx        getstartedlab_web.3   myusername/get-started:part2   myvm1               Running             Running 22 seconds ago                       
qzarr6jc5hzk        getstartedlab_web.4   myusername/get-started:part2   myvm1               Running             Running 22 seconds ago                       
p0hszupsl8wj        getstartedlab_web.5   myusername/get-started:part2   myvm1               Running             Running 22 seconds ago   

Я также проверил журналы, и нигде не было никаких признаков myvm2, как и ожидалось.

Больше обновлений

Я удалил все изображения, контейнеры, виртуальные машины и т. Д. И запустил руководство с самого начала.Чтобы убедиться, что старый код / ​​конфигурации не использовались, я назвал vm myvm3, и теперь образ снова запускается.На этот раз я запустил только один VM как кластер с одним узлом.Все еще не повезло, у меня та же ошибка "отказано в соединении"

$ docker-machine ls
NAME    ACTIVE   DRIVER       STATE     URL                         SWARM   DOCKER     ERRORS
myvm3   *        virtualbox   Running   tcp://192.168.99.102:2376           v18.09.0   


$ docker stack ps getstartedlab
ID                  NAME                  IMAGE                               NODE                DESIRED STATE       CURRENT STATE           ERROR               PORTS
hnbqdo9k3val        getstartedlab_web.1   myusername/get-started-again:part2   myvm3               Running             Running 7 minutes ago                       
bwc0ga954poo        getstartedlab_web.2   myusername/get-started-again:part2   myvm3               Running             Running 7 minutes ago                       
aleioewe4ivx        getstartedlab_web.3   myusername/get-started-again:part2   myvm3               Running             Running 7 minutes ago                       
fzys3tihrf0t        getstartedlab_web.4   myusername/get-started-again:part2   myvm3               Running             Running 7 minutes ago                       
4jyzzao11z96        getstartedlab_web.5   myusername/get-started-again:part2   myvm3               Running             Running 7 minutes ago                       
...