Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to run websockets with docker container start in laravel application

I am new to Docker and WebSockets. I am using docker in my one of the laravel project. I have followed steps from the following link to setup dockerlaravel+docker. Also, I installed WebSockets from this link. My docker is running successfully after following the steps.

Now I want WebSockets to run automatically when the docker container starts. For it, I have added following code to 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

Following is my 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"]

Following is my docker-compose.yml file

   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 runs successfully but my WebSocket server does not start with it. Can anyone help me how to do it?

like image 973
Dhara Avatar asked Sep 13 '25 01:09

Dhara


1 Answers

You can separate your two container like:

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"]

I have changed at the top of the file php:7-fpm-alpine because in this case you just need to run a command and not to run the php-fpm server which serve the web requests

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

Here you can let the ENTRYPOINT directive which is setup by the base container php:7-fpm-alpine

[EDIT 1]

You can also refer to my old school project: ExoSuite/exosuite-docker

and more precisely to: docker-compose.dev.yml in this docker-compose file Laravel Horizon is run by his container laravel-artisan so this file can help you as an example for your problem.

[EDIT 2]

If you want to your 6001 port to be accessed outside of your app container modify you app directive as follows:

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}
like image 142
loic.lopez Avatar answered Sep 14 '25 17:09

loic.lopez