Compare commits

...

10 Commits

Author SHA1 Message Date
5d84c6481f revers the dependancies between php and the db
to prevent running all the db engines when php is running
2016-05-07 05:29:48 +03:00
26229e150d Merge pull request #35 from benmag/master
link postgres service to php service
2016-05-07 05:14:01 +03:00
2b98b0b82e update the readme, include supported containers 2016-05-07 05:10:57 +03:00
457c5d4b1b update the readme file
Support selecting your own containers in the docker compose command.
2016-05-07 05:03:07 +03:00
cd97ac0aa6 link postgres service to php service 2016-05-07 11:55:00 +10:00
22f11e03ee Merge pull request #34 from benmag/master
Add support for postgres
2016-05-07 04:34:27 +03:00
5d62ec1e67 Add support for postgres 2016-05-07 11:16:06 +10:00
daa5ed981f Merge pull request #32 from LaraDock/develop
Major Updates
2016-05-06 18:55:57 +03:00
9ac7541dc9 upgrade the readme.md to reflect the last changes 2016-05-06 18:33:09 +03:00
05a83d383f 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
2016-05-06 17:04:02 +03:00
13 changed files with 371 additions and 138 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
/logs

201
README.md
View File

@ -15,23 +15,23 @@ It's like Laravel Homestead but for Docker instead of Vagrant.
- [Intro](#Intro) - [Intro](#Intro)
- [Supported Software (Docker Images)](#Supported-Software) - [Supported Containers](#Supported-Containers)
- [Requirements](#Requirements) - [Requirements](#Requirements)
- [Screencast Tutorial](https://www.youtube.com/watch?v=jGkyO6Is_aI)
- [Installation](#Installation) - [Installation](#Installation)
- [Usage](#Usage) - [Usage](#Usage)
- [Documentation](#Documentation) - [Documentation](#Documentation)
- [List current running Containers](#List-current-running-Containers) - [List current running Containers](#List-current-running-Containers)
- [Close all running Containers](#Close-all-running-Containers) - [Close all running Containers](#Close-all-running-Containers)
- [Delete all existing Containers](#Delete-all-existing-Containers) - [Delete all existing Containers](#Delete-all-existing-Containers)
- [Use Redis in Laravel](#Use-Redis-in-Laravel) - [Build/Re-build Containers](#Build-Re-build-Containers)
- [Use Redis](#Use-Redis)
- [Use custom Domain](Use-custom-Domain) - [Use custom Domain](Use-custom-Domain)
- [Change the PHP Version](#Change-the-PHP-Version) - [Change the PHP Version](#Change-the-PHP-Version)
- [Add/Remove a Docker Container](#AddRemove-a-Docker-Container) - [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) - [Edit a Docker Container](#Edit-a-Docker-Container)
- [View the Log files](#View-the-Log-files) - [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) - [Edit a Docker Image](#Edit-a-Docker-Image)
- [Run a Docker Virtual Host](#Run-Docker-Virtual-Host) - [Run a Docker Virtual Host](#Run-Docker-Virtual-Host)
- [Find your Docker IP Address](#Find-Docker-IP-Address) - [Find your Docker IP Address](#Find-Docker-IP-Address)
@ -62,21 +62,15 @@ 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. 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.
<a name="Supported-Software"></a> <a name="Supported-Containers"></a>
## Supported Software (Docker Images) ## Supported Containers
- PHP 5.6 / NGINX - PHP
- PHP 5.5 / NGINX - NGINX
- MySQL - MySQL
- PostgreSQL
- Redis - Redis
- Data Volume (for MySQL & Redis) - Data Volume
- Beanstalked
The Images links on [Github](https://github.com/LaraDock)
<br>
The Images links on [Docker Hub](https://hub.docker.com/u/laradock/)
<a name="Requirements"></a> <a name="Requirements"></a>
## Requirements ## Requirements
@ -88,12 +82,6 @@ The Images links on [Docker Hub](https://hub.docker.com/u/laradock/)
<a name="Installation"></a> <a name="Installation"></a>
## Installation ## Installation
What is better than watching a video tutorial!!
<br>
If you prefer watch this [screencast](https://www.youtube.com/watch?v=jGkyO6Is_aI), for how to install and use this tool.
<br>
1 - Clone the `LaraDock` repository, in any of your `Laravel` projects: 1 - Clone the `LaraDock` repository, in any of your `Laravel` projects:
```bash ```bash
@ -126,23 +114,36 @@ DB_HOST=xxx.xxx.xxx.xxx
[How to find my Docker IP Address?](#Find-Docker-IP-Address) [How to find my Docker IP Address?](#Find-Docker-IP-Address)
<br> <br>
2 - Run the containers: 2 - Run the Containers, (you can select the software's (containers) that you wish to run)
<br> <br>
*(Make sure you are in the `docker` folder before running this command)* *Make sure you are in the `docker` folder before running the `docker-compose` command.*
> Running PHP, NGINX and MySQL:
```bash ```bash
docker-compose up -d docker-compose up -d php nginx mysql
``` ```
>*Only the first time you run this command, it will take up to 5 minutes (depend on your connection speed) to download the Docker Images on your local machine.* Note: you can choose your own combination of software's (containers), another example:
> Running PHP, NGINX, Postgres and Redis:
```bash
docker-compose up -d php nginx postgres redis
```
Supported Containers: `php`, `nginx`, `mysql`, `postgres`, `redis`, `data`.
<br> <br>
3 - Open your browser and visit your `{Docker-IP}` address (`http://xxx.xxx.xxx.xxx`). 3 - Open your browser and visit your `{Docker-IP}` address (`http://xxx.xxx.xxx.xxx`).
> **Debugging**: in case you faced an error here, run this command from the Laravel root directory: <br>
> <br> **Debugging**: in case you faced an error here, run this command from the Laravel root directory:
> `sudo chmod -R 777 storage && sudo chmod -R 777 bootstrap/cache`
```bash
sudo chmod -R 777 storage && sudo chmod -R 777 bootstrap/cache
```
<br> <br>
@ -169,6 +170,11 @@ docker ps
docker-compose stop docker-compose stop
``` ```
To stop single container do:
```php
docker-compose stop {container-name}
```
<br> <br>
<a name="Delete-all-existing-Containers"></a> <a name="Delete-all-existing-Containers"></a>
@ -179,21 +185,38 @@ docker-compose rm -f
*Note: Careful with this command as it will delete your Data Volume Container as well. (if you want to keep your Database data than you should stop each container by itself as follow):* *Note: Careful with this command as it will delete your Data Volume Container as well. (if you want to keep your Database data than you should stop each container by itself as follow):*
`docker stop {container-name}`
<br> <br>
<a name="Use-Redis-in-Laravel"></a> <a name="Build-Re-build-Containers"></a>
#### Use Redis in Laravel #### Build/Re-build Containers
Open your Laravel's `.env` file and set the `REDIS_HOST` to your `Docker-IP` instead of the default `127.0.0.1`. If you do any change to any `dockerfile` make sure you run this command, for the changes to take effect:
```bash
docker-compose build
```
Optionally you can specify which container to rebuild (instead of rebuilding all the containers), example rebuilding `PHP`:
```bash
docker-compose build php
```
<br>
<a name="Use-Redis"></a>
#### Use Redis
1 - First make sure you run the Redis Container with the `docker-compose` command.
2 - 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 ```env
REDIS_HOST=xxx.xxx.xxx.xxx 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 ```php
'redis' => [ 'redis' => [
@ -206,19 +229,26 @@ If you don't find the `REDIS_HOST` variable in your `.env` file. Go to the datab
], ],
``` ```
To enable Redis Caching and/or for Sessions Management. Also from the `.env` file set `CACHE_DRIVER` and `SESSION_DRIVER` to `redis` instead of the default `file`. 3 - To enable Redis Caching and/or for Sessions Management. Also from the `.env` file set `CACHE_DRIVER` and `SESSION_DRIVER` to `redis` instead of the default `file`.
```env ```env
CACHE_DRIVER=redis CACHE_DRIVER=redis
SESSION_DRIVER=redis SESSION_DRIVER=redis
``` ```
Finally make sure you have the `predis/predis` package `(~1.0)` installed via Composer first. 4 - Finally make sure you have the `predis/predis` package `(~1.0)` installed via Composer first.
```shell ```bash
composer require predis/predis:^1.0 composer require predis/predis:^1.0
``` ```
5 - You can manually test it from Laravel with this code:
```php
\Cache::store('redis')->put('laradock', 'awesome', 10);
```
<br> <br>
<a name="Use-custom-Domain"></a> <a name="Use-custom-Domain"></a>
@ -240,54 +270,47 @@ Example:
DB_HOST=xxx.xxx.xxx.xxx 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; 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"
>```
<br> <br>
<a name="Change-the-PHP-Version"></a> <a name="Change-the-PHP-Version"></a>
#### Change the PHP Version #### Change the PHP Version
By default **PHP 5.6** is running. By default **PHP 7.0** is running.
<br> <br>
To change the default PHP version, simply open your `docker-compose.yml` file and edit this line: To change the default PHP version:
```yaml 1 - Open the `dockerfile` of the `php` folder.
image: laradock/php56nginx:latest
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/).
<br> <br>
<a name="Add-Docker-Images"></a> <a name="Add-Docker-Images"></a>
#### Add Docker Images #### Add more Software's (Docker Images)
*(add a software to run with other Containers)*
<br> 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/).
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/).
@ -311,18 +334,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. The Log files are stored in the `docker/logs` directory.
<br> <br>
<a name="Upgrade-the-Docker-Images"></a> <a name="Enter-Container"></a>
#### 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`
<br>
Example: change `image: laradock/mysql:0.1.0` to `image: laradock/mysql:latest`
<br> <br>
@ -334,14 +365,19 @@ To prevent a container (software) from running, open the `docker-compose.yml` fi
<br> <br>
<a name="Edit-a-Docker-Image"></a> <a name="Edit-a-Docker-Image"></a>
#### Edit a Docker Image (change some configuration in the image) #### Edit a Docker Image
To edit an image, and take full control of it:
1. Clone any Image from [https://github.com/LaraDock](https://github.com/LaraDock) 1 - Find the `dockerfile` of the image you want to edit,
2. Modify the `Dockfile` <br>
3. Run `docker build -t {your-image-name} .` 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.* *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 +443,8 @@ All Docker Images can be found at [https://github.com/LaraDock](https://github.c
#### Questions? ### 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) If you have any question, send me a direct message on LaraChat, my username is `mahmoud_zalt`.
## Credits ## Credits

5
data/Dockerfile Normal file
View File

@ -0,0 +1,5 @@
FROM debian:jessie
MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>
CMD ["true"]

View File

@ -1,58 +1,82 @@
# PHP + NGINX Container #---------------------------------- version: '2'
php-nginx: services:
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
# MySQL Container #---------------------------------------- ### Nginx Server 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
# Redis Container #---------------------------------------- nginx:
redis: build: ./nginx
image: laradock/redis:0.1.0 container_name: nginx
container_name: redis volumes_from:
ports: - php
- "6379:6379" volumes:
volumes_from: - ./logs/nginx/:/var/log/nginx
- data ports:
volumes: - "80:80"
- ./logs/redis:/var/log/redis links:
privileged: true - php
# Data Volume Container #---------------------------------- ### PHP Container ###########################################
data:
image: laradock/data:0.1.0
container_name: data
volumes:
- /var/lib/mysql
- /var/lib/redis
# Beanstalkd Container #----------------------------------- php:
# beanstalkd: build: ./php
# image: laradock/beanstalkd:0.1.0 container_name: php
# container_name: beanstalkd volumes:
# ports: - ../:/var/www/laravel
# - "11300:11300" - ./logs/php/:/usr/local/var/log
# privileged: true expose:
- "9000"
#---------------------------------------------------------- ### DATA Container ##########################################
data:
build: ./data
container_name: data
volumes:
- /var/lib/mysql
- /var/lib/postgresql/data
- /var/lib/redis
### 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
links:
- php
### PostgreSQL Container ####################################
postgres:
build: ./postgres
container_name: postgres
volumes_from:
- data
ports:
- "5432:5432"
environment:
POSTGRES_DB: homestead
POSTGRES_USER: homestead
POSTGRES_PASSWORD: secret
links:
- php
### Redis Container #########################################
redis:
build: ./redis
container_name: redis
volumes_from:
- data
ports:
- "6379:6379"
### Add more Containers below ###############################

9
mysql/Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM mysql:latest
MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>
VOLUME /var/lib/mysql
CMD ["mysqld"]
EXPOSE 3306

14
nginx/Dockerfile Normal file
View File

@ -0,0 +1,14 @@
FROM nginx:latest
MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>
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

View File

@ -2,7 +2,7 @@ server {
listen 80 default_server; listen 80 default_server;
listen [::]:80 default_server ipv6only=on; listen [::]:80 default_server ipv6only=on;
root /var/www/public; root /var/www/laravel/public;
index index.php index.html index.htm; index index.php index.html index.htm;
location / { location / {
@ -11,7 +11,7 @@ server {
location ~ \.php$ { location ~ \.php$ {
try_files $uri /index.php =404; try_files $uri /index.php =404;
fastcgi_pass unix:/var/run/php5-fpm.sock; fastcgi_pass php-upstream;
fastcgi_index index.php; fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params; include fastcgi_params;
@ -21,3 +21,6 @@ server {
deny all; deny all;
} }
} }

29
nginx/nginx.conf Normal file
View File

@ -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;

16
php/Dockerfile Normal file
View File

@ -0,0 +1,16 @@
FROM php:7.0-fpm
MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>
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

3
php/laravel.ini Normal file
View File

@ -0,0 +1,3 @@
date.timezone = UTC
display_errors = Off
log_errors = On

76
php/laravel.pool.conf Normal file
View File

@ -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

9
postgres/Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM postgres:latest
MAINTAINER Ben M <git@bmagg.com>
VOLUME /var/lib/postgresql/data
CMD ["postgres"]
EXPOSE 5432

9
redis/Dockerfile Normal file
View File

@ -0,0 +1,9 @@
FROM redis:latest
MAINTAINER Mahmoud Zalt <mahmoud@zalt.me>
#COPY redis.conf /usr/local/etc/redis/redis.conf
CMD [ "redis-server" ]
EXPOSE 6379