ohMyDocker gives you full development environment for PHP & Symfony. With Nginx & PHP-FPM & MariaDB & Postgres etc.
- download the latest release or clone the repo
- rename
docker-compose.yml.dist
- customize your
docker-compose.yml
- Build/run containers with (with and without detached mode)
$ docker-compose build
$ docker-compose up # or with "-d" option for "detached mode"
Here are the docker-compose
built images:
nginx
: the Nginx web server container, volumes are gathered from the PHP container,php
: the PHP-FPM container in which the application volume is mounted (OPcache & optimized for Docker usage),mariadb
: the MariaDB MySQL container,postgres
: the Postgres container,mongo
: the MongoDB container,couchdb
: the CouchDB container,
This results in the following running containers:
$ docker-compose ps
Name Command State Ports
----------------------------------------------------------------------------------------
ohmydocker_nginx_1 nginx -c /nginx.conf Up 0.0.0.0:8080->80/tcp
ohmydocker_php_1 docker-php-entrypoint php-fpm Up 0.0.0.0:9000->9000/tcp
ohmydocker_mariadb_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp
ohmydocker_postgres_1 docker-entrypoint.sh postgres Up 0.0.0.0:5432->5432/tcp
ohmydocker_mongo_1 docker-entrypoint.sh mongod Up 0.0.0.0:27017->27017/tcp
ohmydocker_couchdb_1 tini -- /docker-entrypoint ... Up 0.0.0.0:5984->5984/tcp
With this configuration, you can set up docker
for one or many projects. all you have to do is to :
- update PHP
volumes
with paths to your projects - rename
docker/nginx/nginx.conf.dist
todocker/nginx/nginx.conf
and update project and mailcatcher configuration - rename
docker/mariadb/env.dist
todocker/mariadb/.env
and update configuration - rename
docker/postgres/env.dist
todocker/postgres/.env
and update configuration
Basic and full Nginx configuration within nginx.conf
file. you can customize/duplicate the project section to fit your need.
# project configuration
server {
listen 80;
server_name project.loc www.project.loc;
root /var/www/html/web;
location / {
# try to serve file directly, fallback to app.php
try_files $uri /app.php$is_args$args;
}
# PROD
location ~ ^/app\.php(/|$) {
fastcgi_pass php-upstream;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi_params;
# When you are using symlinks to link the document root to the
# current version of your application, you should pass the real
# application path instead of the path to the symlink to PHP
# FPM.
# Otherwise, PHP's OPcache may not properly detect changes to
# your PHP files (see https://github.com/zendtech/ZendOptimizerPlus/issues/126
# for more information).
fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
fastcgi_param DOCUMENT_ROOT $realpath_root;
# Prevents URIs that include the front controller. This will 404:
# http://domain.tld/app.php/some-path
# Remove the internal directive to allow URIs like this
internal;
}
error_log /var/log/nginx/project_error.log;
access_log /var/log/nginx/project_access.log;
}
# mail catcher
server {
listen 80;
server_name mailcatcher.project.loc;
location / {
proxy_pass http://mailcatcher-upstream;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Host $server_name;
proxy_intercept_errors on;
}
error_log /var/log/nginx/mailcatcher_error.log;
access_log /var/log/nginx/mailcatcher_access.log;
}
logs are shared within
docker/logs
directory.
Built on the top of the wonderful docker-library/php so you can switch from many version of PHP just by customizing the docker/php/Dockerfile
.
The PHP container includes :
- opcache, iconv, mcrypt, mbstring, intl, pdo, pdo_mysql, pdo_pgsql, gd and xdebug.
- opcache pre configured
- ready to use composer
timezone set to
Europe/Paris
You can customize configuration (like password, user and database) within docker/mariadb/env
or docker/postgres/env
.
all data are persisted within
docker/data
directory.
I know that everyone has his own alias and functions for Docker. but here are some useful tricks.
#docker alias
alias dc='docker-compose'
alias dcup='docker-compose up -d'
alias dcps='docker-compose ps'
alias dcb='docker-compose build'
alias dcd='docker-compose down'
alias dcs='docker stop $(docker ps -a -q) && docker rm $(docker ps -a -q)'
#docker functions
dci(){ docker inspect "$@"; }
dcip(){ docker inspect $(docker ps -f name="$@" -q) | grep IPAddress; }
dcbash(){ docker-compose run "$@" bash; }
Please see License File for more information.