├── .gitignore
├── .docker
├── crontab
├── xdebug.ini
├── supervisord.conf
├── virtualhost.conf
└── Dockerfile
├── Makefile
├── docker-compose.xdebug.yml
├── public
└── index.php
├── .github
└── workflows
│ └── run-docker-compose.yml
├── docker-compose.yml
└── README.md
/.gitignore:
--------------------------------------------------------------------------------
1 | .idea
2 |
--------------------------------------------------------------------------------
/.docker/crontab:
--------------------------------------------------------------------------------
1 | * * * * * touch /var/www/html/.idea/file_from_crontab
2 |
--------------------------------------------------------------------------------
/.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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/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 |
--------------------------------------------------------------------------------
/public/index.php:
--------------------------------------------------------------------------------
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-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 |
--------------------------------------------------------------------------------
/.docker/Dockerfile:
--------------------------------------------------------------------------------
1 | FROM php:8.4-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 |
--------------------------------------------------------------------------------
/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.4 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 |
--------------------------------------------------------------------------------