前言:使用swoole的websocket,需要额外使用端口(默认5200),在docker内安装swoole后,宿主机(MAC电脑)需要访问websocket,socket功能时,需要docker暴露端口(5200),但是我们的容器已经在执行,如果能在不影响本身容器环境的情况下,对外暴露端口呢,如果是安装了docker-compose,那么有对应的配置文件可以改动(请大家自行百度)。笔者并没有安装,网上资料太少,笔者自己研究完,分享一下心得
一、将容器打包成镜像,执行docker commit
这一步主要是保存容器内的所有环境。
docker commit 容器名 镜像名
例子:docker commit store-dev ldb/store:3.0
成功后,会返回类似信息:
sha256:ca46b1ed99abc1338881a55a043ee9670a66601530b3f2e63f41eb949b91e84d
二、新建容器
docker run --name 容器名 -itd -p 对外端口/容器内端口 -v 本地项目路由:容器内项目路由 --link ldb.mysql:mysql --link ldb.redis:redis 镜像repository:镜像tag
例子:docker run --name store-dev -itd -p 80:80 -p 9501:9501 -v ~/Code/store:/data/web/store --link ldb.mysql:mysql --link ldb.redis:redis ldb/store:3.0
三、nginx域名配置文件
- 获取容器配置:docker inspect 容器名 .在获取到配置后,IPAddress即为IP地址。
- nginx配置为:
map $http_upgrade $connection_upgrade {
default upgrade;
'' close;
}
upstream laravels {
# 笔者的websocket是172.17.0.4:9501
server 第一步获取ip地址:5200 weight=5 max_fails=3 fail_timeout=30s;
# By UnixSocket Stream file
#server unix:/xxxpath/laravel-s-test/storage/laravels.sock weight=5 max_fails=3 fail_timeout=30s;
#server 192.168.1.1:5200 weight=3 max_fails=3 fail_timeout=30s;
#server 192.168.1.2:5200 backup;
}
server {
listen 80;
server_name laravels.oo;
root /var/www/laravels/public;
# access_log /var/log/$server_name.access.log main;
autoindex off;
index index.html index.htm;
# Nginx handles the static resources(recommend enabling gzip), LaravelS handles the dynamic resource.
location / {
try_files $uri @laravels;
}
# Response 404 directly when request the PHP file, to avoid exposing public/*.php
#location ~* \.php$ {
# return 404;
#}
# Http and WebSocket are concomitant, Nginx identifies them by "location"
# Javascript: var ws = new WebSocket("ws://laravels.com/ws");
location =/ws {
proxy_http_version 1.1;
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout: Nginx will close the connection if the proxied server does not send data to Nginx in 60 seconds; At the same time, this close behavior is also affected by heartbeat setting of Swoole.
# proxy_read_timeout 60s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection $connection_upgrade;
proxy_pass http://laravels;
}
location @laravels {
proxy_http_version 1.1;
# proxy_connect_timeout 60s;
# proxy_send_timeout 60s;
# proxy_read_timeout 60s;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Real-PORT $remote_port;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header Scheme $scheme;
proxy_set_header Server-Protocol $server_protocol;
proxy_set_header Server-Name $server_name;
proxy_set_header Server-Addr $server_addr;
proxy_set_header Server-Port $server_port;
proxy_pass http://laravels;
}
}
- 不要忘记将
LARAVELS_LISTEN_IP
on配置修改为0.0.0.0
.env
文件配置参数: REDIS_HOST=redis:6379