Taking Docker for a spin
Originally posted at www.walley.org.uk.
Docker has intrigued me for some time now so I thought I'd take a closer look. Purely in a personal capacity, as until Docker supports Windows containers there are few applications at work.
Let's pick something simple but non-trivial. I'd like to set up an instance of WordPress locally. WordPress relies on MySQL for storage so let's split the MySQL database out into its own container first.
>> docker run --name db -e MYSQL_ROOT_PASSWORD=example -d mysql
We can then run the WordPress container and link it to our MySQL container like so.
>> docker run --name wordpress --link db:mysql -p 8080:80 -d wordpress
This is all fine and dandy but we need to persist the data beyond the lifetime of an ephemeral container.
We could mount a host directory as a data volume.
>> docker run --name db -v /var/container_data/mysql:/var/lib/mysql -d mysql
This will mount the host directory, /var/container_data/mysql, into the container at /var/lib/mysql.
A problem with this approach is that it is no longer portable and the data directory is outside the control of Docker.
Data Volume Containers, essentially data-only containers, provide the solution.
>> docker run -v /dbdata --name dbdata mysql /bin/true
The bin/true command is simply a dummy as docker needs something to run. It's also worth noting that the container doesn't need to be running to be used. Run docker ps -a to confirm that the container has been created.
We can then use this data container from our MySQL container.
>> docker run --name db --volumes-from dbdata -e MYSQL_ROOT_PASSWORD=example -d mysql
The data is encapsulated by our data container. Within the data container we could mount a host directory as a data volume. However it feels more Docker-like to let the container manage the data and access it through other containers. See wordpress-backup for an example of backing up and restoring a WordPress install.
If you're curious you can use docker inspect dbdata to pinpoint the location of the MySQL storage directory.
"State": { "ExitCode": 0, "FinishedAt": "2015-05-11T18:35:01.586748612Z", "Paused": false, "Pid": 0, "Running": false, "StartedAt": "2015-05-11T18:35:01.270467585Z"},"Volumes": { "/dbdata": "/var/lib/docker/vfs/dir/fa6b72b85c32190da7307764f25888bb63f19e1fa728aeddb8b31b672a46f4ef", "/var/lib/mysql": "/var/lib/docker/vfs/dir/b091111b39a9da92883153bcd1ef3f6ae1dd5ac557381a972444e3e18c330d12"},"VolumesRW": { "/dbdata": true, "/var/lib/mysql": true}
Running ls /var/lib/docker/vfs/dir/b091111b39a9da92883153bcd1ef3f6ae1dd5ac557381a972444e3e18c330d12 shows the contents of our MySQL directory.
>> auto.cnf ibdata1 ib_logfile0 ib_logfile1 mysql performance_schema wordpress
Hi! We've been using Docker to help manage our development environment at work for about a year now ... although at home I use Vagrant for the same purpose, as I'm trying to maintain a cross-platform development environment there. (Work is mostly Linux-only).