ΠΠ»Ρ ΠΏΠ΅ΡΠ΅Π΄Π°ΡΠΈ Π΄Π°Π½Π½ΡΡ ΡΠ΅ΡΠ²Π΅ΡΠΎΠΌ Π½Π° php ΠΊΠ»ΠΈΠ΅Π½ΡΡ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΉ Π°Π»Π³ΠΎΡΠΈΡΠΌ:
- Π‘Π΅ΡΠ²Π΅Ρ php ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅Ρ Π΄Π°Π½Π½ΡΠ΅ Π² ΠΊΠ°Π½Π°Π» redis.
- Π‘Π΅ΡΠ²Π΅Ρ node ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠΎΠ±ΡΡΠΈΡ Π² ΡΠΎΠΎΡΠ²Π΅ΡΡΡΠ²ΡΡΡΠ΅ΠΌ ΠΊΠ°Π½Π°Π»Π΅ redis ΠΈ ΠΏΡΠΈ Π½Π°ΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ ΡΠΎΠ±ΡΡΠΈΡ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΡ ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅Ρ ΡΡΠΈ Π΄Π°Π½Π½ΡΠ΅ ΡΠΆΠ΅ Π² socket.io
- ΠΠ»ΠΈΠ΅Π½Ρ ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΡΡΡ Π½Π° ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΡ socket.io ΠΈ ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π΅Ρ ΠΈΡ ΠΏΡΠΈ ΠΏΠΎΡΡΡΠΏΠ»Π΅Π½ΠΈΠΈ
ΠΡΡ ΠΎΠ΄Π½ΡΠΉ ΠΊΠΎΠ΄ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡΠΈ Π² ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ.
Π‘ΠΎΠ·Π΄Π°Π½ΠΈΠ΅ docker-ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° ΠΠ΄Π΅ΡΡ Ρ Π±ΡΠ΄Ρ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ ΠΎΡΠ΅Π½Ρ ΠΌΠ°Π»Π΅Π½ΡΠΊΠΈΠΌΠΈ ΡΠ°Π³Π°ΠΌΠΈ. Π ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π±ΡΠ΄Π΅Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡΡΡ ΡΠ²ΡΠ·ΠΊΠ° nginx ΠΈ php-fpm ΠΈ Π½Π°ΡΠ½Ρ Ρ Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ nginx.
ΠΠ°ΡΠ½Π΅ΠΌ ΡΠΎΠ·Π΄Π°Π²Π°ΡΡ docker-compose.yml Π² ΠΊΠΎΡΠ½Π΅Π²ΠΎΠΉ ΠΏΠ°ΠΏΠΊΠ΅ Π½Π°ΡΠ΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°.
# docker-compose.yml
version: '3'
services:
nginx:
image: nginx
ports:
- 4400:80ΠΡΠΊΡΠΎΠ΅ΠΌ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅: http://localhost:4400 ΠΈ ΡΠ²ΠΈΠ΄ΠΈΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅ ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΠΈΠ΅
nginx.
Π’Π΅ΠΏΠ΅ΡΡ Π½Π°ΡΡΡΠΎΠΈΠΌ, ΡΡΠΎΠ±Ρ nginx ΠΎΡΠ΄Π°Π²Π°Π» ΡΡΠ°ΡΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΠΏΠ°ΠΏΠΊΠΈ
./www/public.
Π‘Π½Π°ΡΠ°Π»Π° ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΠΈ
mkdir -pv www/publicΠ‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ» ./www/pulbic/index.html
<!-- www/public/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<h1>Hello World!</h1>
</body>
</html>Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ» ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΈ nginx - nginx/conf/custom.conf. ΠΠ»Ρ Π½Π°ΡΠ°Π»Π°
ΡΠΊΠΎΠΏΠΈΡΡΠ΅ΠΌ ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΡΠΉ /etc/nginx/conf.d/default.conf.
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ docker-compose.yml
services:
nginx:
image: nginx
+ volumes:
+ - ./nginx/conf/custom.conf:/etc/nginx/conf.d/default.conf
ports:
- 4400:80ΠΠ΅ΡΠ΅ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ nginx
docker-compose up -dΠ Π²Π½ΠΎΠ²Ρ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌ ΠΏΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:4400 ΡΡΠ°Π½Π΄Π°ΡΡΠ½ΠΎΠ΅
ΠΏΡΠΈΠ²Π΅ΡΡΡΠ²ΠΈΠ΅ nginx.
ΠΠ½Π΅ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ
docker-compose.yml
image: nginx
volumes:
- ./nginx/conf/custom.conf:/etc/nginx/conf.d/default.conf
+ - ./www:/www
ports:
- 4400:80nginx/conf/custom.conf
#access_log /var/log/nginx/host.access.log main;
location / {
- root /usr/share/nginx/html;
+ root /www/public;
index index.html index.htm;
}Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:4400 ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ 'Hello World!' ΠΈΠ· ΡΠ°ΠΉΠ»Π°
www/public/index.html.
ΠΡΠΎΡΡΠ²ΠΎΠΌ ΡΡΠΎ Π½Π°Π·Π²Π°ΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎ, Π½ΠΎ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½Π½ΠΎ Π΄Π²ΠΈΠ³Π°Π΅ΠΌΡΡ Π² Π½ΡΠΆΠ½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ.
ΠΠ°ΡΠ½Π΅ΠΌ Ρ ΡΠΎΠ·Π΄Π°Π½ΠΈΡ ΠΏΠ°ΠΏΠΎΠΊ Π΄Π»Ρ Ρ ΡΠ°Π½Π΅Π½ΠΈΡ ΡΠ°ΠΉΠ»ΠΎΠ² Π½Π°ΡΡΡΠΎΠ΅ΠΊ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ°.
mkdir -pv php/confΠΠ°Π»Π΅Π΅ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ php/Dockerfile
FROM php:7-fpm
RUN apt-get -qq update && apt-get -qq install \
curl \
> /dev/null
ENV PHPREDIS_VERSION 3.0.0
RUN mkdir -p /usr/src/php/ext/redis \
&& curl -L https://github.com/phpredis/phpredis/archive/$PHPREDIS_VERSION.tar.gz | tar xvz -C /usr/src/php/ext/redis --strip 1 \
&& echo 'redis' >> /usr/src/php-available-exts \
&& docker-php-ext-install redis
Π Π²Π½Π΅ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² docker-compose.yml
- ./www:/www
ports:
- 4400:80
+ php:
+ build: ./php
+ volumes:
+ - ./www:/wwwΠ’Π°ΠΊΠΆΠ΅ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ Π²Π½Π΅ΡΡΠΈ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ nginx, ΡΡΠΎΠ±Ρ ΡΠ°ΠΉΠ»Ρ Ρ ΡΠ°ΡΡΠΈΡΠ΅Π½ΠΈΠ΅ΠΌ
.php ΠΎΠ±ΡΠ°Π±Π°ΡΡΠ²Π°Π»ΠΈΡΡ php-fpm.
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΉΠ» nginx/conf/custom.conf ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ
# pass the PHP scripts to FastCGI server listening on 127.0.0.1:9000
#
-#location ~ \.php$ {
-# root html;
-# fastcgi_pass 127.0.0.1:9000;
-# fastcgi_index index.php;
-# fastcgi_param SCRIPT_FILENAME /scripts$fastcgi_script_name;
-# include fastcgi_params;
-#}
+location ~ \.php$ {
+ root /www;
+ fastcgi_pass php:9000;
+ fastcgi_index index.php;
+ fastcgi_param REQUEST_METHOD $request_method;
+ fastcgi_param CONTENT_TYPE $content_type;
+ fastcgi_param CONTENT_LENGTH $content_length;
+ fastcgi_param SCRIPT_FILENAME /www/public/$fastcgi_script_name;
+ include fastcgi_params;
+}ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ·Π΄Π°ΡΡ ΡΠ°ΠΉΠ» www/public/info.php ΡΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠΌ ΠΊΠΎΠ΄ΠΎΠΌ
<?php
phpinfo();ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
docker-compose restartΠ ΡΠ΅ΠΏΠ΅ΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:4400/info.php ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΎ
Π½Π°ΡΡΡΠΎΠΉΠΊΠ°Ρ
php.
ΠΡΠ΅ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠΎΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠΈΡΡΠ΅ΠΌ ΠΈ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ» www/Test.php
<?php
class Test
{
public function prn()
{
echo 'Success';
}
}Π ΡΠΎΠ΄Π΅ΡΠΆΠΈΠΌΠΎΠ΅ ΡΠ°ΠΉΠ»Π° www/public/info.php Π·Π°ΠΌΠ΅Π½ΠΈΠΌ Π½Π° ΡΠ»Π΅Π΄ΡΡΡΠ΅Π΅:
<?php
require_once(
implode(
DIRECTORY_SEPARATOR,
[
dirname(__DIR__),
'Test.php'
]
)
);
$test = new Test();
$test->prn();Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:4400/info.php ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ 'success', Π° ΡΡΠΎ
ΠΎΠ·Π½Π°ΡΠ°Π΅Ρ,ΡΡΠΎ php-fpm Π΄ΠΎΡΡΡΠΏΠ½Ρ ΡΠΊΡΠΈΠΏΡΡ ΡΠ°ΡΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π½ΡΠ΅ Π² ΠΏΠ°ΠΏΠΊΠ΅ www, Π° ΡΠ΅ΡΠ΅Π·
Π±ΡΠ°ΡΠ·Π΅Ρ ΠΎΠ½ΠΈ Π½Π΅Π΄ΠΎΡΡΡΠΏΠ½Ρ. Π’.Π΅. ΠΌΡ ΠΏΡΠΎΠ΄ΠΎΠ»ΠΆΠ°Π΅ΠΌ Π΄Π²ΠΈΠ³Π°ΡΡΡΡ Π² Π½ΡΠΆΠ½ΠΎΠΌ Π½Π°ΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠΈ.
ΠΡΠΎ, ΠΏΠΎΠΆΠ°Π»ΡΠΉ, ΡΠ°ΠΌΠ°Ρ ΠΊΠΎΡΠΎΡΠΊΠ°Ρ ΡΠ°ΡΡΡ.
Redis Π² ΡΡΠΎΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ΅ Π½Π΅ Π±ΡΠ΄Π΅Ρ Π΄ΠΎΡΡΡΠΏΠ΅Π½ ΠΈΠ· Π²Π½Π΅ΡΠ½Π΅ΠΉ ΡΠ΅ΡΠΈ, Π½ΠΎ Π·Π°ΡΠΈΡΡ ΠΏΠ°ΡΠΎΠ»Π΅ΠΌ
Π½Π°ΡΡΡΠΎΠΈΠΌ.
ΠΠ»Ρ ΡΡΠΎΠ³ΠΎ ΡΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ» .env
REDIS_PASSWORD=eustatos
ΠΠ½Π΅ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² docker-compose.yml
build: ./php
volumes:
- ./www:/www
+ redis:
+ image: redis
+ command: ["sh", "-c", "exec redis-server --requirepass \"${REDIS_PASSWORD}\""]Π§ΡΠΎΠ±Ρ ΠΏΡΠΎΡΠ΅ΡΡΠΈΡΠΎΠ²Π°ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ ΠΊ redis ΠΈΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΉΠ» www/public/info.php
<?php
$redis = new Redis();
// ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ redis
$redis->connect(
'redis',
6379
);
// Π°Π²ΡΠΎΡΠΈΠ·ΡΠ΅ΠΌΡΡ. 'eustatos' - ΠΏΠ°ΡΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ Π·Π°Π΄Π°Π»ΠΈ Π² ΡΠ°ΠΉΠ»Π΅ `.env`
$redis->auth('eustatos');
// ΠΏΡΠ±Π»ΠΈΠΊΡΠ΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π² ΠΊΠ°Π½Π°Π»Π΅ 'eustatos'
$redis->publish(
'eustatos',
json_encode([
'test' => 'success'
])
);
// Π·Π°ΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅
$redis->close();Π Π΅ΡΡΠ°ΡΡΡΠ΅ΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
docker-compose restart
Π’Π΅ΠΏΠ΅ΡΡ ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠΈΠΌΡΡ ΠΊ ΡΠ΅ΡΠ²Π΅ΡΡ redis
docker-compose exec redis bash
ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ ΠΊ ΠΊΠΎΠΌΠ°Π½Π΄Π½ΠΎΠΉ ΡΡΡΠΎΠΊΠ΅. 'eustatos' - ΠΏΠ°ΡΠΎΠ»Ρ, ΠΊΠΎΡΠΎΡΡΠΉ ΠΌΡ ΡΠ°Π½Π΅Π΅ Π·Π°Π΄Π°Π»ΠΈ Π²
ΡΠ°ΠΉΠ»Π΅ .env
# redis-cli -a eustatos
ΠΠΎΠ΄ΠΏΠΈΡΠ΅ΠΌΡΡ Π½Π° ΠΊΠ°Π½Π°Π» 'eustatos' (Π½Π°Π·Π²Π°Π½ΠΈΠ΅ ΠΏΡΠΎΠΈΠ·Π²ΠΎΠ»ΡΠ½ΠΎΠ΅, ΡΡΠΎΠ±Ρ Π²ΡΠ΅ ΡΠ°Π±ΠΎΡΠ°Π»ΠΎ,
Π΄ΠΎΠ»Π½ΠΎ ΡΠΎΠ²ΠΏΠ°Π΄Π°ΡΡ Ρ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ ΠΊΠ°Π½Π°Π»Π°, ΠΊΠΎΡΠΎΡΠΎΠ΅ ΠΌΡ ΠΎΠΏΡΠ΅Π΄Π΅Π»ΠΈΠ»ΠΈ Π² ΡΠ°ΠΉΠ»Π΅
www/public/info.php)
> subscribe eustatos
ΠΠΎΡΠ»Π΅ Π²ΡΠ΅Ρ
ΡΡΠΈΡ
ΠΏΡΠΈΠ³ΠΎΡΠΎΠ²Π»Π΅Π½ΠΈΠΉ, ΠΏΠ΅ΡΠ΅Ρ
ΠΎΠ΄ΠΈΠΌ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ
http://localhost:4400/info.php ΠΈ Π½Π°Π±Π»ΡΠ΄Π°Π΅ΠΌ, ΠΊΠ°ΠΊ Π² ΡΠ΅ΡΠΌΠΈΠ½Π°Π»Π΅, Π³Π΄Π΅ ΠΌΡ
ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π»ΠΈΡΡ ΠΊ redis ΠΏΠΎΡΠ²Π»ΡΡΡΡΡ ΠΏΡΠΈΠΌΠ΅ΡΠ½ΠΎ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ ΡΡΡΠΎΠΊΠΈ:
1) "message"
2) "eustatos"
3) "{\"test\":\"success\"}"
ΠΠ½Π°ΡΠΈΡ ΠΌΡ ΡΡΠ°Π»ΠΈ Π΅ΡΠ΅ Π±Π»ΠΈΠΆΠ΅ ΠΊ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π»ΠΈ.
Π‘ΠΎΠ·Π°Π΄ΠΈΠΌ ΠΏΠ°ΠΏΠΊΡ, Π³Π΄Π΅ Π±ΡΠ΄ΡΡ Π»Π΅ΠΆΠ°ΡΡ ΡΠ°ΠΉΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ socket.io ΡΠ΅ΡΠ²Π΅ΡΠ°
mkdir socketΠΠ½Π΅ΡΠ΅ΠΌ ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² docker-compose.yml
redis:
image: redis
command: ["sh", "-c", "exec redis-server --requirepass \"${REDIS_PASSWORD}\""]
+ socket:
+ image: node
+ user: "node"
+ volumes:
+ - ./socket:/home/node/app
+ ports:
+ - 5000:5000
+ working_dir: /home/node/app
+ command: "npm start"ΠΠ΅ΡΠ΅ΠΉΠ΄Π΅ΠΌ Π² ΠΏΠ°ΠΏΠΊΡ socket
cd socket
Π£ΡΡΠ°Π½ΠΎΠ²ΠΈΠΌ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΡΠ΅ ΠΏΠ°ΠΊΠ΅ΡΡ
npm init -y
npm i -S socket.io redis express
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΡΠ°ΠΉΠ» socket/package.json ΡΡΡΠΎΠΊΠΈ
{
"name": "socket-php-example",
"version": "1.0.0",
"main": "index.js",
"author": "eustatos <astashkinav@gmail.com>",
"license": "MIT",
+ "scripts": {
+ "start": "node index.js"
+ },
"dependencies": {
"express": "^4.16.3",
"redis": "^2.8.0",
"socket.io": "^2.1.0"
}
}Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ» socket/index.js
const express = require('express');
const app = express();
const http = require('http').Server(app);
const port = process.env.PORT || 5000;
app.get(
'/',
function(req, res, next) {
res.send('success');
}
);
http.listen(
port,
function() {
console.log('Listen at ' + port);
}
);ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
docker-compose restart
ΠΠΎΡΠ»Π΅ ΡΡΠΎΠ³ΠΎ Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ ΠΏΠΎ Π°Π΄ΡΠ΅ΡΡ http://localhost:5000 ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ "success".
ΠΠ½Π°ΡΠΈΡ ΠΌΡ Π΅ΡΠ΅ ΡΡΡΡ Π±Π»ΠΈΠΆΠ΅ ΠΊ Π½Π°ΡΠ΅ΠΉ ΡΠ΅Π»ΠΈ. ΠΡΡΠ°Π»ΠΎΡΡ ΡΠΎΠ²ΡΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ.
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ ΡΠ°ΠΉΠ» socket/index.js
const express = require('express');
const app = express();
const http = require('http').Server(app);
const io = require('socket.io')(http);
// ΠΏΠΎΠ΄ΠΊΠ»ΡΡΠ°Π΅ΠΌΡΡ ΠΊ redis
const subscriber = require('redis').createClient({
host: 'redis',
port: 6379,
password: 'eustatos'
});
// ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π½Π° ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΡ Π² ΠΊΠ°Π½Π°Π»Π°Ρ
redis
subscriber.on('message', function(channel, message) {
// ΠΏΠ΅ΡΠ΅ΡΡΠ»Π°Π΅ΠΌ ΡΠΎΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ ΠΈΠ· ΠΊΠ°Π½Π°Π»Π° redis Π² ΠΊΠΎΠΌΠ½Π°ΡΡ socket.io
io.emit('eustatosRoom', message);
});
// ΠΎΡΠΊΡΡΠ²Π°Π΅ΠΌ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ socket.io
io.on('connection', function(socket){
// ΠΏΠΎΠ΄ΠΏΠΈΡΡΠ²Π°Π΅ΠΌΡΡ Π½Π° ΠΊΠ°Π½Π°Π» redis 'eustatos' Π² callback
subscriber.subscribe('eustatos');
});
const port = process.env.PORT || 5000;
http.listen(
port,
function() {
console.log('Listen at ' + port);
}
);ΠΠ° ΡΡΠΎΠΌ Π½Π°ΡΡΡΠΎΠΉΠΊΠ° ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ° socket.io Π·Π°Π²Π΅ΡΡΠ΅Π½Π°.
ΠΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ΅ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΡΠ°Π·Π²Π΅ΡΠ½ΡΡΡ Π² Π»ΡΠ±ΠΎΠΌ ΠΈΠ· Π½Π°ΡΠΈΡ
ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠΎΠ², Π½ΠΎ
Π΄Π»Ρ ΡΠΈΡΡΠΎΡΡ ΡΠΊΡΠΏΠ΅ΡΠΈΠΌΠ΅Π½ΡΠ° ΡΠ°Π·Π²Π΅ΡΠ½Π΅ΠΌ Π΅Π³ΠΎ Π² ΠΎΡΠ΄Π΅Π»ΡΠ½ΠΎΠΌ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅ΡΠ΅.
Π€Π°ΠΉΠ»Ρ ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠ³ΠΎ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ ΡΠ°Π·ΠΌΠ΅ΡΡΠΈΠΌ Π² ΠΏΠ°ΠΏΠΊΠ΅ client
mkdir client
Π‘ΠΎΠ·Π΄Π°Π΄ΠΈΠΌ ΡΠ°ΠΉΠ» client/index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script
src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/1.7.3/socket.io.min.js"></script>
<script>
const socket = io(
window.location.protocol + '//' + window.location.hostname + ':5000'
);
socket.on(
'eustatosRoom',
function(message) {
console.log(JSON.parse(message));
}
);
</script>
</body>
</html>
ΠΠ·ΠΌΠ΅Π½ΠΈΠΌ docker-compose.yml
ports:
- 5000:5000
command: "npm start"
+ client:
+ image: nginx
+ volumes:
+ - ./client:/usr/share/nginx/html
+ ports:
+ - 8000:80ΠΠ΅ΡΠ΅Π·Π°ΠΏΡΡΡΠΈΠΌ Π½Π°Ρ ΠΊΠΎΠ½ΡΠ΅ΠΉΠ½Π΅Ρ
docker-compose restart
ΠΡΠΊΡΠΎΠ΅ΠΌ ΡΠ½Π°ΡΠ°Π»Π° Π² Π±ΡΠ°ΡΠ·Π΅ΡΠ΅ http://localhost:8000. ΠΠ»Ρ Π΄Π΅ΠΌΠΎΠ½ΡΡΡΠ°ΡΠΈΠΈ ΡΠ΅Π·ΡΠ»ΡΡΠ°ΡΠ°
Π½Π°ΡΠΈΡ
ΡΡΡΠ΄ΠΎΠ² Π½ΡΠΆΠ½ΠΎ ΠΎΡΠΊΡΡΡΡ ΠΏΠ°Π½Π΅Π»Ρ ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠ°.
ΠΠΎΠΊΠ° Π½ΠΈΡΠ΅Π³ΠΎ Π½Π΅ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°Π΅ΡΡΡ.
ΠΡΠΊΡΠΎΠ΅ΠΌ Π² Π΄ΡΡΠ³ΠΎΠΉ Π²ΠΊΠ»Π°Π΄ΠΊΠ΅ ΠΈΠ»ΠΈ ΠΎΠΊΠ½Π΅ Π°Π΄ΡΠ΅Ρ http://localhost:5000 ΠΈ ΠΏΠΎΡΠΌΠΎΡΡΠ΅ΠΌ Π½Π°
Π² ΠΊΠΎΠ½ΡΠΎΠ»Ρ Π½Π°ΡΠ΅Π³ΠΎ ΠΊΠ»ΠΈΠ΅Π½ΡΠ°. ΠΡ Π΄ΠΎΠ»ΠΆΠ½Ρ ΡΠ²ΠΈΠ΄Π΅ΡΡ:
{test: "success"}
Π ΡΡΠΎ Π·Π½Π°ΡΠΈΡ, ΡΡΠΎ Π½Π°Ρ ΡΠ΅ΡΠ²Π΅Ρ Π±Π»Π°Π³ΠΎΠΏΠΎΠ»ΡΡΠ½ΠΎ ΠΏΠ΅ΡΠ΅Π΄Π°Π» ΠΊΠ»ΠΈΠ΅Π½ΡΡΠΊΠΎΠΌΡ ΠΏΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΡ Π΄Π°Π½Π½ΡΠ΅.