Dockerizing Redmine
Migrate an existing Redmine application into a Docker based container. There are two main steps:
- Migrate MySQL database
- Migrate Redmine application
MySQL
Create an archive from the source data directory, where data to be migrated:
|
|
The directory /var/lib/mysql
is the default location where all database related data are stored.
Download the archive:
|
|
Extract to the directory where we will map the host volume to the guest:
|
|
Download the latest (5.7.16
make sure it is the latest, because 8.x
branch might not work) MySQL Docker image:
|
|
Run a MySQL container with the data directory mounted from the host:
|
|
Environment variables (MYSQL_ROOT_PASSWORD
, MYSQL_DATABASE
, MYSQL_USER
, or MYSQL_PASSWORD
) become unnecessary:
Do note that none of the variables below will have any effect if you start the container with a data directory that already contains a database: any pre-existing database will always be left untouched on container startup.[^1]
Now I should be able to access my existing database:
|
|
But when accessing MySQL database from another host, we have to update the permissions. Let’s log into MySQL with root
user:
|
|
Issue SQL commands:
|
|
Only localhost
is allowed for both the database and the user. This is problematic. How does one know the host of the container yet to be created? The easiest way is to allow access from all hosts:
|
|
We can restrict to a set of IP addresses such as 172.17.0.%
or sub domains %.example.com
. Docker networking uses 172.17.0.x
range.
The better way is that when linking containers, should be able to update mysql
container /etc/hosts
file to include a redmine
container field. Then, a wild card is not necessary.
But having to allow all hosts to connect is fine, because all hosts do not mean all hosts. The port is not bind or map to any open port in the host machine. Only the host (172.17.0.1
) and other Docker containers inside the host can discover the service provided. Other machines or containers outside the host is not able to access at all.
Restart the container to have the update taking effect:
|
|
Redmine
For a basic Redmine setup, there aren’t much to migrate, mainly just three directories, config
, files
, and log
, others are application data. Configuration could be done via environment variables, and if logs weren’t important to migrate, we just need to move the files
directory, which is used for file upload.
Create an archive from the source data directory:
|
|
Download the archive:
|
|
Extract the just the files
directory and copy to the new location:
|
|
Configuration directory (config
) contains only database.yml
file, which can be overridden via environment variables. One less volume to map. And here is the mapping from the file to the environment variables:
|
|
Download the latest (3.3.1
) Redmine Docker image:
|
|
Run Redmine container with link to the MySQL container:
|
|
We still want to map the log
directory even we are not migrating the old logs, because we still need to access the new logs without dropping into the container.
Containers are linked:
|
|
If using Docker Compose:
|
|
Settings
- Docker v1.12.3
- MySQL v5.7.16
- Redmine v3.3.1
- Docker Compose v1.9.0
[^1]: mysql, Docker Hub