Docker web и apis отказываются от соединения - PullRequest
0 голосов
/ 09 сентября 2018

Я довольно новичок в докере.Я создал docker-compose, у которого есть 1 основной сайт приложения (laravel) и 2 apis.

Я пытаюсь получить доступ к API с сайта laravel, но продолжаю получать:

cURL error 7: Failed to connect to 0.0.0.0 port 8082: Connection refused (see http://curl.haxx.se/libcurl/c/libcurl-errors.html)

мой docker-compose.yml:

version: '3'
services:
  web:
    image: nginx:1.10
    volumes:
    - ./vhost.conf:/etc/nginx/conf.d/default.conf
    ports:
    - "8080:80"
    depends_on:
    - app
    restart: always

  app:
    build: . #run the dockerfile to install whatever
    env_file: .env
    volumes:
    - ./:/var/www
    depends_on:
    - database

  web-api2:
    image: nginx:1.10
    volumes:
    - ../api/api2/vhost.conf:/etc/nginx/conf.d/default.conf
    ports:
    - "8081:81"
    depends_on:
    - app-api2

  app-api2:
    build: . #run the dockerfile to install whatever
    env_file: .env
    volumes:
    - ../api/api2:/var/www
    depends_on:
    - database

  web-api1:
    image: nginx:1.10
    volumes:
    - ../api/api1/vhost.conf:/etc/nginx/conf.d/default.conf
    ports:
    - "8082:82"
    depends_on:
    - app-api1

  app-api1:
    build: . #run the dockerfile to install whatever
    env_file: ../api/api1/.env
    volumes:
    - ../api/api1:/var/www
    depends_on:
    - database

  database:
    image: mysql:5.7
    environment:
    - "MYSQL_ROOT_PASSWORD=IAmSoSecure"
    - "MYSQL_DATABASE=my_app"
    ports:
    - "33061:3306"
    volumes:
    - my_app:/var/lib/mysql
    restart: always


volumes:
  wildfire:

I 'Я изучал сетевое взаимодействие с докером, но мои попытки провалилисьУ меня есть настройка сети, и я попытался использовать подсети, но это не помогло:

"IPAM": {
        "Driver": "default",
        "Options": {},
        "Config": [
            {
                "Subnet": "172.18.0.0/16",
                "Gateway": "172.18.0.1"
            }
        ]
    },

Я попытался получить доступ к портам, которые я включил:

"Ports": {
            "443/tcp": null,
            "80/tcp": null,
            "82/tcp": [
                {
                    "HostIp": "0.0.0.0",
                    "HostPort": "8082"
                }
            ]
        },

Iя запрашиваю звонок как обычно через Guzzle:

$client = new Client();
$res = $client->get('127.0.0.1:8082/accounts');
dd($res->getBody()->getContents());

Я пробовал разные IP-адреса, но не могу найти правильный для использования.

Мой текущий vhost.conf:

server {
listen 80;
index index.php server.php;
root /var/www/public;

add_header X-Frame-Options "SAMEORIGIN";
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options "nosniff";

index index.html server.php index.php;

charset utf-8;

location / {
    try_files $uri $uri/ /index.php?$query_string;
}

location = /favicon.ico { access_log off; log_not_found off; }
location = /robots.txt  { access_log off; log_not_found off; }

error_page 404 /index.php;

location ~ \.php$ {
    fastcgi_split_path_info ^(.+\.php)(/.+)$;
    fastcgi_pass app:9000;
    fastcgi_index index.php;
    include fastcgi_params;
    fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
    #fastcgi_param PATH_INFO $fastcgi_path_info;
    include fastcgi_params;
    include  /etc/nginx/mime.types;
}

location ~ /\.(?!well-known).* {
    deny all;
}

location ~ \.css {
    add_header  Content-Type    text/css;
}

location ~ \.js {
    add_header  Content-Type    application/x-javascript;
}
}

Ответы [ 3 ]

0 голосов
/ 09 сентября 2018

В сети по умолчанию, которую создает docker compose, каждый контейнер, управляемый оркестратором, доступен по имени службы, которое совпадает с именем, данным ему в файле docker-compose.yaml. Таким образом, в вашем случае каждый контейнер в той же сети может достигать app-api2, поскольку ваш вопрос уточняется с помощью:

http://app-api2:82/accounts

Для более полного ответа с помощью 127.0.0.1 из вашего контейнера означает, что вы пытаетесь обратиться к службе, которая находится внутри самого контейнера, и прослушиваете, в вашем случае, 82. Поскольку у вас нет других исполняемых файлов, работающих в том же контейнере и прослушивающих этот порт, вы правильно получаете Connection refused.

Вам также может быть полезно знать, что вам не нужно строго выставлять порты из вашего файла docker-compose.yaml для других контейнеров в той же сети для связи. Открытые порты позволяют вам делать запросы с хост-машины (где на самом деле вы будете использовать 127.0.0.1).

Если по какой-либо причине вы хотите использовать IP-адрес контейнера для связи между контейнерами, вы можете найти текущий IP-адрес для конкретного контейнера, используя docker inspect <container name>. Однако обратите внимание, что этот IP-адрес является эфемерным и, вероятно, будет меняться при каждом вращении контейнера.

Более подробную информацию можно найти https://docs.docker.com/compose/networking

0 голосов
/ 10 сентября 2018

Чтобы исправить эту проблему, я изменил URL-адрес, на который смотрел:

$client = new Client();
$res = $client->get('**http://web-api2:82/accounts**');
dd($res->getBody()->getContents());

Я также изменил номер порта на 8082 для лучшей практики. Это отражено и в моем docker-compose.yml так:

web 8080:8080
web-api1 8081:8081
web-api2 8082:8082

Спасибо всем за ответы!

0 голосов
/ 09 сентября 2018

В вашем докере вы запускаете 3 nginx: web, web-api2 и web-api1.

Из того, что вы пишете, web-api2 прослушивает порт 81 и web-api1 - порт 82.

Если вы хотите из приложения в web получить доступ к API, вам нужно будет использовать:

http://web-api2:81/...
http://web-api1:82/...

Обратите внимание, что со своего локального компьютера вы будете использовать http://localhost:8081 и http://localhost:8082 при сопоставлении порта 8081 с 81 на web-api2 и с 8082 на 82 на web-api1.

...