Есть приложение чата (mysql, nodejs, socket.io, apache), запускал на сервере - всё работало. Потребовалось перенести в докер. С клиента к серверу не хочет подключаться.
Конфигурация docker-compose.yml
version: "3.8"
services:
db:
image: mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 1
MYSQL_DATABASE: chattest
volumes:
- ./DB:/docker-entrypoint-initdb.d
networks:
- app-network
server:
image: node
volumes:
- ./server:/server
command: "node /server/server.js"
ports:
- 8010:8010
depends_on:
- db
networks:
- app-network
client:
image: php:8.2
volumes:
- ./public:/var/www/html
ports:
- 8001:80
networks:
- app-network
depends_on:
- server
command: php -S 0.0.0.0:80 -t /var/www/html
networks:
app-network:
driver: bridge
Сервер:
const path = require("path");
const express = require("express");
const http = require("http");
const mysql = require("mysql2");
const pool = mysql.createPool({
host: "db",
user: "root",
database: "chattest",
password: "1",
});
const app = express();
const server = http.createServer(app);
app.use(express.static(path.join(__dirname, "public")));
const io = require("socket.io")(server, {
cors: {
origin: "client:8001",
},
});
io.sockets.on("connection", (socket) => {
console.log("Успешное соединение");
});
const PORT = 8010 || process.env.PORT;
server.listen(PORT, () => console.log("Server running on port " + PORT));
Подключение с клиента:
import { io } from "https://cdn.socket.io/4.4.1/socket.io.esm.min.js";
const URL = "server:8010";
socket = io(URL);
Изнутри контейнера клиента, контейнер сервер пингуется, в том числе netstat-ом 8010 порт.
Но в самом приложении в консоль браузера выводится ошибка:
polling-xhr.js:157
GET http://server:8010/socket.io/?EIO=4&transport=polling&t=Oo3-Z5F net::ERR_NAME_NOT_RESOLVED
При этом, объект socket в консоль тоже выводится, но ничего внятного об ошибках там нет.
В чём может быть проблема?