アラサーからのプログラマー生活

アラサーの新米PGが必死に頑張る成長記録です。あとは旅行とか。

「マンガでわかるDocker」を読んでWindowsでRedmineの環境構築をしました


※当記事は個人の趣味・勉強用として執筆した記事であり、著者の湊川あい先生とは一切関係はありません。

お久しぶりです、堀井です。

現在会社ではAWS関係の業務を行っているのですが、Dockerが分からない状態は業務ができないことを痛感しました。

そんな時、湊川あい先生(Twitter)の著書である「マンガでわかるDocker」シリーズを見つけ勉強したところ、Redmineをローカルで動かすところまではできました。

ただ、この本はMacベースで書かれておりWindowsユーザーの自分はそこそこ苦労したため、他のWindowsユーザーが勉強される場合のお助け記事になればと思って書いています。

Twitter
#マンガでわかるDocker ① 〜概念・基本コマンド編〜
#マンガでわかるDocker ② 〜開発環境を作ろう編〜
#マンガでわかるDocker ③ 〜AWS編〜
#マンガでわかるDocker ④ 〜Compose編〜
マンガでわかるDocker サポートサイト

※今回はローカルでの実装のため、AWS編の内容は扱いません。



当記事の読むのにお勧めの読者

Dockerを初めて学ぶ人

上記わかばちゃんシリーズの読者対象と同じです。

コマンドラインが少しわかる人

ディレクトリ移動ができるくらいの知識があれば大丈夫です。


筆者の動作環境

  • Windows10 Home 64bit
  • Docker Desktop on Windows 4.8.1 (78998)


最終的なdocker-compose.yml

解説不要な方はこちらをそのまま利用してください。

version: "3.1"

services:
  redmine:
    image: redmine
    container_name: redmine
    depends_on:
      - db
    restart: always
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: example
      REDMINE_SECRET_KEY_BASE: supersecretkey
    volumes:
      - ./files:/usr/src/redmine/files

  db:
    image: mysql
    container_name: redmine_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    volumes:
      - ./db-data:/var/lib/mysql


Docker Desktop on Windowsのインストール

Docker Desktop on Windows
「Also available for Windows and Linux」をクリックすることでインストールが始まります。
dockerとdocker composeコマンドが一気にインストールされ、GUI上でコンテナやボリュームの様子を見ることができるようになります。

下記のようにバージョンが表示されればインストール成功です。
dockerコマンドの実行はコマンドプロンプトやPowerShellを利用してください。

PS C:\Users> docker version
Client:
 Cloud integration: v1.0.24
 Version:           20.10.14
 API version:       1.41
 Go version:        go1.16.15
 Git commit:        a224086
 Built:             Thu Mar 24 01:53:11 2022
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Desktop 4.8.1 (78998)
 Engine:
  Version:          20.10.14
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.16.15
  Git commit:       87a90dc
  Built:            Thu Mar 24 01:46:14 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.5.11
  GitCommit:        3df54a852345ae127d1fa3092b95168e4a88e2f8
 runc:
  Version:          1.0.3
  GitCommit:        v1.0.3-0-gf46b6ba
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
PS C:\Users> 
PS C:\Users> 
PS C:\Users> docker-compose version
Docker Compose version v2.5.0
PS C:\Users>


ローカル開発環境構築とDockerfile

特に問題ない部分

docker container ls -a
docker run hello-world
docker pull alpine
docker run -it alpine bin/sh

などの基本的な各種dockerコマンドは特に問題なく動作します。
具体的には1巻全てと2巻27ページまでです。


$(pwd)でエラーが出る

2巻28ページでDockerコンテナとローカルディレクトリのマウントを設定をしたコマンドを入力するのですが、Windowsユーザーはここでエラーが起きます。

C:\Users>docker run -d -p 80:80 --name myapp -v $(pwd):/var/www/html php:7.0-apache
docker: Error response from daemon: create $(pwd): "$(pwd)" includes invalid characters for a local volume name, only "[a-zA-Z0-9][a-zA-Z0-9_.-]" are allowed. If you intended to pass a host directory, use absolute path.
See 'docker run --help'.

ローカルディレクトリの名前に$だとか()が使えないよ!と言う内容です。
コマンドラインではpwdが使えないので絶対パスか相対パスで指定してあげる必要があります。

