如何在 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的主要内容,如果未能解决你的问题,请参考以下文章

如何防止子进程在 Dock 中弹跳?

如何在dock(Mac)中恢复图标? [关闭]

如何在 Mac 的 Dock 上对应用程序的多个窗口进行分组

如何从 Dock 中的程序快捷方式中检索命令行参数?

如何更改 Java 程序的 Dock 图标?

如何设置我的应用程序的 Dock 名称?