前言:使用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