C:\Users>docker run -d -p 80:80 --name myapp -v ./testfolder:/var/www/html php:7.0-apache
Unable to find image 'php:7.0-apache' locally
7.0-apache: Pulling from library/php
177e7ef0df69: Already exists
9bf89f2eda24: Already exists
350207dcf1b7: Already exists
a8a33d96b4e7: Already exists
c0421d5b63d6: Already exists
f76e300fbe72: Already exists
af9ff1b9ce5b: Already exists
d9f072d61771: Already exists
37a07e292198: Already exists
8ba923990f24: Already exists
98af8902979a: Already exists
f1548c2cd376: Already exists
e1062fd0605a: Already exists
Digest: sha256:1d34b2e491a02ba7a8d26478132015e197a5ffea37f0a93b42621d11cfe042cc
Status: Downloaded newer image for php:7.0-apache
0147c5a145dd9cab0a6ec346ee7226a4d2562d5f8607aa41ad23f90f6cd0cb09

C:\Users>

$(pwd) → ./testfolder に書き換えました。
自分は既にWordpress用にバージョン違いのphpイメージが存在していたのでAlready existsが表示されましたが、
特に何もイメージがなければ

fdd5d7827f33: Pull complete

のように出力されます。

2巻35ページでもpwdコマンドを使っていますが、Windowsの場合

cd

と打つと同様に現在のディレクトリを表示することができます。


touchでエラーが出る

2巻29ページ、35ページでtouchコマンドが出てきますが、ここでもエラーが起きます。
touchコマンドとはファイルがなければ作成し、あればタイムスタンプを更新するコマンドですが、Windowsにはtouchコマンドは存在しません。
ただここではタイプスタンプに関係なくsample.phpファイルが作成されればいいだけなので、テキストエディタでhtmlを入力 → 名前を付けて保存 などで作成してください。


Docker ComposeでRedmineの環境構築をする

docker-compose.ymlの書き方

Redmineの公式イメージにアクセスすると、ページ下部にHow to use this imageがあり、docker-compose.ymlの記入例が載っています。

基本的にはこれを流用するのですが、いざ「docker compose up -d」で起動するとあれこれ不足している記述が見つかります。


エラーメッセージ:error during connect

error during connect: This error may indicate that the docker daemon is not running.: Get "http://%2F%2F.%2Fpipe%2Fdocker_engine/v1.24/containers/json?all=1&filters=%7B%22label%22%3A%7B%22com.docker.compose.project%3Dwordpress%22%3Atrue%7D%7D&limit=0": open //./pipe/docker_engine: The system cannot find the file specified.
test

これはDocker Engineが起動していないため、Docker Desktopを起動するだけで解決します。


エラーメッセージ:デフォルト設定がロードできませんでした


ログインができたので管理画面からデフォルト設定をロードしようとすると・・・。

デフォルト設定がロードできませんでした: Mysql2::Error: Incorrect string value: '\xE7\xAE\xA1\xE7\x90\x86...' for column 'name' at row 1

というエラーが表示されます。
エラー解決にはこちらのサイト(Qiita)を参考にして、docker-compose.ymlを修正しました。
ただ「command: mysqld –character-set-server=utf8 –collation-server=utf8_unicode_ci」だとエラーが出たままだったため、ハイフンの数を下記の通りにしています。

  db:
    image: mysql
    container_name: redmine_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
      # ↓↓この行を追加↓↓
      command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
      # ↑↑この行を追加↑↑

container_nameは公式例にない記述です。お好みに合わせて設定してください。


エラーメッセージ:services.command must be a mapping

次はこちらのサイト(Qiita)を参考にしたところ、commandのインデント設定が誤っていましたので下記の通り修正しました。

  db:
    image: mysql
    container_name: redmine_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
    # ↓↓この行のインデントを修正↓↓
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    # ↑↑この行のインデントを修正↑↑


コンテナを削除したら設定が全て消える

デフォルト設定をロードできたので意気揚々とプロジェクトの作成やチケットの作成を行い満足したので、docker compose downでコンテナを終了・削除しました。
後日再びdocker compose up -dでコンテナを起動したところ、プロジェクトもチケットも全て削除されていました。
dockerコンテナそのものを削除しない(docker stop)なら再起動しても残っているのですが、コンテナごと削除してしまうと復帰できなくなります。
どうすればいいかと言うと、Redmineの設定をボリュームマウントでローカルに保存してあげる必要があります。
ということで、docker-compose.ymlを更に下記の通り書き換えます。

  db:
    image: mysql
    container_name: redmine_db
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: example
      MYSQL_DATABASE: redmine
    command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
    # ↓↓この行を追加↓↓
    volumes:
      - ./db-data:/var/lib/mysql
    # ↑↑この行を追加↑↑

