※この記事の初版は2022年5月でした。
※当記事は個人の趣味・勉強用として執筆した記事であり、著者の湊川あい先生とは一切関係はありません。
お久しぶりです、堀井です。
現在会社では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> docker-compose version Docker Compose version v2.5.0
ローカル開発環境構築と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
$(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を下記の通り修正します。
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 # ↑↑この行を追加↑↑
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
以上のエラーを何とか潰していった結果、ちゃんとローカルにアップしたデータが保存されるようになりました。
最終的には記事トップのdocker-compose.ymlとなりますので、今後Windowsで環境構築をしようと考えている方は是非参考にしてみてください。