Докерский рой не обнажает порт - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь запустить Docker Swarm на одном узле, и у меня возникают проблемы с отображением порта приложения Docker для хоста.

Это похоже Порт службы Docker Swarm не выставлен , но я работаю на одном узле и предоставлю более подробную информацию по моему вопросу и исследованиям.

Например,учитывая следующий файл myapp.yml:

version: "3"
services:
  app:
    image: myapp
    ports: 
      - "8123:8123"

Стек запускается через

docker stack deploy -c myapp.yml myapp

После запуска стека, когда я пытаюсь получить доступ к порту(через завиток) это терпит неудачу.Например,

curl -v http://localhost:8123/myapp

показывает, что в соединении было отказано (на этом порту ничего не прослушивалось).

Код работает при использовании Docker Run

Следующая команда запускает образ и показывает, как проверить, открыт ли порт.

docker run -p 8123:8123 --name myapp myapp

Затем работает Curl.

curl -v http://localhost:8123/myapp

Дает вывод из приложения, работающего в Docker.

Когда я запускаю docker ps, вывод в разделе PORTS показывает: 0.0.0.0:8123:8123/tcp.

docker network inspect bridge - Показать, что док-контейнер назначен на bridge network.Сеть моста Docker по умолчанию используется с командой запуска Docker.

Команда docker port myapp показывает:

8123/tcp -> 0.0.0.0:8123

, что соответствует выводу docker ps ПОРТ поле.

при развертывании док-стека не открывается порт

После запуска docker stack deploy -c myapp.yml myapp я запускаю команду docker ps и вижу только 8123/tcp вполе PORTS вывода.

Команда docker port myapp не имеет вывода (что означает, что порты хоста Docker недоступны.

Когда я запускаю docker network lsЯ вижу:

NETWORK ID       NAME            DRIVER     SCOPE
1234567890      bridge           bridge     local
9999999999      myapp_default   overlay    swarm

Итак, я заметил, что сеть myapp_default находится в режиме, отличном от локального моста. Я попытался использовать существующую сеть bridge , но когдаЯ ссылался на сеть bridge в моем файле стека / компоновки. Я заметил, что сеть myapp_bridge была создана.

Итак, я прочитал о сети докеров https://blog.alexellis.io/docker-stacks-attachable-networks/ была хорошая рецензия.

До сих пор я не получил ее на работу, поэтому я набросал это, чтобы попросить suggestions / help.

ПРИМЕЧАНИЕ: Эта статья (от февраля 2017 г.) говорит, что она должна работать, но не отвечает на мой вопрос.

Я думаю, что я близок.

Ресурсы и другие связанные вопросы

https://docs.docker.com/v17.12/get-started/part5/ - это основная документация докера по технологии стека докеров.Но поиск на этой странице для сетей не показывает ничего полезного.

https://blog.alexellis.io/docker-stacks-attachable-networks/ - Хорошая запись.

Не открыт порт службы Docker Swarm - аналогичновопрос, который я задаю.

https://runnable.com/docker/basic-docker-networking - Пишите в сети Docker.Он говорит следующее при создании оверлейной сети (которая используется по умолчанию при использовании развертывания стека докеров).

Для этих сетей требуется действующая служба хранилища значений ключей, например Consul, Etcd или ZooKeeper.,Вы должны установить и настроить службу хранилища ключей-значений перед созданием сети.

Невозможно использовать определяемый пользователем мост в файле Swarm Comose Yaml .

1 Ответ

0 голосов
/ 29 января 2019

Вы должны определить сеть для своих услуг.В режиме Docker Swarm докер-контейнер становится «Сервисом», чтобы получить доступ к его порту, вы вызываете имя сервиса. Я предоставляю вам пример файла docker-compose, как подключить nginx и php-fpm

version: '3.2'
  services:
    nginx:
      image: nginx
      links:
      - php
      - mariadb:mysql
      ports:
      - "8880:80"
      networks:
      - frontend
      deploy:
        #mode: replicated
        replicas: 1
        placement:
          constraints: [node.role == manager]
    php:
       image: php
       deploy:
         #mode: replicated
         replicas: 1
         placement:
           constraints: [node.role == manager]
           #endpoint_mode: dnsrr
       links:
         - mariadb:mysql
    mariadb:
       image: mariadb:10.4.1
       #restart: always
       deploy:
         mode: replicated
         replicas: 1
         #placement:
         #constraints: [node.role == manage]
         environment:
           MYSQL_ROOT_PASSWORD: SECRET          
         volumes:
           - type: volume
              source: mydatabase
              target: /var/lib/mysql/data
              volume:
                nocopy: true # do not copy data from container when a volume is created?
    networks:
      frontend  
    volumes:
      mydatabase:
* 1003.* После того, как вы развернули (docker stack deploy -c docker-compose.yaml), чтобы увидеть список сервисов:
docker service ls 

Чтобы собрать nginx, как получить доступ к вашему файлу php-fpm, отредактируйте ваш файл конфигурации nginx:

location ~ \.php$ {
        try_files $uri =404;
        fastcgi_split_path_info ^(.+\.php)(/.+)$;
        fastcgi_pass **NAME_OF_PHP_SERVICE_IN SWARM**:9000;
        fastcgi_index index.php;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        include fastcgi_params;
    }

Вместо того, чтобы вводить IP-адрес вашего контейнера (IP: 9000), вы помещаете имя службы php в ваш кластер Swarm

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...