Как запустить веб-сокеты при запуске контейнера docker в приложении laravel - PullRequest
4 голосов
/ 21 февраля 2020

Я новичок в Docker и WebSockets. Я использую docker в моем проекте laravel. Я следовал инструкциям по следующей ссылке для установки docker laravel + docker. Также я установил 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 не запускается с ним. Может кто-нибудь помочь мне, как это сделать?

1 Ответ

1 голос
/ 21 февраля 2020

Вы можете разделить два своих контейнера следующим образом:

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, потому что в в этом случае вам просто нужно запустить команду, а не запускать сервер 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

[EDIT 1]

Вы также можете обратиться к моему старому школьному проекту : ExoSuite / exosuite- docker

, а точнее: docker -compose.dev.yml в этом docker -композитном файле Laravel Horizon запускается его контейнером laravel -artisan , поэтому этот файл может помочь вам в качестве примера для вашей проблемы.

[EDIT 2]

Если вы хотите, чтобы ваш порт 6001 был доступен вне контейнера app, измените директиву вашего приложения следующим образом:

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}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...