Docker: プロジェクト管理ツールのRedmineをインストールする

DockerでRedmineを動かす手順を記載します。

1 データの永続性がないRedmineを動かす

  • アップロードしたファイルはredmineのファイルシステムに保存されます。
  • データベースはredmineコンテナのSQLiteが使われます。
  • コンテナを削除するとredmineのデータは削除されます。

以下のコマンドでRedmineのコンテナを動かします。Redmineのコンテナは3000/tcpにHTTPサーバを公開します。そこでコンテナの3000/tcpをホストマシンの80/tcpにマッピングします。

$ docker run -d --name redmine -p 80:3000 redmine:latest

Dockerが動いてるマシンの80/tcpにアクセスします。

http://<ipaddr>

0001_Redmine.png

2 データを永続化させる

  • コンテナの/usr/src/redmine/files等のアップロードされるデータをホストマシンのディレクトリにマッピングします。
  • データベースを別コンテナのものを使用します。別コンテナではデータベースの格納先をホストマシンにマッピングします。
  • MySQLかPostgreSQLを使った場合、Redmineのコンテナはデータベースの初期化を待ちません。Redmineのコンテナにrestart: alwaysを使っても、タイミングによっては再起動されなくなります。Redmineのコンテナでデータベースのクライアントのmysqladminコマンドやpsqlコマンドがインストールされておらず、healthcheckも利用できません。RedmineのDockerfileでmysqladminコマンドとpsqlコマンドをインストールし、docker-entrypoint.shでデータベースにアクセスできるようになったかを見るべきです。

以下のコマンドでdocker-composeをインストールします。

$ URL=https://github.com/docker/compose/releases/download/1.17.0/
$ curl -L ${URL}/"docker-compose-$(uname -s)-$(uname -m)" -o docker-compose
$ sudo cp docker-compose /usr/local/bin/docker-compose
$ sudo chmod a+x /usr/local/bin/docker-compose
$ rm -f docker-compose

2.1 SQLiteの場合

アップロードされるデータととデータベースを保存するディレクトリを作成します。

$ sudo mkdir -p /var/lib/some-redmine/sqlite
$ sudo mkdir -p /var/lib/some-redmine/files
$ sudo mkdir -p /var/lib/some-redmine/plugins
$ sudo mkdir -p /var/lib/some-redmine/vendor/plugins
$ sudo mkdir -p /var/lib/some-redmine/public/themes

以下のコマンドでRedmineを動かします。

$ mkdir redmine-sqlite
$ cd redmine-sqlite
$ cat <<EOF > redmine-sqlite.yml
version: '3.0'
services:
  some-redmine:
    image:
      redmine:latest
    restart:
      always
    ports:
      - 80:3000
    volumes:
      - /var/lib/some-redmine/sqlite:/usr/src/redmine/sqlite
      - /var/lib/some-redmine/files:/usr/src/redmine/files
      - /var/lib/some-redmine/plugins:/usr/src/redmine/plugins
      - /var/lib/some-redmine/vendor/plugins:/usr/src/redmine/vendor/plugins
      - /var/lib/some-redmine/public/themes:/usr/src/redmine/public/themes
EOF
$ docker-compose -f redmine-sqlite.yml up

2.2 PostgreSQLの場合

データベースのクライアントをインストールします。Ubuntu 16.04の場合は以下の通りです。

$ sudo apt install -y postgresql-client-9.5

アップロードされるデータととデータベースを保存するディレクトリを作成します。

$ sudo mkdir -p /var/lib/some-redmine/sqlite
$ sudo mkdir -p /var/lib/some-redmine/files
$ sudo mkdir -p /var/lib/some-redmine/plugins
$ sudo mkdir -p /var/lib/some-redmine/vendor/plugins
$ sudo mkdir -p /var/lib/some-redmine/public/themes

データベースを初期化します。初期化するまでsleepを繰り返します。

