├── .env.example ├── infra └── docker │ ├── mysql │ ├── Dockerfile │ └── my.cnf │ ├── apache │ └── httpd.conf │ └── php │ ├── php.ini │ └── Dockerfile ├── docker-compose.yml ├── LICENSE ├── .github └── workflows │ ├── laravel-create-project.yml │ └── laravel-git-clone.yml ├── .gitignore ├── README.md └── Makefile /.env.example: -------------------------------------------------------------------------------- 1 | WEB_PORT=80 2 | DB_PORT=3306 3 | DB_NAME=laravel_local 4 | DB_USER=phper 5 | DB_PASS=secret 6 | -------------------------------------------------------------------------------- /infra/docker/mysql/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM mysql:8.0 2 | LABEL maintainer="ucan-lab " 3 | 4 | ENV TZ=UTC 5 | 6 | COPY ./infra/docker/mysql/my.cnf /etc/my.cnf 7 | -------------------------------------------------------------------------------- /infra/docker/apache/httpd.conf: -------------------------------------------------------------------------------- 1 | 2 | ServerName example.com 3 | ServerAdmin webmaster@localhost 4 | DocumentRoot /work/backend/public 5 | 6 | ErrorLog ${APACHE_LOG_DIR}/error.log 7 | CustomLog ${APACHE_LOG_DIR}/access.log combined 8 | 9 | 10 | Options Indexes FollowSymLinks 11 | AllowOverride All 12 | Require all granted 13 | 14 | 15 | -------------------------------------------------------------------------------- /infra/docker/php/php.ini: -------------------------------------------------------------------------------- 1 | zend.exception_ignore_args = off 2 | expose_php = on 3 | max_execution_time = 30 4 | max_input_vars = 1000 5 | upload_max_filesize = 64M 6 | post_max_size = 128M 7 | memory_limit = 256M 8 | error_reporting = E_ALL 9 | display_errors = on 10 | display_startup_errors = on 11 | log_errors = on 12 | error_log = /dev/stderr 13 | default_charset = UTF-8 14 | 15 | [Date] 16 | date.timezone = ${TZ} 17 | 18 | [mysqlnd] 19 | mysqlnd.collect_memory_statistics = on 20 | 21 | [Assertion] 22 | zend.assertions = 1 23 | 24 | [mbstring] 25 | mbstring.language = Japanese 26 | -------------------------------------------------------------------------------- /infra/docker/mysql/my.cnf: -------------------------------------------------------------------------------- 1 | [mysqld] 2 | character_set_server = utf8mb4 3 | collation_server = utf8mb4_0900_ai_ci 4 | 5 | # timezone 6 | default-time-zone = SYSTEM 7 | log_timestamps = SYSTEM 8 | 9 | # Error Log 10 | log-error = mysql-error.log 11 | 12 | # Slow Query Log 13 | slow_query_log = 1 14 | slow_query_log_file = mysql-slow.log 15 | long_query_time = 1.0 16 | log_queries_not_using_indexes = 0 17 | 18 | # General Log 19 | general_log = 1 20 | general_log_file = mysql-general.log 21 | 22 | [mysql] 23 | default-character-set = utf8mb4 24 | 25 | [client] 26 | default-character-set = utf8mb4 27 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: "3.8" 2 | volumes: 3 | db-store: 4 | services: 5 | web: 6 | build: 7 | context: . 8 | dockerfile: ./infra/docker/php/Dockerfile 9 | ports: 10 | - ${WEB_PORT:-80}:80 11 | volumes: 12 | - ./backend:/work/backend 13 | environment: 14 | - DB_CONNECTION=mysql 15 | - DB_HOST=db 16 | - DB_PORT=3306 17 | - DB_DATABASE=${DB_NAME:-laravel_local} 18 | - DB_USERNAME=${DB_USER:-phper} 19 | - DB_PASSWORD=${DB_PASS:-secret} 20 | 21 | db: 22 | build: 23 | context: . 24 | dockerfile: ./infra/docker/mysql/Dockerfile 25 | ports: 26 | - ${DB_PORT:-3306}:3306 27 | volumes: 28 | - db-store:/var/lib/mysql 29 | environment: 30 | - MYSQL_DATABASE=${DB_NAME:-laravel_local} 31 | - MYSQL_USER=${DB_USER:-phper} 32 | - MYSQL_PASSWORD=${DB_PASS:-secret} 33 | - MYSQL_ROOT_PASSWORD=${DB_PASS:-secret} 34 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | The MIT License (MIT) 2 | 3 | Copyright (c) 2020 ucan-lab/docker-laravel-apache 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.github/workflows/laravel-create-project.yml: -------------------------------------------------------------------------------- 1 | name: laravel-create-project 2 | 3 | on: 4 | pull_request: 5 | schedule: 6 | - cron: '0 0 * * *' 7 | 8 | jobs: 9 | docker-build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - name: Docker Compose Version 16 | run: docker-compose --version 17 | 18 | - name: Build Docker 19 | run: docker-compose up -d --build 20 | 21 | - name: PHP Version 22 | run: docker-compose exec -T web php --version 23 | 24 | - name: Composer Version 25 | run: docker-compose exec -T web composer --version 26 | 27 | - name: Create Laravel Project 28 | run: docker-compose exec -T web composer create-project --prefer-dist laravel/laravel . 29 | 30 | - name: Laravel Version 31 | run: docker-compose exec -T web php artisan --version 32 | 33 | - name: Laravel Migrate Testing 34 | run: docker-compose exec -T web php artisan migrate 35 | 36 | - name: Laravel Rollback Testing 37 | run: docker-compose exec -T web php artisan migrate:refresh --seed 38 | 39 | - name: Laravel Seeding Testing 40 | run: docker-compose exec -T web php artisan db:seed 41 | 42 | - name: Laravel PHPUnit Testing 43 | run: docker-compose exec -T web php artisan test 44 | -------------------------------------------------------------------------------- /infra/docker/php/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:14-buster as node 2 | FROM php:7.4-apache-buster 3 | LABEL maintainer="ucan-lab " 4 | SHELL ["/bin/bash", "-oeux", "pipefail", "-c"] 5 | 6 | # timezone environment 7 | ENV TZ=UTC \ 8 | # locale 9 | LANG=en_US.UTF-8 \ 10 | LANGUAGE=en_US:en \ 11 | LC_ALL=en_US.UTF-8 \ 12 | # composer environment 13 | COMPOSER_ALLOW_SUPERUSER=1 \ 14 | COMPOSER_HOME=/composer 15 | 16 | # composer command 17 | COPY --from=composer:2.0 /usr/bin/composer /usr/bin/composer 18 | # node command 19 | COPY --from=node /usr/local/bin /usr/local/bin 20 | # npm command 21 | COPY --from=node /usr/local/lib /usr/local/lib 22 | # yarn command 23 | COPY --from=node /opt /opt 24 | 25 | RUN apt-get update && \ 26 | apt-get -y install git libicu-dev libonig-dev libzip-dev unzip locales && \ 27 | apt-get clean && \ 28 | rm -rf /var/lib/apt/lists/* && \ 29 | locale-gen en_US.UTF-8 && \ 30 | localedef -f UTF-8 -i en_US en_US.UTF-8 && \ 31 | a2enmod rewrite && \ 32 | docker-php-ext-install intl pdo_mysql zip bcmath && \ 33 | composer config -g process-timeout 3600 && \ 34 | composer config -g repos.packagist composer https://packagist.org 35 | 36 | COPY ./infra/docker/php/php.ini /usr/local/etc/php/php.ini 37 | COPY ./infra/docker/apache/httpd.conf /etc/apache2/sites-available/000-default.conf 38 | 39 | WORKDIR /work/backend 40 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Covers JetBrains IDEs: IntelliJ, RubyMine, PhpStorm, AppCode, PyCharm, CLion, Android Studio, WebStorm and Rider 2 | # Reference: https://intellij-support.jetbrains.com/hc/en-us/articles/206544839 3 | # Reference: https://github.com/github/gitignore/blob/master/Global/JetBrains.gitignore 4 | 5 | # User-specific stuff 6 | .idea/**/workspace.xml 7 | .idea/**/tasks.xml 8 | .idea/**/usage.statistics.xml 9 | .idea/**/dictionaries 10 | .idea/**/shelf 11 | 12 | # Generated files 13 | .idea/**/contentModel.xml 14 | 15 | # Sensitive or high-churn files 16 | .idea/**/dataSources/ 17 | .idea/**/dataSources.ids 18 | .idea/**/dataSources.local.xml 19 | .idea/**/sqlDataSources.xml 20 | .idea/**/dynamic.xml 21 | .idea/**/uiDesigner.xml 22 | .idea/**/dbnavigator.xml 23 | 24 | # Gradle 25 | .idea/**/gradle.xml 26 | .idea/**/libraries 27 | 28 | # CMake 29 | cmake-build-*/ 30 | 31 | # Mongo Explorer plugin 32 | .idea/**/mongoSettings.xml 33 | 34 | # File-based project format 35 | *.iws 36 | 37 | # IntelliJ 38 | out/ 39 | 40 | # mpeltonen/sbt-idea plugin 41 | .idea_modules/ 42 | 43 | # JIRA plugin 44 | atlassian-ide-plugin.xml 45 | 46 | # Cursive Clojure plugin 47 | .idea/replstate.xml 48 | 49 | # Crashlytics plugin (for Android Studio and IntelliJ) 50 | com_crashlytics_export_strings.xml 51 | crashlytics.properties 52 | crashlytics-build.properties 53 | fabric.properties 54 | 55 | # Editor-based Rest Client 56 | .idea/httpRequests 57 | 58 | # Android studio 3.1+ serialized cache file 59 | .idea/caches/build_file_checksums.ser 60 | 61 | # Docker Compose 62 | .env 63 | -------------------------------------------------------------------------------- /.github/workflows/laravel-git-clone.yml: -------------------------------------------------------------------------------- 1 | name: laravel-git-clone 2 | 3 | on: 4 | pull_request: 5 | schedule: 6 | - cron: '0 0 * * *' 7 | 8 | jobs: 9 | docker-build: 10 | runs-on: ubuntu-latest 11 | 12 | steps: 13 | - uses: actions/checkout@v2 14 | 15 | - name: Git Clone Project 16 | run: git clone https://github.com/laravel/laravel.git backend 17 | 18 | - name: Docker Compose Version 19 | run: docker-compose --version 20 | 21 | - name: Build Docker 22 | run: docker-compose up -d --build 23 | 24 | - name: PHP Version 25 | run: docker-compose exec -T web php --version 26 | 27 | - name: Composer Version 28 | run: docker-compose exec -T web composer --version 29 | 30 | - name: Composer Install 31 | run: docker-compose exec -T web composer install 32 | 33 | - name: Laravel Version 34 | run: docker-compose exec -T web php artisan --version 35 | 36 | - name: Laravel Settings 37 | run: | 38 | docker-compose exec -T web cp .env.example .env 39 | docker-compose exec -T web php artisan key:generate 40 | 41 | - name: Laravel Migrate Testing 42 | run: docker-compose exec -T web php artisan migrate 43 | 44 | - name: Laravel Rollback Testing 45 | run: docker-compose exec -T web php artisan migrate:refresh --seed 46 | 47 | - name: Laravel Seeding Testing 48 | run: docker-compose exec -T web php artisan db:seed 49 | 50 | - name: Laravel PHPUnit Testing 51 | run: docker-compose exec -T web php artisan test 52 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # docker-laravel-apache 🐳 2 | 3 | ![License](https://img.shields.io/github/license/ucan-lab/docker-laravel-apache?color=f05340) 4 | ![Stars](https://img.shields.io/github/stars/ucan-lab/docker-laravel-apache?color=f05340) 5 | ![Issues](https://img.shields.io/github/issues/ucan-lab/docker-laravel-apache?color=f05340) 6 | ![Forks](https://img.shields.io/github/forks/ucan-lab/docker-laravel-apache?color=f05340) 7 | 8 | ## Introduction 9 | 10 | Build a simple laravel development environment with docker-compose. 11 | Apache version of [docker-laravel](https://github.com/ucan-lab/docker-laravel). 12 | 13 | ## Usage 14 | 15 | ```bash 16 | $ git clone git@github.com:ucan-lab/docker-laravel-apache.git 17 | $ cd docker-laravel-apache 18 | $ make create-project # Install the latest Laravel project 19 | $ make install-recommend-packages # Not required 20 | ``` 21 | 22 | http://localhost 23 | 24 | Read this [Makefile](https://github.com/ucan-lab/docker-laravel-apache/blob/master/Makefile). 25 | 26 | ## Container structure 27 | 28 | ```bash 29 | ├── web 30 | └── db 31 | ``` 32 | 33 | ### web container 34 | 35 | - Base image 36 | - [php](https://hub.docker.com/_/php):7.4-apache-buster 37 | - [composer](https://hub.docker.com/_/composer):2.0 38 | - [node](https://hub.docker.com/_/node):node:14-buster 39 | 40 | ### db container 41 | 42 | - Base image 43 | - [mysql](https://hub.docker.com/_/mysql):8.0 44 | 45 | #### Persistent MySQL Storage 46 | 47 | By default, the [named volume](https://docs.docker.com/compose/compose-file/#volumes) is mounted, so MySQL data remains even if the container is destroyed. 48 | If you want to delete MySQL data intentionally, execute the following command. 49 | 50 | ```bash 51 | $ docker-compose down -v && docker-compose up 52 | ``` 53 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | up: 2 | docker-compose up -d 3 | build: 4 | docker-compose build --no-cache --force-rm 5 | laravel-install: 6 | docker-compose exec web composer create-project --prefer-dist laravel/laravel . 7 | create-project: 8 | @make build 9 | @make up 10 | @make laravel-install 11 | docker-compose exec web php artisan key:generate 12 | docker-compose exec web php artisan storage:link 13 | @make fresh 14 | install-recommend-packages: 15 | docker-compose exec web composer require doctrine/dbal 16 | docker-compose exec web composer require --dev barryvdh/laravel-ide-helper 17 | docker-compose exec web composer require --dev beyondcode/laravel-dump-server 18 | docker-compose exec web composer require --dev barryvdh/laravel-debugbar 19 | docker-compose exec web composer require --dev roave/security-advisories:dev-master 20 | docker-compose exec web php artisan vendor:publish --provider="BeyondCode\DumpServer\DumpServerServiceProvider" 21 | docker-compose exec web php artisan vendor:publish --provider="Barryvdh\Debugbar\ServiceProvider" 22 | init: 23 | docker-compose up -d --build 24 | docker-compose exec web composer install 25 | docker-compose exec web cp .env.example .env 26 | docker-compose exec web php artisan key:generate 27 | docker-compose exec web php artisan storage:link 28 | @make fresh 29 | remake: 30 | @make destroy 31 | @make init 32 | stop: 33 | docker-compose stop 34 | down: 35 | docker-compose down --remove-orphans 36 | restart: 37 | @make down 38 | @make up 39 | destroy: 40 | docker-compose down --rmi all --volumes --remove-orphans 41 | destroy-volumes: 42 | docker-compose down --volumes --remove-orphans 43 | ps: 44 | docker-compose ps 45 | logs: 46 | docker-compose logs 47 | logs-watch: 48 | docker-compose logs --follow 49 | log-web: 50 | docker-compose logs web 51 | log-web-watch: 52 | docker-compose logs --follow web 53 | log-app: 54 | docker-compose logs app 55 | log-app-watch: 56 | docker-compose logs --follow app 57 | log-db: 58 | docker-compose logs db 59 | log-db-watch: 60 | docker-compose logs --follow db 61 | web: 62 | docker-compose exec web bash 63 | migrate: 64 | docker-compose exec web php artisan migrate 65 | fresh: 66 | docker-compose exec web php artisan migrate:fresh --seed 67 | seed: 68 | docker-compose exec web php artisan db:seed 69 | rollback-test: 70 | docker-compose exec web php artisan migrate:fresh 71 | docker-compose exec web php artisan migrate:refresh 72 | tinker: 73 | docker-compose exec web php artisan tinker 74 | test: 75 | docker-compose exec web php artisan test 76 | optimize: 77 | docker-compose exec web php artisan optimize 78 | optimize-clear: 79 | docker-compose exec web php artisan optimize:clear 80 | cache: 81 | docker-compose exec web composer dump-autoload -o 82 | @make optimize 83 | docker-compose exec web php artisan event:cache 84 | docker-compose exec web php artisan view:cache 85 | cache-clear: 86 | docker-compose exec web composer clear-cache 87 | @make optimize-clear 88 | docker-compose exec web php artisan event:clear 89 | npm: 90 | @make npm-install 91 | npm-install: 92 | docker-compose exec web npm install 93 | npm-dev: 94 | docker-compose exec web npm run dev 95 | npm-watch: 96 | docker-compose exec web npm run watch 97 | npm-watch-poll: 98 | docker-compose exec web npm run watch-poll 99 | npm-hot: 100 | docker-compose exec web npm run hot 101 | yarn: 102 | docker-compose exec web yarn 103 | yarn-install: 104 | @make yarn 105 | yarn-dev: 106 | docker-compose exec web yarn dev 107 | yarn-watch: 108 | docker-compose exec web yarn watch 109 | yarn-watch-poll: 110 | docker-compose exec web yarn watch-poll 111 | yarn-hot: 112 | docker-compose exec web yarn hot 113 | db: 114 | docker-compose exec db bash 115 | sql: 116 | docker-compose exec db bash -c 'mysql -u $$MYSQL_USER -p$$MYSQL_PASSWORD $$MYSQL_DATABASE' 117 | redis: 118 | docker-compose exec redis redis-cli 119 | ide-helper: 120 | docker-compose exec web php artisan clear-compiled 121 | docker-compose exec web php artisan ide-helper:generate 122 | docker-compose exec web php artisan ide-helper:meta 123 | docker-compose exec web php artisan ide-helper:models --nowrite 124 | --------------------------------------------------------------------------------