如何在 laravel 应用程序中使用 docker 容器启动运行 websockets
Posted
技术标签:
【中文标题】如何在 laravel 应用程序中使用 docker 容器启动运行 websockets【英文标题】:How to run websockets with docker container start in laravel application 【发布时间】:2020-02-21 05:59:24 【问题描述】:我是 Docker 和 WebSockets 的新手。我在我的一个 laravel 项目中使用 docker。我已按照以下链接中的步骤设置 dockerlaravel+docker。另外,我从 this 链接安装了 WebSockets。按照步骤操作后,我的 docker 运行成功。
现在我希望 WebSockets 在 docker 容器启动时自动运行。为此,我在 supervisord-app.conf
中添加了以下代码[program:websockets]
command=/usr/bin/php /var/www/html/websocket-service/artisan websockets:serve
numprocs=1
autostart=true
autorestart=true
user=www-data-new
以下是我的 app.dockerfile
FROM php:7-fpm-alpine
RUN apk --update add wget \
curl \
git \
grep \
build-base \
libmemcached-dev \
libmcrypt-dev \
libxml2-dev \
imagemagick-dev \
pcre-dev \
libtool \
make \
autoconf \
g++ \
cyrus-sasl-dev \
libgsasl-dev \
supervisor
RUN docker-php-ext-install mysqli pdo pdo_mysql tokenizer xml
RUN pecl channel-update pecl.php.net \
&& pecl install memcached \
&& pecl install imagick \
&& pecl install mcrypt-1.0.3 \
&& docker-php-ext-enable memcached \
&& docker-php-ext-enable imagick \
&& docker-php-ext-enable mcrypt
RUN rm /var/cache/apk/* && \
mkdir -p /var/www
COPY supervisord-app.conf /etc/supervisord.conf
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]
以下是我的 docker-compose.yml 文件
version: '2'
services:
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www/html
volumes:
- ./:/var/www/html
environment:
- DB_PORT=$DB_PORT
- DB_HOST=$DB_HOST
web:
build:
context: ./
dockerfile: web.dockerfile
working_dir: /var/www/html
volumes_from:
- app
ports:
- 8080:80
database:
image: mysql:5.7
volumes:
- dbdata:/var/lib/mysql
environment:
- MYSQL_DATABASE=$DB_DATABASE
- MYSQL_USER=$DB_USERNAME
- MYSQL_PASSWORD=$DB_PASSWORD
- MYSQL_ROOT_PASSWORD=
ports:
- 33061:3306
volumes:
dbdata:
Docker 运行成功,但我的 WebSocket 服务器没有启动它。谁能帮我怎么做?
【问题讨论】:
需要找到websocket的端口,放到dokcer-compose文件中 websocket 端口是 6001,但 id 没有放在 docker-compose 文件的位置 如果我是对的,您需要在容器外访问您的 websocket? 当我点击docker-compose up
命令时,我需要它运行。
使用`supervisordˋ的原因是什么?
【参考方案1】:
您可以将两个容器分开,例如:
app.dockerfile:
FROM php:7-cli-alpine
RUN apk --update add wget \
curl \
git \
grep \
build-base \
libmemcached-dev \
libmcrypt-dev \
libxml2-dev \
imagemagick-dev \
pcre-dev \
libtool \
make \
autoconf \
g++ \
cyrus-sasl-dev \
libgsasl-dev
RUN docker-php-ext-install mysqli pdo pdo_mysql tokenizer xml
RUN pecl channel-update pecl.php.net \
&& pecl install memcached \
&& pecl install imagick \
&& pecl install mcrypt-1.0.3 \
&& docker-php-ext-enable memcached \
&& docker-php-ext-enable imagick \
&& docker-php-ext-enable mcrypt
RUN rm /var/cache/apk/* && \
mkdir -p /var/www
ENTRYPOINT ["/usr/bin/php", "/var/www/html/websocket-service/artisan", "websockets:serve"]
我已经更改了文件顶部的 php:7-fpm-alpine
,因为在这种情况下,您只需要运行一个命令,而不是运行为 Web 请求提供服务的 php-fpm 服务器
web.dockerfile:
FROM php:7-fpm-alpine
RUN apk --update add wget \
curl \
git \
grep \
build-base \
libmemcached-dev \
libmcrypt-dev \
libxml2-dev \
imagemagick-dev \
pcre-dev \
libtool \
make \
autoconf \
g++ \
cyrus-sasl-dev \
libgsasl-dev
RUN docker-php-ext-install mysqli pdo pdo_mysql tokenizer xml
RUN pecl channel-update pecl.php.net \
&& pecl install memcached \
&& pecl install imagick \
&& pecl install mcrypt-1.0.3 \
&& docker-php-ext-enable memcached \
&& docker-php-ext-enable imagick \
&& docker-php-ext-enable mcrypt
RUN rm /var/cache/apk/* && \
mkdir -p /var/www
在这里你可以让ENTRYPOINT
指令由基础容器php:7-fpm-alpine
设置
[编辑 1]
你也可以参考我的old school项目:ExoSuite/exosuite-docker
更准确地说是:docker-compose.dev.yml 在这个 docker-compose 文件中 Laravel Horizon
由他的容器 laravel-artisan 运行,所以这个文件可以帮助您作为解决问题的示例。
[编辑 2]
如果您想在您的app
容器之外访问您的6001
端口,请修改您的应用指令,如下所示:
app:
build:
context: ./
dockerfile: app.dockerfile
working_dir: /var/www/html
volumes:
- ./:/var/www/html
ports:
- "6001:6001"
environment:
- DB_PORT=$DB_PORT
- DB_HOST=$DB_HOST
【讨论】:
它运行但我看不到我的 WebSocket 启动。它没有显示 6001 正在运行以上是关于如何在 laravel 应用程序中使用 docker 容器启动运行 websockets的主要内容,如果未能解决你的问题,请参考以下文章