From 05a83d383f7132decce6e1ff2b63652d75808869 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Fri, 6 May 2016 17:04:02 +0300 Subject: [PATCH 1/2] Major updates. - upgrade docker compose to v2 - build images locally instead of pulling them from the registry - separate php container form nginx container - support all the php versions including php 7.0 - remove beanstalked container to be optionally added later by the user --- .gitignore | 1 + data/Dockerfile | 5 + docker-compose.yml | 113 ++++++++++--------- mysql/Dockerfile | 9 ++ nginx/Dockerfile | 14 +++ settings/nginx/default => nginx/laravel.conf | 7 +- nginx/nginx.conf | 29 +++++ php/Dockerfile | 16 +++ php/laravel.ini | 3 + php/laravel.pool.conf | 76 +++++++++++++ redis/Dockerfile | 9 ++ 11 files changed, 227 insertions(+), 55 deletions(-) create mode 100644 .gitignore create mode 100644 data/Dockerfile create mode 100644 mysql/Dockerfile create mode 100644 nginx/Dockerfile rename settings/nginx/default => nginx/laravel.conf (86%) create mode 100644 nginx/nginx.conf create mode 100644 php/Dockerfile create mode 100644 php/laravel.ini create mode 100644 php/laravel.pool.conf create mode 100644 redis/Dockerfile diff --git a/.gitignore b/.gitignore new file mode 100644 index 00000000..df1a13b2 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/logs \ No newline at end of file diff --git a/data/Dockerfile b/data/Dockerfile new file mode 100644 index 00000000..15869d36 --- /dev/null +++ b/data/Dockerfile @@ -0,0 +1,5 @@ +FROM debian:jessie + +MAINTAINER Mahmoud Zalt + +CMD ["true"] diff --git a/docker-compose.yml b/docker-compose.yml index d668f74f..38fcf335 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,58 +1,65 @@ -# PHP + NGINX Container #---------------------------------- -php-nginx: - image: laradock/php56nginx:0.1.0 - container_name: php-nginx - ports: - - "80:80" - volumes: - - ./settings/nginx:/etc/nginx/sites-available - - ../:/var/www - - ./logs/nginx:/var/log/nginx - links: - - mysql - - redis - privileged: true +version: '2' +services: -# MySQL Container #---------------------------------------- -mysql: - image: laradock/mysql:0.1.0 - container_name: mysql - ports: - - "3306:3306" - volumes_from: - - data - environment: - MYSQL_DATABASE: homestead - MYSQL_USER: homestead - MYSQL_PASSWORD: secret - privileged: true +### Nginx Server Container ################################## -# Redis Container #---------------------------------------- -redis: - image: laradock/redis:0.1.0 - container_name: redis - ports: - - "6379:6379" - volumes_from: - - data - volumes: - - ./logs/redis:/var/log/redis - privileged: true + nginx: + build: ./nginx + container_name: nginx + volumes_from: + - php + volumes: + - ./logs/nginx/:/var/log/nginx + ports: + - "80:80" + links: + - php -# Data Volume Container #---------------------------------- -data: - image: laradock/data:0.1.0 - container_name: data - volumes: - - /var/lib/mysql - - /var/lib/redis +### PHP Container ########################################### -# Beanstalkd Container #----------------------------------- -# beanstalkd: -# image: laradock/beanstalkd:0.1.0 -# container_name: beanstalkd -# ports: -# - "11300:11300" -# privileged: true + php: + build: ./php + container_name: php + volumes: + - ../:/var/www/laravel + - ./logs/php/:/usr/local/var/log + expose: + - "9000" + links: + - mysql -#---------------------------------------------------------- +### MySQL Container ######################################### + + mysql: + build: ./mysql + container_name: mysql + volumes_from: + - data + ports: + - "3306:3306" + environment: + MYSQL_DATABASE: homestead + MYSQL_USER: homestead + MYSQL_PASSWORD: secret + MYSQL_ROOT_PASSWORD: root + +### Redis Container ######################################### + + redis: + build: ./redis + container_name: redis + volumes_from: + - data + ports: + - "6379:6379" + +### DATA Container ########################################## + + data: + build: ./data + container_name: data + volumes: + - /var/lib/mysql + - /var/lib/redis + +### Add more Containers below ############################### diff --git a/mysql/Dockerfile b/mysql/Dockerfile new file mode 100644 index 00000000..b7206cc7 --- /dev/null +++ b/mysql/Dockerfile @@ -0,0 +1,9 @@ +FROM mysql:latest + +MAINTAINER Mahmoud Zalt + +VOLUME /var/lib/mysql + +CMD ["mysqld"] + +EXPOSE 3306 diff --git a/nginx/Dockerfile b/nginx/Dockerfile new file mode 100644 index 00000000..eb114931 --- /dev/null +++ b/nginx/Dockerfile @@ -0,0 +1,14 @@ +FROM nginx:latest + +MAINTAINER Mahmoud Zalt + +ADD nginx.conf /etc/nginx/ +ADD laravel.conf /etc/nginx/sites-available/ + +RUN echo "upstream php-upstream { server php:9000; }" > /etc/nginx/conf.d/upstream.conf + +RUN usermod -u 1000 www-data + +CMD ["nginx"] + +EXPOSE 80 443 diff --git a/settings/nginx/default b/nginx/laravel.conf similarity index 86% rename from settings/nginx/default rename to nginx/laravel.conf index a6865eaa..432c2a71 100644 --- a/settings/nginx/default +++ b/nginx/laravel.conf @@ -2,7 +2,7 @@ server { listen 80 default_server; listen [::]:80 default_server ipv6only=on; - root /var/www/public; + root /var/www/laravel/public; index index.php index.html index.htm; location / { @@ -11,7 +11,7 @@ server { location ~ \.php$ { try_files $uri /index.php =404; - fastcgi_pass unix:/var/run/php5-fpm.sock; + fastcgi_pass php-upstream; fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; @@ -21,3 +21,6 @@ server { deny all; } } + + + diff --git a/nginx/nginx.conf b/nginx/nginx.conf new file mode 100644 index 00000000..07708308 --- /dev/null +++ b/nginx/nginx.conf @@ -0,0 +1,29 @@ +user www-data; +worker_processes 4; +pid /run/nginx.pid; + +events { + worker_connections 2048; + multi_accept on; + use epoll; +} + +http { + server_tokens off; + sendfile on; + tcp_nopush on; + tcp_nodelay on; + keepalive_timeout 15; + types_hash_max_size 2048; + include /etc/nginx/mime.types; + default_type application/octet-stream; + access_log off; + error_log off; + gzip on; + gzip_disable "msie6"; + include /etc/nginx/conf.d/*.conf; + include /etc/nginx/sites-available/*; + open_file_cache max=100; +} + +daemon off; diff --git a/php/Dockerfile b/php/Dockerfile new file mode 100644 index 00000000..d5b7da81 --- /dev/null +++ b/php/Dockerfile @@ -0,0 +1,16 @@ +FROM php:7.0-fpm + +MAINTAINER Mahmoud Zalt + +ADD ./laravel.ini /usr/local/etc/php/conf.d +ADD ./laravel.pool.conf /usr/local/etc/php-fpm.d/ + +# Install extensions using the helper script provided by the base image +RUN docker-php-ext-install \ + pdo_mysql + +RUN usermod -u 1000 www-data + +CMD ["php-fpm"] + +EXPOSE 9000 diff --git a/php/laravel.ini b/php/laravel.ini new file mode 100644 index 00000000..b0e572de --- /dev/null +++ b/php/laravel.ini @@ -0,0 +1,3 @@ +date.timezone = UTC +display_errors = Off +log_errors = On diff --git a/php/laravel.pool.conf b/php/laravel.pool.conf new file mode 100644 index 00000000..ab2a4f1f --- /dev/null +++ b/php/laravel.pool.conf @@ -0,0 +1,76 @@ +; Unix user/group of processes +; Note: The user is mandatory. If the group is not set, the default user's group +; will be used. +user = www-data +group = www-data + +; The address on which to accept FastCGI requests. +; Valid syntaxes are: +; 'ip.add.re.ss:port' - to listen on a TCP socket to a specific address on +; a specific port; +; 'port' - to listen on a TCP socket to all addresses on a +; specific port; +; '/path/to/unix/socket' - to listen on a unix socket. +; Note: This value is mandatory. +listen = 0.0.0.0:9000 + +; Choose how the process manager will control the number of child processes. +; Possible Values: +; static - a fixed number (pm.max_children) of child processes; +; dynamic - the number of child processes are set dynamically based on the +; following directives. With this process management, there will be +; always at least 1 children. +; pm.max_children - the maximum number of children that can +; be alive at the same time. +; pm.start_servers - the number of children created on startup. +; pm.min_spare_servers - the minimum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is less than this +; number then some children will be created. +; pm.max_spare_servers - the maximum number of children in 'idle' +; state (waiting to process). If the number +; of 'idle' processes is greater than this +; number then some children will be killed. +; ondemand - no children are created at startup. Children will be forked when +; new requests will connect. The following parameter are used: +; pm.max_children - the maximum number of children that +; can be alive at the same time. +; pm.process_idle_timeout - The number of seconds after which +; an idle process will be killed. +; Note: This value is mandatory. +pm = dynamic + +; The number of child processes to be created when pm is set to 'static' and the +; maximum number of child processes when pm is set to 'dynamic' or 'ondemand'. +; This value sets the limit on the number of simultaneous requests that will be +; served. Equivalent to the ApacheMaxClients directive with mpm_prefork. +; Equivalent to the PHP_FCGI_CHILDREN environment variable in the original PHP +; CGI. The below defaults are based on a server without much resources. Don't +; forget to tweak pm.* to fit your needs. +; Note: Used when pm is set to 'static', 'dynamic' or 'ondemand' +; Note: This value is mandatory. +pm.max_children = 20 + +; The number of child processes created on startup. +; Note: Used only when pm is set to 'dynamic' +; Default Value: min_spare_servers + (max_spare_servers - min_spare_servers) / 2 +pm.start_servers = 2 + +; The desired minimum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.min_spare_servers = 1 + +; The desired maximum number of idle server processes. +; Note: Used only when pm is set to 'dynamic' +; Note: Mandatory when pm is set to 'dynamic' +pm.max_spare_servers = 3 + +;--------------------- + +; Make specific Docker environment variables available to PHP +env[DB_1_ENV_MYSQL_DATABASE] = $DB_1_ENV_MYSQL_DATABASE +env[DB_1_ENV_MYSQL_USER] = $DB_1_ENV_MYSQL_USER +env[DB_1_ENV_MYSQL_PASSWORD] = $DB_1_ENV_MYSQL_PASSWORD + +catch_workers_output = yes diff --git a/redis/Dockerfile b/redis/Dockerfile new file mode 100644 index 00000000..a0a4797b --- /dev/null +++ b/redis/Dockerfile @@ -0,0 +1,9 @@ +FROM redis:latest + +MAINTAINER Mahmoud Zalt + +#COPY redis.conf /usr/local/etc/redis/redis.conf + +CMD [ "redis-server" ] + +EXPOSE 6379 From 9ac7541dc9f4447ac4a3335479c3d6cbe7b122b9 Mon Sep 17 00:00:00 2001 From: Mahmoud Zalt Date: Fri, 6 May 2016 18:33:09 +0300 Subject: [PATCH 2/2] upgrade the readme.md to reflect the last changes --- README.md | 146 ++++++++++++++++++++++++++++-------------------------- 1 file changed, 76 insertions(+), 70 deletions(-) diff --git a/README.md b/README.md index ce32caba..f476474f 100644 --- a/README.md +++ b/README.md @@ -15,23 +15,23 @@ It's like Laravel Homestead but for Docker instead of Vagrant. - [Intro](#Intro) -- [Supported Software (Docker Images)](#Supported-Software) +- [Default Containers](#Default-Containers) - [Requirements](#Requirements) -- [Screencast Tutorial](https://www.youtube.com/watch?v=jGkyO6Is_aI) - [Installation](#Installation) - [Usage](#Usage) - [Documentation](#Documentation) - [List current running Containers](#List-current-running-Containers) - [Close all running Containers](#Close-all-running-Containers) - [Delete all existing Containers](#Delete-all-existing-Containers) + - [Build/Re-build Containers](#Build-Re-build-Containers) - [Use Redis in Laravel](#Use-Redis-in-Laravel) - [Use custom Domain](Use-custom-Domain) - [Change the PHP Version](#Change-the-PHP-Version) - [Add/Remove a Docker Container](#AddRemove-a-Docker-Container) - - [Add Docker Images](#Add-Docker-Images) + - [Add more Software's (Docker Images)](#Add-Docker-Images) - [Edit a Docker Container](#Edit-a-Docker-Container) - [View the Log files](#View-the-Log-files) - - [Upgrade the Docker Images](#Upgrade-the-Docker-Images) + - [Enter a Container (SSH into a running Container)](#Enter-Container) - [Edit a Docker Image](#Edit-a-Docker-Image) - [Run a Docker Virtual Host](#Run-Docker-Virtual-Host) - [Find your Docker IP Address](#Find-Docker-IP-Address) @@ -62,20 +62,14 @@ Seriously!!! Instead of providing a full Virtual Machines, like you get with Vagrant, Docker provides you **lightweight** Virtual Containers, that share the same kernel and allow to safely execute independent processes. - -## Supported Software (Docker Images) + +## Default Containers -- PHP 5.6 / NGINX -- PHP 5.5 / NGINX +- PHP +- NGINX - MySQL - Redis -- Data Volume (for MySQL & Redis) -- Beanstalked - - -The Images links on [Github](https://github.com/LaraDock) -
-The Images links on [Docker Hub](https://hub.docker.com/u/laradock/) +- Data Volume @@ -88,12 +82,6 @@ The Images links on [Docker Hub](https://hub.docker.com/u/laradock/) ## Installation -What is better than watching a video tutorial!! -
-If you prefer watch this [screencast](https://www.youtube.com/watch?v=jGkyO6Is_aI), for how to install and use this tool. - -
- 1 - Clone the `LaraDock` repository, in any of your `Laravel` projects: ```bash @@ -169,7 +157,6 @@ docker ps docker-compose stop ``` -
#### Delete all existing Containers @@ -182,18 +169,26 @@ docker-compose rm -f `docker stop {container-name}` +
+ +#### Build/Re-build Containers +```bash +docker-compose build +``` + +
#### Use Redis in Laravel -Open your Laravel's `.env` file and set the `REDIS_HOST` to your `Docker-IP` instead of the default `127.0.0.1`. +Open your Laravel's `.env` file and set the `REDIS_HOST` to your `Docker-IP` instead of the default `127.0.0.1` IP. ```env REDIS_HOST=xxx.xxx.xxx.xxx ``` -If you don't find the `REDIS_HOST` variable in your `.env` file. Go to the database config file `config/database.php` and replace the `127.0.0.1` with your `Docker-IP` for Redis like this: +If you don't find the `REDIS_HOST` variable in your `.env` file. Go to the database config file `config/database.php` and replace the default `127.0.0.1` IP with your `Docker-IP` for Redis like this: ```php 'redis' => [ @@ -215,10 +210,16 @@ SESSION_DRIVER=redis Finally make sure you have the `predis/predis` package `(~1.0)` installed via Composer first. -```shell +```bash composer require predis/predis:^1.0 ``` +You can manually test it with: + +```php +\Cache::store('redis')->put('laradock', 'awesome', 10); +``` +
@@ -240,54 +241,47 @@ Example: DB_HOST=xxx.xxx.xxx.xxx ``` -3 - Open the nginx config file `docker/settings/nginx/default` and add this in the `server`: +3 - Open your browser and visit `{http://laravel.dev}` + + + +Optionally you can define the server name in the nginx config file, like this: ``` server_name laravel.dev; ``` -4 - Open your browser and visit `{http://laravel.dev}` - - ->In case you faced any problem, try this additional step: -> ->Open the `docker-compose.yml` and add the following to `php-nginx:` -> ->```yaml -> extra_hosts: -> - "laravel.dev:xxx.xxx.xxx.xxx" ->``` -
#### Change the PHP Version -By default **PHP 5.6** is running. +By default **PHP 7.0** is running.
-To change the default PHP version, simply open your `docker-compose.yml` file and edit this line: +To change the default PHP version: -```yaml -image: laradock/php56nginx:latest +1 - Open the `dockerfile` of the `php` folder. + +2 - Change the PHP version number in the first line, + +```txt +FROM php:7.0-fpm ``` -Supported versions: - -- (PHP 5.5.*) laradock/php55nginx:latest -- (PHP 5.6.*) laradock/php56nginx:latest - - -**Note:** If you use this `laradock/phpnginx` image, it will pull from `laradock/php56nginx`. +Supported Versions: +- For (PHP 7.0.*) use `php:7.0-fpm` +- For (PHP 5.6.*) use `php:5.6-fpm` +- For (PHP 5.5.*) use `php:5.5-fpm` +For more details visit the [official PHP docker images](https://hub.docker.com/_/php/).
-#### Add Docker Images -*(add a software to run with other Containers)* -
-To add an image (software), just edit the `docker-compose.yml` and add your container details, to do so you need to be familiar with the [docker compose file syntax](https://docs.docker.com/compose/yml/). +#### Add more Software's (Docker Images) + +To add an image (software), just edit the `docker-compose.yml` and add your container details, to do so you need to be familiar with the [docker compose file syntax](https://docs.docker.com/compose/compose-file/). @@ -311,18 +305,26 @@ Example: if you want to set the MySQL port to 3333, just replace the default por The Log files are stored in the `docker/logs` directory. - -
- -#### Upgrade the Docker Images + +#### Enter a Container (SSH into a running Container) -By default `docker-compose.yml` is configured to use the latest stable version of the image (latest stable realease `tag`). +1 - first list the current running containers with `docker ps` +2 - enter any container with: + +Example: enter the `php` container + +```bash +docker exec -it php bash +``` + +Example: enter the `nginx` container + +```bash +docker exec -it nginx bash +``` -To use the latest build you can edit the `docker-compose.yml` file and replace the version number at the end of every image name with `:latest` -
-Example: change `image: laradock/mysql:0.1.0` to `image: laradock/mysql:latest`
@@ -334,14 +336,19 @@ To prevent a container (software) from running, open the `docker-compose.yml` fi
-#### Edit a Docker Image (change some configuration in the image) -To edit an image, and take full control of it: +#### Edit a Docker Image -1. Clone any Image from [https://github.com/LaraDock](https://github.com/LaraDock) -2. Modify the `Dockfile` -3. Run `docker build -t {your-image-name} .` +1 - Find the `dockerfile` of the image you want to edit, +
+example for `php` it will be `docker/php/dockerfile`. -All the images are open source and hosted on the [Docker Hub](https://hub.docker.com/u/laradock/). +2 - Edit the file the way you want. + +3 - Re-build the container: + +```bash +docker-compose build +``` *If you find any bug or you have and suggestion that can improve the performance of any image, please consider contributing. Thanks in advance.* @@ -407,9 +414,8 @@ All Docker Images can be found at [https://github.com/LaraDock](https://github.c -#### Questions? -[![Join the chat at https://gitter.im/LaraDock/laradock](https://badges.gitter.im/Join%20Chat.svg)](https://gitter.im/LaraDock/laradock?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge) - +### Questions? +If you have any question, send me a direct message on LaraChat, my username is `mahmoud_zalt`. ## Credits