Docker + webdevops: «Этот сайт недоступен» - PullRequest
5 голосов
/ 25 октября 2019

В текущем проекте я использую Docker. Я должен уточнить, что я довольно неопытен в этом.

Мой проект - проект PHP / Symfony. До этого я использовал nginx:alpine и phpdocker/php-fpm, чтобы мой проект работал в моей среде разработки. Тем не менее, я обнаружил, что они непригодны для моего случая, так как моя продукция фактически использует Apache.

Я обнаружил, что другой проект, который я использую, без проблем использует образы Docker webdevops. Я хочу заменить два перечисленных выше контейнера на один - образ докера webdevops/php-apache-dev:alpine.

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

Этот сайт не может быть достигнут - 172.18.0.7 отказался подключиться.

(Я также использую Traefik, но маршрутизируемый URI не работаетчто-то лучше. Сообщение об ошибке немного отличается: Bad Gateway).

Я не могу отладить это. Я даже не знаю, где искать.

Ниже приведена конфигурация docker-compose.yml, которую я хочу использовать:

version: '3.2'

services:
  app:
    image: webdevops/php-apache-dev:alpine
    container_name: my-app
    working_dir: /app
    env_file: .env
    environment:
      WEB_DOCUMENT_ROOT: /public
      WEB_DOCUMENT_INDEX: index.php

      LOG_STDOUT: ./var/log/app.stdout.log
      LOG_STDERR: ./var/log/app.stderr.log

      # @todo list of unwanted PHP modules, cf. https://dockerfile.readthedocs.io/en/latest/content/DockerImages/dockerfiles/php-apache-dev.html#php-modules
      # PHP_DISMOD:

      php.error_reporting: E_ALL
      PHP_DISPLAY_ERRORS: 1

      PHP_POST_MAX_SIZE: 80M
      PHP_UPLOAD_MAX_FILESIZE: 200M
      PHP_MEMORY_LIMIT: 521M
      PHP_MAX_EXECUTION_TIME: 300

      PHP_DATE_TIMEZONE: Europe/Paris
    volumes:
        - .:/app
        # - ./docker/apache2/conf.d:/opt/docker/etc/httpd/conf.d
        - ~/.ssh:/home/application/.ssh:ro
        - ~/.composer:/home/application/.composer
    depends_on:
      - elasticsearch
      - database

Другие контейнеры работают так же, как и раньше. Это единственный сбой.

При вызове docker-compose up ошибка не выдается. Все журналы, которые я мог найти в контейнере, хранят молчание. Насколько я могу судить, Traefik, похоже, не является проблемой. Вот результат docker ps:

[/var/www/html/citizen-game]$ docker ps                                                                                              *[master] 
CONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS                 PORTS                                                                                        NAMES
6e9639e7a84d        webdevops/php-apache-dev:alpine                       "/entrypoint supervi…"   4 hours ago         Up 4 hours             80/tcp, 443/tcp, 9000/tcp                                                                    my-app-app
be1b90fdf768        docker.elastic.co/elasticsearch/elasticsearch:6.2.4   "/usr/local/bin/dock…"   4 hours ago         Up 4 hours (healthy)   9200/tcp, 9300/tcp                                                                           my-app-elasticsearch
76fb8743a12f        phpmyadmin/phpmyadmin                                 "/run.sh supervisord…"   4 hours ago         Up 4 hours             80/tcp, 9000/tcp                                                                             my-app-phpmyadmin
dd41b4afe267        mysql:5.7                                             "docker-entrypoint.s…"   4 hours ago         Up 4 hours (healthy)   3306/tcp, 33060/tcp                                                                          my-app-database
91893783bcb1        rabbitmq:3.7-management                               "docker-entrypoint.s…"   4 hours ago         Up 4 hours             4369/tcp, 5671/tcp, 0.0.0.0:5672->5672/tcp, 15671/tcp, 25672/tcp, 0.0.0.0:15672->15672/tcp   my-app-rabbitmq
63f551884bbf        traefik:maroilles                                     "/traefik --web --do…"   4 hours ago         Up 4 hours             0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->8080/tcp 

У меня вопрос, наверное, как это отладить? Я что-то упускаю из виду?

Редактировать

Вот (часть) содержимое файла docker-compose.override.yml:

version: '3.2'