$ docker run -d --name some-postgres \
       -e POSTGRES_DB=redmine \
       -e POSTGRES_USER=redmine \
       -e POSTGRES_PASSWORD=redmine \
       -p 5432:5432 \
       -v /var/lib/some-postgres:/var/lib/postgresql/data \
       postgres:latest
$ echo '127.0.0.1:5432:redmine:redmine:redmine' > ~/.pgpass
$ chmod 600 ~/.pgpass
$ while : ; do
  psql -h 127.0.0.1 -U redmine -c '\q' > /dev/null 2>&1 && break
  sleep 1
done
$ rm -f ~/.pgpass
$ docker rm -f some-postgres

以下のコマンドでRedmineを動かします。

$ mkdir redmine-postgres
$ cd redmine-postgres
$ cat <<EOF > redmine-postgres.yml
version: '3.0'
services:
  some-redmine:
    image:
      redmine:latest
    restart:
      always
    ports:
      - 80:3000
    environment:
      REDMINE_DB_POSTGRES: some-postgres
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine
    volumes:
      - /var/lib/some-redmine/files:/usr/src/redmine/files
      - /var/lib/some-redmine/plugins:/usr/src/redmine/plugins
      - /var/lib/some-redmine/vendor/plugins:/usr/src/redmine/vendor/plugins
      - /var/lib/some-redmine/public/themes:/usr/src/redmine/public/themes
    depends_on:
      - some-postgres
  some-postgres:
    image:
      postgres:latest
    environment:
      POSTGRES_DB: redmine
      POSTGRES_USER: redmine
      POSTGRES_PASSWORD: redmine
    volumes:
      - /var/lib/some-postgres:/var/lib/postgresql/data
EOF
$ docker-compose -f redmine-postgres.yml up

2.3 MySQLの場合

データベースのクライアントをインストールします。Ubuntu 16.04の場合は以下の通りです。

$ sudo apt install -y mariadb-client-10.0

アップロードされるデータととデータベースを保存するディレクトリを作成します。

$ sudo mkdir -p /var/lib/some-mysql
$ sudo mkdir -p /var/lib/some-redmine/files
$ sudo mkdir -p /var/lib/some-redmine/plugins
$ sudo mkdir -p /var/lib/some-redmine/vendor/plugins
$ sudo mkdir -p /var/lib/some-redmine/public/themes

データベースを初期化します。初期化するまでsleepを繰り返します。

$ docker run -d --name some-mysql \
       -e MYSQL_RANDOM_ROOT_PASSWORD='yes' \
       -e MYSQL_ROOT_PASSWORD=mysql \
       -e MYSQL_DATABASE=redmine \
       -e MYSQL_USER=redmine \
       -e MYSQL_PASSWORD=redmine \
       -p 3306:3306 \
       -v /var/lib/some-mysql:/var/lib/mysql \
       mariadb:latest
$ while : ; do
  mysqladmin ping -h127.0.0.1 -uredmine -predmine && break
  sleep 1
done
$ docker rm -f some-mysql

以下のコマンドでRedmineを動かします。

$ mkdir redmine-mysql
$ cd redmine-mysql
$ cat <<EOF > redmine-mysql.yml
version: '3.0'
services:
  some-redmine:
    image:
      redmine:latest
    restart:
      always
    ports:
      - 80:3000
    environment:
      REDMINE_DB_MYSQL: some-mysql
      REDMINE_DB_DATABASE: redmine
      REDMINE_DB_USERNAME: redmine
      REDMINE_DB_PASSWORD: redmine
    volumes:
      - /var/lib/some-redmine/files:/usr/src/redmine/files
      - /var/lib/some-redmine/plugins:/usr/src/redmine/plugins
      - /var/lib/some-redmine/vendor/plugins:/usr/src/redmine/vendor/plugins
      - /var/lib/some-redmine/public/themes:/usr/src/redmine/public/themes
    depends_on:
      - some-mysql
  some-mysql:
    image:
      mariadb:latest
    environment:
      MYSQL_RANDOM_ROOT_PASSWORD: 'yes'
      MYSQL_ROOT_PASSWORD: mysql
      MYSQL_DATABASE: redmine
      MYSQL_USER: redmine
      MYSQL_PASSWORD: redmine
    volumes:
      - /var/lib/some-mysql:/var/lib/mysql
