我有一个包含五个容器的docker设置:
我最近才将websocket服务器迁移到docker容器中,除了数据库连接之外,其他一切都工作正常。每次尝试运行查询时,都会出现以下错误:
{ Error: connect ECONNREFUSED 172.20.0.2:3360
at TCPConnectWrap.afterConnect [as oncomplete] (net.js:1107:14)
--------------------
at Protocol._enqueue (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:144:48)
at Protocol.handshake (/usr/src/app/node_modules/mysql/lib/protocol/Protocol.js:51:23)
at PoolConnection.connect (/usr/src/app/node_modules/mysql/lib/Connection.js:116:18)
at Pool.getConnection (/usr/src/app/node_modules/mysql/lib/Pool.js:48:16)
at Pool.query (/usr/src/app/node_modules/mysql/lib/Pool.js:202:8)
at Object.exports.getRoom (/usr/src/app/db.js:30:8)
at Socket.socket.on (/usr/src/app/index.js:175:16)
/usr/src/app/db.js:35
at Socket.emit (events.js:198:13)
at /usr/src/app/node_modules/socket.io/lib/socket.js:528:12
at process._tickCallback (internal/process/next_tick.js:61:11)
errno: 'ECONNREFUSED',
code: 'ECONNREFUSED',
syscall: 'connect',
address: '172.20.0.2',
port: 3360,
fatal: true }
我已经检查了连接的详细信息,它们与我的PHP api完全相同,该PHP api在nginx / fpm容器中运行:
var db = mysql.createPool({
host: "db",
port: "3360",
user: "root",
password: "pw",
database: "livechat"
});
这是我的docker-compose.yml:
version: '3'
services:
nginx:
image: nginx:alpine
depends_on:
- "db"
- "fpm"
- "websocket"
links:
- fpm
ports:
- "80:80"
- "443:443"
volumes:
- ./public:/var/www/live-chat-api
- ./../live-chat/app-dist:/var/www/live-chat-app
- ./docker/nginx/vhost.conf:/etc/nginx/conf.d/live-chat-api.conf
- ./docker/ssl:/etc/ssl
working_dir:
/var/www/live-chat-api
fpm:
build: ./docker/php-fpm
links:
- "db"
volumes:
- ./public:/var/www/live-chat-api
- ./../live-chat/app-dist
working_dir:
/var/www/live-chat-api
db:
image: mysql:5.7
ports:
- "3360:3306"
volumes:
- data:/var/lib/mysql
command: --sql_mode=""
environment:
MYSQL_ROOT_PASSWORD: pw
MYSQL_DATABASE: livechat
MYSQL_USER: root
MYSQL_PASSWORD: pw
mailhog:
image: mailhog/mailhog:latest
logging:
driver: 'none' # disable saving logs
ports:
- 1025:1025
- 8025:8025
websocket:
image: node:10
depends_on:
- "db"
links:
- "db"
volumes:
- ./../live-chat-server:/usr/src/app
working_dir:
/usr/src/app
ports:
- "3000:3000"
command: bash -c "npm run dev"
volumes:
data:
我已经登录到'websocket'容器并成功ping通'db'容器:
# ping db
PING db (172.20.0.2) 56(84) bytes of data.
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=1 ttl=64 time=0.159 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=2 ttl=64 time=0.133 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=3 ttl=64 time=0.113 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=4 ttl=64 time=0.136 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=5 ttl=64 time=0.163 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=6 ttl=64 time=0.163 ms
64 bytes from live-chat-api_db_1.live-chat-api_default (172.20.0.2): icmp_seq=7 ttl=64 time=0.232 ms
^C
--- db ping statistics ---
7 packets transmitted, 7 received, 0% packet loss, time 6153ms
rtt min/avg/max/mdev = 0.113/0.157/0.232/0.035 ms
为什么我不能从websocket服务器连接到mysql服务器?
此外,这些连接详细信息适用于本地化的开发环境。因此,我不太担心这些登录名的“安全性”。