Working with Volumes
Volumes are a way that you can map directories or individual files into a running container. This is useful to provide code to run for a generic container, or directories to store data that persist longer than the life of the container, or to even override directories and/or files that exist in an image. Lets look at a few of those examples.
Provide code for a generic container to run*
The default phase2/apache-php:php70 is a Web/PHP container that provides only an index file in /var/www/html
that
prints out phpinfo(). This is obviously not very useful for an application, so we can provide an entire Drupal site to
run and we do that by mapping our site into the default docroot like this:
./build/html:/var/www/html
This takes the Drupal site we have in our local project directory of build/html
and it overrides the default content
of the images /var/www/html
directory.
Persist data longer than the life of the container
When using a database like mysql the container will store the database files in /var/lib/mysql
and by default that
directory will be reset every time the container restarts. This means each time you restart your container you'd need
to reinstall your application and database, which can make life difficult. So in order to persist mysql data for longer
than the current run of the container we will map a directory from the Docker Host into the container and override the
default /var/lib/mysql
directory. The configuration will look something like this.
/data/drupal/mysql:/var/lib/mysql
Now when your database container creates files in /var/lib/mysql
they are actually saved in the /data/drupal/mysql
directory on the Docker Host. Be sure to namespace your directories inside /data so that separate projects don't conflict
with each other. You'll also want to ensure you clean up when you are done with your project to keep from using up all
of your disk space. See the cleaning up section for more info.
Override directories and files that exist in an image
Generally the configuration shipped with a Docker Image is meant to be the production configuration. Often, that configuration is not suitable for development and we need to override configurations. With volumes we have shown earlier how you can override directories, but you can also override individual files too.
./config/dev/httpd/httpd.conf:/etc/httpd/httpd.conf
This takes a local httpd.conf
file from our project and overrides the /etc/httpd/httpd.conf
files that ships with
the container.
Changing Volume Definitions in Compose File
If you wind up changing volume definitions in your docker-compose file you will need to remove your container before it will recognize those changes on a restart.
In the project directory, run: docker-compose rm
This command will remove all stopped containers defined in the docker-compose.yml. You could also remove an individual
container by running: docker-compose rm <name in yml>
After removing the container, it will revert to the original state from the Docker image, removing any packages
installed or files modified that are not included in a volume mount. Start your containers again with docker-compose up
and you should have your new volume mounts.