'docker compose and swarm for laravel app in production

everyone, I am confused I am new to the DevOps world and I have no idea how to use docker-compose or swarm in production I mean what are the best practices in production for both I followed up with this article on the digital ocean How To Install and Set Up Laravel with Docker Compose on Ubuntu 20.04 all works like a charm in local, test, and dev environments, and I tried to take this to the next step for production env, and I noticed some things should be changed for production mode like so

  1. Removing any volume bindings for application code, so that code stays inside the container and can’t be changed from outside.
  2. Binding to different ports on the host. check the link for more info use compose in production

I don't know how to achieve #1 point

here's my DockerFile below to build my custom laravel image and docker-compose for my services

FROM php:7.4-fpm

# Arguments defined in docker-compose.yml
ARG user
ARG uid

# Install system dependencies
RUN apt-get update && apt-get install -y \
    curl \
    libpng-dev \
    libonig-dev \
    libxml2-dev \
    zip \
    unzip

# Clear cache
RUN apt-get clean && rm -rf /var/lib/apt/lists/*

# Download php extension installer
ADD https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions /usr/local/bin/

# Give php extension installer a permission
RUN chmod +x /usr/local/bin/install-php-extensions

# Install php extensions via php extension installer
RUN install-php-extensions zip

# Install PHP extensions
RUN docker-php-ext-install pdo_mysql mbstring exif pcntl bcmath gd

# Get latest Composer
COPY --from=composer:latest /usr/bin/composer /usr/bin/composer

# Create system user to run Composer and Artisan Commands
RUN useradd -G www-data,root -u $uid -d /home/$user $user
RUN mkdir -p /home/$user/.composer && \
    chown -R $user:$user /home/$user

# Set working directory
WORKDIR /var/www/html

USER $user
version: "3.7"
services:
  app:
    build:
      args:
        user: sammy
        uid: 1000
      context: ./
      dockerfile: Dockerfile
    image: app
    container_name: app
    restart: always
    working_dir: /var/www/html
    volumes:
      - ./:/var/www/html
    networks:
      - backend

  db:
    image: mysql:8.0
    container_name: db
    restart: always
    environment:
      MYSQL_DATABASE: ROUTE
      MYSQL_ROOT_PASSWORD: 2020
      MYSQL_PASSWORD: 2020
      MYSQL_USER: sqluser
    volumes:
      - db:/var/lib/mysql
    networks:
      - backend

  nginx:
    image: nginx:1.21.6
    container_name: nginx
    restart: always
    ports:
      - 8000:80
    networks:
      - backend
    volumes:
      - ./:/var/www/html
      - ./docker-compose/nginx:/etc/nginx/conf.d/

  phpmyadmin:
      image: phpmyadmin
      container_name: pma
      restart: always
      ports:
          - 8283:80
      environment:
        PMA_HOSTS: db
        PMA_ARBITRARY: 1
        PMA_USER: sqluser
        PMA_PASSWORD: 2020
      networks:
        - backend     

networks:
  backend:
    driver: bridge
    
volumes:
   db:

Note:- in Nginx service, I Created two shared volumes. The first one will synchronize contents from the current directory to /var/www inside the container. This way, when you make local changes to the application files, they will be quickly reflected in the application being served by Nginx inside the container (Which is not good for production). The second volume will make sure our Nginx configuration file, located at docker-compose/nginx/, is copied to the container’s Nginx configuration folder.

i tried to remove the first volume but keep the second one to use my custom configuration but it did not work at all why?



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source