Docker и Nginx разрешают неправильные IP-адреса

Я использую Dokku 0.9.4 на DigitalOcean для размещения нескольких серверов приложений Node.js (приложения: api, cms а также www). Вот что я делаю на установке свежих капель:

  1. Создавайте приложения через Dokku: dokku apps:create {app-name}
  2. Инициализируйте GIT-репозитории на моем компьютере для разработки и успешно разверните все 3 приложения на сервере.

В этот момент приложения работают, пока я не перезапущу сервер или не выполню service docker restart, После любого из этих двух проблем начинают возникать проблемы. Во-первых, приложения не доступны в течение одной или двух минут (когда я пытаюсь получить доступ к любому из этих приложений через {app-name}.domain.tld я собираюсь 502 Bad gateway (DNS обрабатывается Cloudflare). Затем, если он решит начать работу через несколько минут, кажется, что отображение приложения перепутано.

Например, если я попытаюсь открыть www.domain.tld Я на самом деле получаю ответ от api одновременно открывая приложение cms.domain.tld возвращается 502 Bad gateway,

Потратив весь вчерашний день, пытаясь определить проблему, я только что смог найти ее место, но я не понимаю, почему это происходит.

Бег docker networks inspect bridge дает следующий результат:

[
    {
        "Name": "bridge",
        "Id": "e9edc54047f3d93b9033706d17fd78355440470a090c8010577cfca6ef767946",
        "Created": "2017-12-12T09:16:52.784428035Z",
        "Scope": "local",
        "Driver": "bridge",
        "EnableIPv6": false,
        "IPAM": {
            "Driver": "default",
            "Options": null,
            "Config": [
                {
                    "Subnet": "172.17.0.0/16",
                    "Gateway": "172.17.0.1"
                }
            ]
        },
        "Internal": false,
        "Attachable": false,
        "Ingress": false,
        "Containers": {
            "28d7242a146a160dafc94b325439b6385bd49155dec9124e501daf88f8744740": {
                "Name": "www.web.1",
                "EndpointID": "26f276f07c983755f0baab9999292b23445d4cdf060328e9e1e3cd8914326310",
                "MacAddress": "02:42:ac:11:00:05",
                "IPv4Address": "172.17.0.5/16",
                "IPv6Address": ""
            },
            "32b2a15f8ccaff48e46f707bb9619d7d106fb18a0632483cc6db341d24d5b606": {
                "Name": "cms.web.1",
                "EndpointID": "a605bab5af1ec76c802537953b1869116d0ade37bdecf2f76c33c1592ee25b01",
                "MacAddress": "02:42:ac:11:00:07",
                "IPv4Address": "172.17.0.7/16",
                "IPv6Address": ""
            },
            "500bd73a805ef63d9b2eb4589b3abe4316b72f2d7e029d2dfc71886c6f6fc807": {
                "Name": "api.web.1",
                "EndpointID": "cd5f8ebd7f2c6dfc8b5828eed1f0a46336415ba8204f9b58270b18ae42aaf357",
                "MacAddress": "02:42:ac:11:00:08",
                "IPv4Address": "172.17.0.8/16",
                "IPv6Address": ""
            }
        },
        "Options": {
            "com.docker.network.bridge.default_bridge": "true",
            "com.docker.network.bridge.enable_icc": "true",
            "com.docker.network.bridge.enable_ip_masquerade": "true",
            "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
            "com.docker.network.bridge.name": "docker0",
            "com.docker.network.driver.mtu": "1500"
        },
        "Labels": {}
    }
]

Однако, если я проверю каждое приложение nginx.conf внутри /home/dokku/{app-name}/nginx.conf Я вижу, где проблема. Например, приложение api имеет следующее nginx.conf:

server {
  listen      [::]:80;
  listen      80;
  server_name api.tourlyapp.com;
  access_log  /var/log/nginx/api-access.log;
  error_log   /var/log/nginx/api-error.log;

  location    / {

    gzip on;
    gzip_min_length  1100;
    gzip_buffers  4 32k;
    gzip_types    text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml  application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
    gzip_vary on;
    gzip_comp_level  6;

    proxy_pass  http://api-5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
  include /home/dokku/api/nginx.conf.d/*.conf;

}

upstream api-5000 {

  server 172.17.0.5:5000;
}

в то время как приложение www имеет следующее nginx.conf:

server {
  listen      [::]:80;
  listen      80;
  server_name www.tourlyapp.com;
  access_log  /var/log/nginx/www-access.log;
  error_log   /var/log/nginx/www-error.log;

  location    / {

    gzip on;
    gzip_min_length  1100;
    gzip_buffers  4 32k;
    gzip_types    text/css text/javascript text/xml text/plain text/x-component application/javascript application/x-javascript application/json application/xml  application/rss+xml font/truetype application/x-font-ttf font/opentype application/vnd.ms-fontobject image/svg+xml;
    gzip_vary on;
    gzip_comp_level  6;

    proxy_pass  http://www-5000;
    proxy_http_version 1.1;
    proxy_set_header Upgrade $http_upgrade;
    proxy_set_header Connection "upgrade";
    proxy_set_header Host $http_host;
    proxy_set_header X-Forwarded-Proto $scheme;
    proxy_set_header X-Forwarded-For $remote_addr;
    proxy_set_header X-Forwarded-Port $server_port;
    proxy_set_header X-Request-Start $msec;
  }
  include /home/dokku/www/nginx.conf.d/*.conf;

  error_page 400 401 402 403 405 406 407 408 409 410 411 412 413 414 415 416 417 418 420 422 423 424 426 428 429 431 444 449 450 451 /400-error.html;
  location /400-error.html {
    root /var/lib/dokku/data/nginx-vhosts/dokku-errors;
    internal;
  }

  error_page 404 /404-error.html;
  location /404-error.html {
    root /var/lib/dokku/data/nginx-vhosts/dokku-errors;
    internal;
  }

  error_page 500 501 502 503 504 505 506 507 508 509 510 511 /500-error.html;
  location /500-error.html {
    root /var/lib/dokku/data/nginx-vhosts/dokku-errors;
    internal;
  }

}

upstream www-5000 {

  server 172.17.0.8:5000;
}

Помимо того, что мне почему-то неизвестно www приложение имеет больше записей внутри nginx.conf чем api Приложение также показывает, что IP-адреса перепутаны:

www приложение имеет восходящий IP-адрес, установленный на 172.17.0.8 в то время как этот IP-адрес назначается Docker api приложение.api приложение имеет восходящий IP-адрес, установленный на 172.17.0.8 и это тот же IP-адрес, назначенный ему Docker

Независимо от того, что я делаю, IP-адреса все еще не работают (я пытался dokku nginx:build-config www, Я пытался сделать самые простые приложения Node.js, и проблема не устранена, я пробовал установку новой капли и т. Д.).

Единственное, что заставляет все приложения работать правильно, это запуск dokku ps:restart {app-name}, Это волшебным образом заставляет его работать до следующей перезагрузки сервера.

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

1 ответ

Решение

Похоже, решение заключается в обновлении Dokku до версии. 0.11.0 где новый плагин network добавлен, который, помимо прочего, перестраивает IP-адреса после перезапуска службы Docker.

Связанные вопросы:

Другие вопросы по тегам