├── .docker ├── Dockerfile ├── crontab ├── supervisord.conf ├── virtualhost.conf └── xdebug.ini ├── .github └── workflows │ └── run-docker-compose.yml ├── .gitignore ├── Makefile ├── README.md ├── docker-compose.xdebug.yml ├── docker-compose.yml └── public └── index.php /.docker/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:8.2-apache 2 | 3 | # Set the working directory inside the container 4 | WORKDIR /var/www/html 5 | 6 | # Install system dependencies 7 | RUN apt-get update \ 8 | && apt-get install -y \ 9 | libicu-dev \ 10 | libpq-dev \ 11 | libzip-dev \ 12 | unzip \ 13 | git \ 14 | cron \ 15 | nano \ 16 | supervisor 17 | 18 | # Install PHP extensions 19 | RUN docker-php-ext-install \ 20 | intl \ 21 | pdo \ 22 | pdo_pgsql \ 23 | zip \ 24 | pdo \ 25 | pdo_mysql \ 26 | opcache 27 | 28 | # Install XDEBUG, APCU 29 | RUN pecl install xdebug apcu 30 | RUN docker-php-ext-enable xdebug apcu 31 | 32 | # Install symfony CLI 33 | RUN curl -sS https://get.symfony.com/cli/installer | bash 34 | RUN mv /root/.symfony5/bin/symfony /usr/local/bin/symfony 35 | 36 | # Install Composer CLI 37 | RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer 38 | 39 | # Setup crontab 40 | COPY ./crontab /var/www/html/.docker/crontab 41 | RUN crontab /var/www/html/.docker/crontab 42 | 43 | # You can add your own aliases here 44 | RUN echo 'alias console="php /var/www/html/bin/console"' >> ~/.bashrc 45 | RUN echo 'alias phpstan="/var/www/html/vendor/phpstan/phpstan/phpstan"' >> ~/.bashrc 46 | RUN echo 'alias dsu="/var/www/html/bin/console d:s:u --force --complete"' >> ~/.bashrc 47 | 48 | RUN echo "umask 0000" >> /root/.bashrc 49 | 50 | # Start Supervisor, which will run cron -f by default. 51 | CMD ["/usr/bin/supervisord"] 52 | -------------------------------------------------------------------------------- /.docker/crontab: -------------------------------------------------------------------------------- 1 | * * * * * touch /var/www/html/.idea/file_from_crontab 2 | -------------------------------------------------------------------------------- /.docker/supervisord.conf: -------------------------------------------------------------------------------- 1 | [supervisord] 2 | nodaemon=true 3 | 4 | [program:apache] 5 | command=apache2ctl -D FOREGROUND 6 | autostart=true 7 | autorestart=true 8 | stdout_logfile=/var/log/apache_access.log 9 | stderr_logfile=/var/log/apache_error.log 10 | 11 | [program:cron] 12 | command=cron -f 13 | autostart=true 14 | autorestart=true 15 | stdout_logfile=/var/log/cron.log 16 | stderr_logfile=/var/log/cron_error.log 17 | -------------------------------------------------------------------------------- /.docker/virtualhost.conf: -------------------------------------------------------------------------------- 1 | 2 | ServerAdmin webmaster@localhost 3 | DocumentRoot /var/www/html/public 4 | DirectoryIndex /index.php 5 | 6 | 7 | AllowOverride None 8 | Order Allow,Deny 9 | Allow from All 10 | 11 | FallbackResource /index.php 12 | 13 | 14 | 15 | FallbackResource disabled 16 | 17 | ErrorLog ${APACHE_LOG_DIR}/error.log 18 | CustomLog ${APACHE_LOG_DIR}/access.log combined 19 | -------------------------------------------------------------------------------- /.docker/xdebug.ini: -------------------------------------------------------------------------------- 1 | zend_extension=xdebug 2 | 3 | [xdebug] 4 | xdebug.mode=debug 5 | xdebug.start_with_request=yes 6 | xdebug.client_port=9003 7 | xdebug.client_host=host.docker.internal 8 | -------------------------------------------------------------------------------- /.github/workflows/run-docker-compose.yml: -------------------------------------------------------------------------------- 1 | name: Try to run docker-compose up 2 | 3 | on: 4 | push: 5 | pull_request: 6 | schedule: 7 | - cron: '0 0 * * *' 8 | 9 | jobs: 10 | build: 11 | runs-on: ubuntu-latest 12 | 13 | steps: 14 | - uses: actions/checkout@v3 15 | - name: Try to build docker compose 16 | run: docker-compose up -d --build 17 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | prepare: 2 | docker compose up -d --build 3 | 4 | ssh: 5 | docker exec -it project_web bash 6 | 7 | xdebug: 8 | docker compose -f docker-compose.yml -f docker-compose.xdebug.yml up -d --build 9 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Symfony Docker Compose 2 | Docker compose environment for Symfony (also works for Laravel or plain PHP) projects 3 | 4 | # Summary of what is included 5 | * PHP 8.2 with XDEBUG 3 6 | * Apache2 7 | * MySQL 8.0 8 | * PhpMyAdmin - manage MySQL 9 | * Mailhog - local mailing server 10 | * Installs `composer` command 11 | * Virtualhost configuration dedicated for Symfony projects 12 | 13 | # Requirements 14 | * Docker and Docker Compose [(Install docker compose)](https://docs.docker.com/compose/install/) 15 | * Makefile (Optional) (`sudo apt install make`) 16 | 17 | # How to install this in my project? 18 | 19 | * `cd to-your-project` 20 | * `git clone https://github.com/kasteckis/symfony-docker-compose.git` 21 | * `mv ./symfony-docker-compose/.docker ./.docker` 22 | * `mv ./symfony-docker-compose/Makefile ./Makefile` 23 | * `mv ./symfony-docker-compose/docker-compose.yml ./docker-compose.yml` 24 | * `mv ./symfony-docker-compose/docker-compose.xdebug.yml ./docker-compose.xdebug.yml` 25 | * `rm -rf ./symfony-docker-compose` 26 | * `docker compose up` 27 | 28 | # How to access everything? 29 | 30 | By default you can access services via: 31 | * Access your project website via - http://localhost/ 32 | * MySQL can be accessed via localhost:3306 33 | * PhpMyAdmin can be accessed via http://localhost:81 34 | * Mailhog can be accessed via http://localhost:8025/ (SMTP Port is 1025) 35 | * Access docker apache-php terminal by writing - `docker exec -it project_web bash` (or `make ssh`) 36 | 37 | # Modifying .env file (If you are using Symfony) 38 | 39 | If you use default IP addresses, append your `.env` file with the following: 40 | 41 | * For database connection -`DATABASE_URL=mysql://project:project@mysql:3306/project` 42 | * For mailing server - `MAILER_DSN=smtp://user:pass@mailhog:1025` (You can you any user and password) 43 | 44 | # MySQL 45 | 46 | * You can connect to your MySQL via `localhost:3306` 47 | * If you don't have any additional software, you can connect to database via phpmyadmin (http://localhost:81) 48 | * Username: `project` 49 | * Password: `project` 50 | * Default table is called `project` 51 | 52 | # Notes and common issues 53 | 54 | * I use this configuration on `Windows 11` with `WSL 2` 55 | * You cannot use same `container_name` for multiple projects. Make sure to change them, or you can just delete that optional argument from `docker-compose.yml` file 56 | * You can't run multiple projects that allocate same ports on your localhost. 57 | * If you can't compose a new project, you might need to delete your old docker networks. Type `docker network ls` and then remove your old project network by writing `docker network rm NETWORK_ID` (for example `docker network rm 528d8c753c17`) 58 | * `cannot start service XXX: network YYY not found`. Open up container list with `docker container ls -a` and remove old containers with `docker container rm ID`. 59 | 60 | # Something does not work? 61 | 62 | [Please create an issue.](https://github.com/kasteckis/symfony-docker-compose/issues/new) 63 | -------------------------------------------------------------------------------- /docker-compose.xdebug.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | services: 3 | web: 4 | volumes: 5 | - ./.docker/xdebug.ini:/usr/local/etc/php/conf.d/docker-php-ext-xdebug.ini 6 | extra_hosts: 7 | - host.docker.internal:host-gateway 8 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3" 2 | volumes: 3 | volume_database_project: 4 | 5 | services: 6 | mysql: 7 | image: mysql:8.0 8 | container_name: project_mysql 9 | environment: 10 | MYSQL_ALLOW_EMPTY_PASSWORD: 'true' 11 | MYSQL_ROOT_PASSWORD: 12 | MYSQL_DATABASE: project 13 | MYSQL_USER: project 14 | MYSQL_PASSWORD: project 15 | volumes: 16 | - volume_database_project:/var/lib/mysql 17 | ports: 18 | - "3306:3306" 19 | 20 | phpmyadmin: 21 | image: phpmyadmin/phpmyadmin 22 | container_name: project_phpmyadmin 23 | links: 24 | - mysql 25 | environment: 26 | PMA_HOST: mysql 27 | PMA_PORT: 3306 28 | PMA_ARBITRARY: 1 29 | ports: 30 | - "81:80" 31 | 32 | web: 33 | build: ./.docker 34 | container_name: project_web 35 | volumes: 36 | - ./:/var/www/html 37 | - ./.docker/virtualhost.conf:/etc/apache2/sites-available/000-default.conf 38 | - ./.docker/supervisord.conf:/etc/supervisor/conf.d/supervisord.conf 39 | ports: 40 | - "80:80" 41 | depends_on: 42 | - mysql 43 | 44 | mailhog: 45 | image: mailhog/mailhog 46 | container_name: project_mailhog 47 | ports: 48 | - "1025:1025" # smtp server 49 | - "8025:8025" # web ui 50 | -------------------------------------------------------------------------------- /public/index.php: -------------------------------------------------------------------------------- 1 |