DBデータは/var/lib/mysqlに格納されているため、ローカルに保存して再利用できるようにします。


画像ファイルが全て消えてしまう

チケットやプロジェクトはコンテナを削除しても残るのですが、なぜか画像は削除されてしまいます。
調べて分かったのですが、画像はDBでなくRedmine側に保存されることが分かりましたので、docker-compose.ymlを下記の通り修正します。

  redmine:
    image: redmine
    container_name: redmine
    depends_on:
      - db
    restart: always
    ports:
      - 8080:3000
    environment:
      REDMINE_DB_MYSQL: db
      REDMINE_DB_PASSWORD: example
      REDMINE_SECRET_KEY_BASE: supersecretkey
    # ↓↓この行を追加↓↓
    volumes:
      - ./files:/usr/src/redmine/files
    # ↑↑この行を追加↑↑

container_nameとdepends_onは公式例にない記述です。お好みに合わせて設定してください。
実際にRedmineのディレクトリ構成が気になる方は

docker exec -it redmine bash

でログインして確認してみてください。

C:\Users>docker exec -it redmine bash
root@f7c7d735f231:/usr/src/redmine# ls -l
total 192
-rw-rw-r--  1 redmine redmine   538 Mar 28 19:51 CONTRIBUTING.md
-rw-rw-r--  1 redmine redmine  3663 Apr 21 11:26 Gemfile
-rw-rw-rw-  1 redmine redmine  7696 Apr 21 11:26 Gemfile.lock
-rw-rw-r--  1 redmine redmine   205 Mar 28 19:51 README.rdoc
-rwxrwxr-x  1 redmine redmine   275 Mar 28 19:51 Rakefile
drwxrwxr-x  7 redmine redmine  4096 Mar 28 19:51 app
-rw-rw-r--  1 redmine redmine   863 Mar 28 19:51 appveyor.yml
drwxrwxr-x  2 redmine redmine  4096 Mar 28 19:51 bin
drwxr-xr-x  1 redmine redmine  4096 May 17 11:15 config
-rw-rw-r--  1 redmine redmine   154 Mar 28 19:51 config.ru
drwxrwxrwx  1 redmine redmine  4096 May 17 11:15 db
drwxrwxr-x  2 redmine redmine  4096 Mar 28 19:51 doc
drwxrwxr-x  5 redmine redmine  4096 Mar 28 19:51 extra
drwxr-xr-x  2 redmine redmine  4096 Apr 21 11:26 files
drwxrwxr-x  6 redmine redmine  4096 Mar 28 19:51 lib
drwxr-xr-x  1 redmine redmine  4096 Apr 21 11:26 log
-rw-rw-r--  1 redmine redmine    80 Mar 28 19:51 package.json
drwxrwxr-x  2 redmine redmine  4096 Mar 28 19:51 plugins
drwxrwxr-x  1 redmine redmine  4096 Mar 28 19:51 public
drwxrwxrwx  2 redmine redmine  4096 Apr 21 11:26 sqlite
drwxrwxr-x 14 redmine redmine  4096 Mar 28 19:51 test
drwxr-xr-x  1 redmine redmine  4096 Apr 21 11:26 tmp
drwxrwxr-x  2 redmine redmine  4096 Mar 28 19:51 vendor
-rw-rw-r--  1 redmine redmine 85856 Mar 28 19:51 yarn.lock
root@f7c7d735f231:/usr/src/redmine# cd files
root@f7c7d735f231:/usr/src/redmine/files# ls -l
total 0
<<<<ここでRedmineに画像アップ>>>>
root@f7c7d735f231:/usr/src/redmine/files# ls -l
total 4
drwxr-xr-x 3 redmine redmine 4096 May 17 11:17 2022
root@f7c7d735f231:/usr/src/redmine/files# ls
2022
root@f7c7d735f231:/usr/src/redmine/files# exit
exit

C:\Users>



以上のエラーを何とか潰していった結果、ちゃんとローカルにアップしたデータが保存されるようになりました。

最終的には記事トップのdocker-compose.ymlとなりますので、今後Windowsで環境構築をしようと考えている方は是非参考にしてみてください。

今後の目標としてはこのRedmine環境をAWSにアップして外部からアクセスできるようになればとは思っていますが、まだまだ難易度が高いですね。

それではまた次回。