Optimized for composer.org usage. See project HarrisStreet.
Condition: Already installed and working Magento System.
If you are already working/developing on a linux machine boot2docker
is not needed.
Install boot2docker and Docker itself.
On OSX please use brew install docker | boot2docker
Download the Zookal custom boot2docker.iso which fixes vboxsf autoload and place the ISO in the correct folder of your OS.
Shared Folders are slow in VirtualBox. A todo point is implementing File system notifications for Go into the boot2docker CLI to constantly sync the files into the VM. There is already some work going on.
For OSX put the ISO in: ~/.boot2docker/
folder.
For Win put the ISO in: ???
folder.
The folders site
and data
are hardcoded in the boot2docker.iso and always maps to: /var/www/site
resp. /var/www/data
.
Documents will be served from /var/www/site/htdocs
. media
, sitemap
and var
folders are automatically symlinked into the htdocs
folder. These three folders stay in the data folder for persistence.
Mac OSX:
boot2docker --vbox-share=/Users/xxx/Sites/web-site=site --vbox-share=/Users/xxx/Sites/web-data=data -v init
Windows:
boot2docker --vbox-share="C:\\Users\xxx\\...=site" --vbox-share="C:\\Users\xxx\\...=data" -v init
Start VM:
$ boot2docker up
Make sure to export properly export DOCKER_HOST=tcp://192.168.x.x:2375
in all terminal windows where you would like to use docker.
To regenerate this string use $ boot2docker socket
.
Update the hosts file of your OS with the new boot2docker ip address.
docker build -t="docharris/redisobject" redis/object/
docker build -t="docharris/redissession" redis/session/
Or docker pull docharris/redisobject|redissession
. @todo
docker run -d --name redisobject docharris/redisobject
docker run -d --name redissession docharris/redissession
This is faster when using Virtualbox with shared folders.
The container RedisStorage
will be used for directory mapping.
docker run -d -v /var/www/data/redis:/data --name RedisStorage dockerfile/ubuntu echo "Redis Storage"
docker run -d --volumes-from RedisStorage --name redisobject docharris/redisobject
docker run -d --volumes-from RedisStorage --name redissession docharris/redissession
docker run -d -v /var/www/data/redis:/data --name RedisStorage dockerfile/ubuntu echo "Redis Storage"
docker run -d --volumes-from RedisStorage --name redis dockerfile/redis redis-server /etc/redis/redis.conf --requirepass <password>
docker run -it --rm --link redisobject:redisobject docharris/redisobject bash -c 'redis-cli -p 6379 -h redisobject'
docker run -it --rm --link redissession:redissession docharris/redissession bash -c 'redis-cli -p 6380 -h redissession'
@todo Add Redis FPC cache.
In dev you can run it without persistence. For more details see the README.md file in the mysql
folder.
Commands for development:
docker build -t "docharris/mysql" mysql/5.5/
docker run --name DocHarrisMySQL -d -p 3306:3306 docharris/mysql
docker logs <CONTAINER_ID>
Last commands shows you the password. Please save that! The you can import databases and users.
Build contailer
docker build -t docharris/mailcatcher mailcatcher/
Run container
docker run -d --name mailcatcher docharris/mailcatcher
Build container to keep persisted data and load Magento PHP files:
docker build -t "docharris/npstorage" npStorage/
Run container:
docker run -d --name npstorage \
-v /var/www/site:/var/www/site \
-v /var/www/data/php:/var/www/data/php \
-v /var/www/data/nginx:/var/www/data/nginx \
-v /var/www/data/media:/var/www/data/media \
-v /var/www/data/sitemap:/var/www/data/sitemap \
-v /var/www/data/var:/var/www/data/var \
docharris/npstorage
This container will immediately exit and only provides the storage for nginx and php container.
The folders media, sitemap and var will be symlinked to /var/www/site/htdocs
.
Build the php container:
$ docker build -t "docharris/php55" php55/
docker run -d --name php \
--volumes-from=npstorage \
-v /var/www/site/path-to/etc/php55/development:/etc/php5/fpm \
-e MY_ENV=dev \
--link redisobject:redisobject \
--link redissession:redissession \
--link DocHarrisMySQL:DocHarrisMySQL \
--link mailcatcher:mailcatcher \
docharris/php55
The -v
switch is optional and maps your custom php config into the fpm folder.
docker run -ti --rm --name php \
--volumes-from=npstorage \
-v /var/www/site/path-to/etc/php55/development:/etc/php5/fpm \
-e MY_ENV=dev \
--link redisobject:redisobject \
--link redissession:redissession \
--link DocHarrisMySQL:DocHarrisMySQL \
--link mailcatcher:mailcatcher \
docharris/php55 bash
The -v
switch is optional and maps your custom php config into the fpm folder.
The bash
at the end starts the shell. When logged in run /config/boot.sh &
to start the fpm process.
There are two env settings at the momement: dev
and prod
. During container start these settings will be copied into the etc folders. So you can test prod settings on your dev machine.
With the open shell you can now use n98-magerun, etc in the /var/www/site
folder.
On the other hand you can have a local php installation on your Windows or OSX system and then run from there n98-magerun.
There is no ssh daemon implemented in all docker containers because that is evil and a anti pattern.
If you need to enter a container use nsenter https://github.com/jpetazzo/nsenter.
docker run -d --name php \
--volumes-from=npstorage \
-v /path-to/etc/php55/production:/etc/php5/fpm \
-e MY_ENV=prod \
--link redisobject:redisobject \
--link redissession:redissession \
docharris/php55
Use the switch
--link DocHarrisMySQL:DocHarrisMySQL \
only when you don't have an external database on another server.
Build command:
docker build -t docharris/nginx nginx/
Run the container background with custom nginx config:
docker run -d --name nginx \
--volumes-from=npstorage \
-v <path-to-your-sites-enabled-folder>:/etc/nginx/sites-enabled
-v <path-to-your-certs-folder>:/etc/nginx/certs
--link php:php \
-p 80:80 \
-p 443:443 \
docharris/nginx
Resource https://registry.hub.docker.com/repos/docharris/
Use this docker pull for the development environment:
docker pull docharris/redisobject:v1.0.2817
docker pull docharris/redissession:v1.0.2817
docker pull docharris/mysql55:v1.0.5538
docker pull docharris/mailcatcher:v1.0.0512
docker pull docharris/npstorage:v1.0.0
docker pull docharris/php55:v1.0.5517
docker pull docharris/nginx:v1.0.162
Use this docker pull for the production environment:
docker pull docharris/npstorage:v1.0.0
docker pull docharris/redisobject:v1.0.2817
docker pull docharris/redissession:v1.0.2817
docker pull docharris/php55:v1.0.5517
docker pull docharris/nginx:v1.0.162
Version number: Major.Minor.Service
- PHP 5517 = 5.5.17
- MySQL 5538 = 5.5.38
- Redis 2817 = 2.8.17
Whenever a Services changes this will be reflected in the last number. Whenever something in the Dockerfile changes this will reflect the Major and Minor numbers.
The version in the Makefile
will be updated and not here.
Should look like this:
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3878874b2e53 docharris/nginx:v1.0.162 "nginx" 15 hours ago Up 17 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp nginx
4d547ce9ad09 docharris/php55:latest "/sbin/my_init" 15 hours ago Up 20 minutes 9000/tcp nginx/php,php
66992efff9d0 docharris/mailcatcher:v1.0.0512 "/bin/sh -c 'mailcat 15 hours ago Up 27 minutes 25/tcp, 0.0.0.0:1080->1080/tcp mailcatcher,nginx/php/mailcatcher,php/mailcatcher
e1162135c0ff docharris/mysql55:v1.0.5538 "/run.sh" 15 hours ago Up 32 minutes 0.0.0.0:3306->3306/tcp DocHarrisMySQL,nginx/php/DocHarrisMySQL,php/DocHarrisMySQL
82d155658e8c docharris/npstorage:latest "/sbin/my_init" 16 hours ago Up About an hour npstorage
1ad4516fa165 docharris/redissession:latest "/sbin/my_init" 18 hours ago Up 3 hours 6380/tcp nginx/php/redissession,php/redissession,redissession
9dde9cd1306e docharris/redisobject:latest "/sbin/my_init" 18 hours ago Up 3 hours 6379/tcp nginx/php/redisobject,php/redisobject,redisobject
c85a95f3bad7 phusion/baseimage:0.9.15 "echo 'Redis Storage 18 hours ago Exited (0) 3 hours ago RedisStorage
With Docker <= 1.2 you must restart all linked containers. If you restart container php then you must restart nginx also. If you restart MySQL or Redis container then you must restart php and nginx.
Docker 1.3 solves that problem by automatically updating the /etc/hosts
files in all containers with the new IP addresses of the restarted containers.
docker rmi $(docker images -a -q)
docker stop $(docker ps -a -q)
docker rm $(docker ps -a -q)
Running this on OSX gives you a nice UI to interact with containers and images:
docker build -t crosbymichael/dockerui github.com/crosbymichael/dockerui
docker run -d -p 9000:9000 -v /var/run/docker.sock:/docker.sock crosbymichael/dockerui -e /docker.sock
Run it with boot2docker in your browser:
http://(`boot2docker ip`):9000
Do not use it in production as it has no security.
German blog post from @cmuench: http://blog.muench-worms.de/einfaches-php-basiertes-docker-web-interface/
Github source code: https://github.com/netz98/docker-ui
When running the container for php we have defined links to other containers:
--link redisobject:redisobject \
--link redissession:redissession \
--link DocHarrisMySQL:DocHarrisMySQL
--link Name:Alias
The aliases will be added to the /etc/hosts file:
[ root@555f71b1bdc7:/var/www/site ]$ cat /etc/hosts
172.17.0.183 555f71b1bdc7
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
127.0.0.1 localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
172.17.0.178 DocHarrisMySQL
172.17.0.29 redisobject
172.17.0.30 redissession
Don't care for the IP addresses as these ones are dynamic and change with each start or restart.
You can then use as host name: DocHarrisMySQL, etc in you app/etc/local.xml
config.
There is no ssh daemon implemented in all Docker containers because that is evil and an anti pattern.
If you need to enter a container use nsenter https://github.com/jpetazzo/nsenter.
docker-enter [docharris/php55 or Container ID] php n98-magerun.phar
docker-enter() {
boot2docker ssh '[ -f /var/lib/boot2docker/nsenter ] || docker run --rm -v /var/lib/boot2docker/:/target jpetazzo/nsenter'
boot2docker ssh -t sudo /var/lib/boot2docker/docker-enter "$@"
}
You can use it directly from your host, no need to ssh into boot2docker.
Please what ever you see or think is wrong tweet it to @schumacherfm, create an issue or open a pull request.
- Maybe docker fig
No all containers have been switched to phusion/baseimage because some are not necessary.
Open Software License (OSL 3.0)
Copyright (c) Zookal Pty Ltd, Sydney, Australia
Cyrill at Schumacher dot fm or cyrill at zookal dot com