EOF
$ docker-compose -f redmine-mysql.yml up

3 NFSサーバとデータベースサーバと連携する

  • /usr/src/redmine/files等をNFSサーバのディレクトリにマッピングします。
  • データーベースとして別マシンのIPアドレス、ポートなどを指定します。

3.1 NFSサーバ

NFSサーバのマシンでNFSサーバをインストールします。Ubuntu 16.04の場合は以下の通りです。

$ sudo apt install -y nfs-kernel-server

Redmineが使用するディレクトリを作成します。

$ sudo mkdir -p /var/lib/some-redmine
$ sudo mkdir -p /var/lib/some-redmine/files
$ sudo mkdir -p /var/lib/some-redmine/plugins
$ sudo mkdir -p /var/lib/some-redmine/vendor/plugins
$ sudo mkdir -p /var/lib/some-redmine/public/themes

ディレクトリをNFSで公開します。

$ cat <<EOF | sudo tee -a /etc/exports
/var/lib/some-redmine 192.168.11.0/24(rw,sync,no_root_squash,no_subtree_check)
EOF
$ sudo exportfs -ra

3.2 データベースサーバ

データベースが使用するディレクトリを作成します。

$ sudo mkdir -p /var/lib/some-mysql

ここではDockerでデータベースを動かします。データベースの初期化の時間を十分取ってください(10秒程度)。

$ docker run -d --name some-mysql \
       -e MYSQL_RANDOM_ROOT_PASSWORD='yes' \
       -e MYSQL_ROOT_PASSWORD=mysql \
       -e MYSQL_DATABASE=redmine \
       -e MYSQL_USER=redmine \
       -e MYSQL_PASSWORD=redmine \
       -p 3306:3306 \
       -v /var/lib/some-mysql:/var/lib/mysql \
       mariadb:latest

3.3 Redmine

NFSクライアントをインストールします。Ubuntu 16.04の場合は以下の通りです。

$ sudo apt install -y nfs-common

NFSを使ったボリュームを作成します。REDMINE_NFS_IPADDRにはNFSサーバのIPアドレスを設定してください。

$ docker volume create --driver local \
       --opt type=nfs \
       --opt o=addr="${REDMINE_NFS_IPADDR},rw" \
       --opt device=:/var/lib/some-redmine/files \
       some-redmine-files
$ docker volume create --driver local \
       --opt type=nfs \
       --opt o=addr="${REDMINE_NFS_IPADDR},rw" \
       --opt device=:/var/lib/some-redmine/plugins \
       some-redmine-plugins
$ docker volume create --driver local \
       --opt type=nfs \
       --opt o=addr="${REDMINE_NFS_IPADDR},rw" \
       --opt device=:/var/lib/some-redmine/vendor/plugins \
       some-redmine-vendor-puglins
$ docker volume create --driver local \
       --opt type=nfs \
       --opt o=addr="${REDMINE_NFS_IPADDR},rw" \
       --opt device=:/var/lib/some-redmine/public/themes \
       some-redmine-public-themes

Redmineを動かします。REDMINE_MYSQL_IPADDRにはデータベースのIPアドレスを設定してください。

$ docker run -d --name some-redmine \
       -e REDMINE_DB_MYSQL="${REDMINE_MYSQL_IPADDR}" \
       -e REDMINE_DB_PORT=3306 \
       -e REDMINE_DB_DATABASE=redmine \
       -e REDMINE_DB_USERNAME=redmine \
       -e REDMINE_DB_PASSWORD=redmine \
       -v some-redmine-files:/usr/src/redmine/files \
       -v some-redmine-puglins:/usr/src/redmine/plugins \
       -v some-redmine-vendor-puglins:/usr/src/redmine/vendor/plugins \
       -v some-redmine-public-themes:/usr/src/redmine/public/themes \
       -p 80:3000 \
       redmine:latest