Używam dockera (z nginx - docker-nginx-php-mysql) jako środowiska do uruchamiania aplikacji PHP. Próbuję dodać websocket do mojej aplikacji i mam problemy z konfiguracją do Dockerfile i docker-compose.yml

Mam plik serwera w cmd.php (lokalizacja: docker-nginx-php-mysql \ www \ ratchet_chatapp \ cmd.php):

<?php
require 'vendor/autoload.php';

use Ratchet\Server\IoServer;
use Ratchet\Http\HttpServer;
use Ratchet\WebSocket\WsServer;
use ChatApp\Chat;

$server = IoServer::factory(
    new HttpServer(
        new WsServer(
            new Chat()
        )
    ),
    8090
);

$server->run();

Używam połączenia, aby otworzyć gniazdo sieciowe na main.js (lokalizacja: docker-nginx-php-mysql \ www \ ratchet_chatapp \ js \ main.js) z:

var conn = new WebSocket('ws://localhost:8090');
    conn.onopen = function(e) {
        console.log("Connection established!");
    };

Mój plik Dockerfile (lokalizacja: docker-nginx-php-mysql \ php \ Dockerfile):

FROM php:7.3-fpm

RUN apt-get update && apt-get install -y libzip-dev libpng-dev git zip unzip libgd3 libgd-tools  libxml2 libxml2-dev mariadb-client && docker-php-ext-install pdo_mysql  mysqli gd soap zip

Mój docker-compose.yml (lokalizacja: docker-nginx-php-mysql):

version: "3"

services:
  nginx:
    build: ./nginx/
    ports:
        - 80:80
    links:
        - php
    volumes:
        - ./www:/var/www/html 
    networks:
        uln:
         ipv4_address: 10.6.0.2

  php:
    build: ./php/
    expose:
        - 9000
        - 8090
    links:
        - mysql
    volumes:
        - ./www:/var/www/html 
    networks:
        uln:
         ipv4_address: 10.6.0.3

  app:
    image: php:7.3-fpm
    volumes:
        - ./www:/var/www/html
    command: "true"

  mysql:
    image: mysql:5.7
    ports:
        - 3306:3306
    volumes:
        - ./mysql:/var/lib/mysql
    environment:
        MYSQL_ROOT_PASSWORD: secret
        MYSQL_DATABASE: webprog 
        MYSQL_USER: webprog 
        MYSQL_PASSWORD: webprog
    networks:
        uln:
         ipv4_address: 10.6.0.4

  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    ports:
        - 8080:80
    links:
        - mysql
    environment:
        PMA_HOST: mysql
    networks:
        uln:
         ipv4_address: 10.6.0.5

networks:
    uln:
     ipam:
        config:
         - subnet: 10.6.0.0/16

Próbowałem skonfigurować plik Dockerfile z EXPOSE 8090 i dodać go do yml, ale nadal nie działa. Jak mogę poprawnie zmienić plik Dockerfile i plik yml?

Dzięki!

-1
Ori Bentov 19 grudzień 2019, 21:32
Cześć @Ori, Twoje połączenie powinno wskazywać na adres Twojego kontenera, prawda?
 – 
Roberto Gonçalves
19 grudzień 2019, 23:33
Tak. jak mogę znaleźć adres kontenera?
 – 
Ori Bentov
20 grudzień 2019, 01:00
Jest to adres IP, który przypisałeś w swoim yml, lub możesz wykonać docker exec -it /bin/bash, aby wejść do swojego kontenera i znaleźć jego adres IP.
 – 
Roberto Gonçalves
20 grudzień 2019, 02:24
Nie możesz dotrzeć do niczego, czego nie publikujesz przy ustawieniu ports:; pamiętaj również, że Javascript na ogół działa w przeglądarce hosta i nie ma dostępu do sieci Dockera. Wewnętrzne adresy IP kontenera są bezużyteczne, z wyjątkiem jednej konkretnej konfiguracji platformy Docker i całkowicie je zignoruję (usuń je z pliku docker-compose.yml i nigdy ich nie wyszukaj).
 – 
David Maze
20 grudzień 2019, 04:14

1 odpowiedź

Twój port kontenera 8090 jest mapowany na port 9000 na serwerze lokalnym, więc powinieneś spróbować wskazać localhost: 9000, aby uzyskać dostęp do portu gniazda sieciowego kontenera, tj. Ws: // localhost: 9000

0
Daniel 20 grudzień 2019, 01:42