services:
    app:
      volumes:
        - ~/.ssh:/home/application/.ssh
        - ~/.composer:/home/application/.composer
      labels:
        - "traefik.backend=my-app"
        - "traefik.frontend.rule=Host:my-app.docker"
        - "traefik.docker.network=proxy"
      networks:
        - internal
        - proxy
      environment:
        PHP_DEBUGGER: xdebug
        #XDEBUG_REMOTE_HOST: <your host IP address>
        XDEBUG_REMOTE_PORT: 9000
        XDEBUG_REMOTE_AUTOSTART: 1
        XDEBUG_REMOTE_CONNECT_BACK: 1
        XDEBUG_PROFILER_ENABLE: 1
        XDEBUG_PROFILER_ENABLE_TRIGGER: 1000

    traefik:
      image: traefik
      container_name: citizen-game-traefik
      command: --web --docker --docker.domain=docker --logLevel=DEBUG
      ports:
        - "80:80"
        - "443:443"
        - "8080:8080"
      volumes:
        - /var/run/docker.sock:/var/run/docker.sock
      restart: always
      networks:
        - internal
        - proxy

    rabbitmq:
      networks:
        - internal
        - proxy

networks:
    proxy:
      external:
        name: traefik
    internal:

РЕДАКТИРОВАТЬ 2:

@ Мостафа

Я запустил следующее:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-app-app

Результат:

172.18.0.7172.19.0.5

Пробуем этипрямо из браузера не получается "Этот сайт не доступен". Полагаю, этого следовало ожидать.

Я запустил следующее изнутри контейнера:

bash-4.4# supervisorctl status apache:apached
apache:apached                   RUNNING   pid 13575, uptime 0:00:00

Как и предполагалось, я использовал ss -plant | grep 80. Это не работает изнутри контейнера. Вот результат при вызове за его пределы:

[/var/www/html/my-app]$ ss -plant | grep 80                                                                 
LISTEN      0        80              127.0.0.1:3306              0.0.0.0:*                                                                                      
ESTAB       0        0            192.168.1.88:39360      198.252.206.25:443     users:(("chromium-browse",pid=4203,fd=80))                                     
SYN-SENT    0        1            192.168.1.88:50680     192.241.181.178:443     users:(("chromium-browse",pid=4203,fd=41))                                     
LISTEN      0        128                     *:80                      *:*                                                                                      
LISTEN      0        128                     *:8080                    *:*

Я не уверен, что это говорит о многом. Я пытался установить ss изнутри контейнера с apk, но:

bash-4.4# apk add ss
ERROR: unsatisfiable constraints:
  ss (missing):
    required by: world[ss]

РЕДАКТИРОВАТЬ 3:

Вот результат вызова netstat:

bash-4.4# netstat -plant
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      229/sshd
tcp        0      0 127.0.0.1:25            0.0.0.0:*               LISTEN      -
tcp        0      0 127.0.0.11:32843        0.0.0.0:*               LISTEN      -
tcp        0      0 :::22                   :::*                    LISTEN      229/sshd
tcp        0      0 :::9000                 :::*                    LISTEN      225/php-fpm.conf)

bash-4.4# netstat -plant | grep httpd
(nothing)

Я не уверен, насколько это помогает, поскольку мой другой проект, который работает, дает тот же результат n bash-4.4# netstat -plant | grep httpd. Однако без grep он включает в себя гораздо больше строк.

1 Ответ

2 голосов
/ 06 ноября 2019

В выводе, который вы опубликовали, описаны открытые порты 80,443,9000 для контейнера из этого изображения webdevops/php-apache-dev:alpine

Затем вы можете получить доступ к контейнеру, используя его IP-адрес непосредственно из браузера. Итак, сначала вам необходимо убедиться в следующем:

  • Проверьте, является ли 172.18.0.7 фактическим IP-адресом контейнера my-app-app, используйте следующую команду для проверки IP-адреса вашего работающего контейнера
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' my-app-app

Или просто docker inspect my-app-app, чтобы получить всю информацию о контейнере

  • Проверьте журналы на my-app-app, и вам может потребоваться ввести сам контейнер и проверить, является ли Apacheвыполняется с помощью следующей команды supervisorctl, которая сообщит вам о состоянии apache service
$ supervisorctl status apache:apached
apache:apached                   RUNNING   pid 72, uptime 0:07:43

Если apache работает правильно, вы сможете просматривать содержимое с помощьюIP контейнера, в моем случае это дает мне что-то вроде этого, поскольку у меня нет действительного приложения

enter image description here

Относительно вашей проблемы с traefik, котораяэто Bad Gateway, потому что traefik само по себе не может связаться с вашим бэкэнд-сервисом, который в нашем случае является контейнером my-app-app. вам нужно убедиться, что traefik и my-app-app находятся в одной сети или, по крайней мере, они могут пропинговать IP-адреса друг друга

Обновление:

Вместо ss получаетсяобраз содержит команду netstat, чтобы проверить, какой порт используется Apache, вы можете сделать следующее изнутри контейнера:

# netstat -plant | grep httpd
tcp        0      0 :::80                   :::*                    LISTEN      98/httpd
tcp        0      0 :::443                  :::*                    LISTEN      98/httpd
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...