Docker奮闘記 コンテナ同士の連携（redmine-mysql） #3

## 前回までのあらすじ

前回のDocker奮闘記。  
筆者は、Webサーバーであるnginxコンテナを順を追って作成した。  
runのやろう、なんか勝手にやってるな？と蔑ろにしていたが、
実は一人でpull -> create -> start をまとめた超便利なヤツだったのだ。  
感謝しないとならないな。  

しかし、筆者には気がかりがあった。  
コンテナ同士を組み合わせることはできないのか…と。

前回の記事：[Docker奮闘記 Dockerでnginx構築編 \#2 \- Qiita](https://qiita.com/gat3ta/items/47aa48e95d82644dd5e5)
第１回の記事：[Docker奮闘記 Docker RunでHelloWorld＃１ \- Qiita](https://qiita.com/gat3ta/items/3df6bfc05195dcbc7c2a)

## 今回の概要

筆者の仕事上、勉強する必要が出始めたので、redmineを導入する。  
同様の理由で、MySqlも導入する。

ただし、redmineの公式イメージはそのままrunさせると、SQLite3を使うことになる。  
なので、別個でMySQLコンテナを立ち上げて、それを連携させる必要がある。

## どうやって作る！？

では、基本としてDocker HubにあるRedmine公式イメージのサイト [redmine \- Docker Hub][redmine] を参照しよう。

> ## Run Redmine with a Database Container
>  
> Running Redmine with a database server is the recommended way.
>  
> 1. start a database container
>  
> - PostgreSQL
>  
> ``` bash
> $ docker run -d --name some-postgres --network some-network -e POSTGRES_PASSWORD=secret -e POSTGRES_USER=redmine postgres
> ```
>  
> - MySQL (replace -e REDMINE_DB_POSTGRES=some-postgres with -e REDMINE_DB_MYSQL=some-mysql when running Redmine)
>  
> ``` bash
> $ docker run -d --name some-mysql --network some-network -e MYSQL_USER=redmine -e MYSQL_PASSWORD=secret -e MYSQL_DATABASE=redmine -e MYSQL_RANDOM_ROOT_PASSWORD=1 mysql:5.7
> ```
>  
> 2. start redmine
>  
> ``` bash
> $ docker run -d --name some-redmine --network some-network -e REDMINE_DB_POSTGRES=some-postgre
> ```
>  

とされている。

つまり、今回行いたいredmineとmysqlの順序としては

```mermaid
graph LR;
mysql --> redmine
```

の順番で立ち上げてやればよい。  
これは、どちらが前提か？ということで判断してやればよいのだろう。  
redmineはデータベースに依存する。なので、mysqlを先に立ち上げて前提条件を満たしてから、redmineを立ち上げるという寸法だ。

### 最初の結論からいうと、なんかうまく行かんかった！

ということで、経緯は割愛するけれど、やってみたところ、コマンドどおりではうまく立ち上がらなかった。  
というか、コマンドの意味がわかっていない！  
お馬鹿さん！

なので、もうちょっと他のサイトを調べてみた。

[初心者のDocker入門4 \- Redmine \+ MySQL \- Qiita][Qiita]

もうやりたいことをまるまる書かれているので、このサイト見るだけでいいんじゃないかな…って思った！

## 工夫してMySqlからcreateしていこう

コマンドの意味がわかっていないのでは、よろしくない。なので、今回もrunではなく、create > run の手順でやってみよう。
今回は、[Qiita]記事の方に習いつつ、記載されている文字コード関連は一旦、省略。

``` PowerShell
PS E:\workspace> docker create --name some-mysql -e MYSQL_USER=redmine -e MYSQL_PASSWORD=secret -e MYSQL_DATABASE=redmine -e MYSQL_RANDOM_ROOT_PASSWORD=1 mysql:5.7
Unable to find image 'mysql:5.7' locally
5.7: Pulling from library/mysql
27833a3ba0a5: Already exists
864c283b3c4b: Already exists
cea281b2278b: Already exists
8f856c14f5af: Already exists
9c4f38c23b6f: Already exists
1b810e1751b3: Already exists
5479aaef3d30: Already exists
0f1430d39d4f: Pull complete
2bc64c824b3f: Pull complete
b64ec62ca852: Pull complete
42323e351ef3: Pull complete
Digest: sha256:069c2bc62a2b1f84827b96c36870c45be5458f1438c27a41535ba5197aa2e26c
Status: Downloaded newer image for mysql:5.7
c1fb3eaf126496837414e3c54013c6dc0a4acb0688d2268ccf3f0b2c9dfc5e68
PS E:\workspace> docker start c1
c1
```

うっから、pullするのを忘れていたら、pullしてくれました。  
ただ、「Already exists」とか書いてあるからなんかココらへんで下手なこと下な気がするな…。足りなかった？

## redmineをcreate

さて、これも[redmine]記事にも[Qiita]記事にもならいつつ、実行。  
ポイントは、ポートのマッピング。あとは、mysqlとの--linkオプションだ。

``` PowerShell
PS E:\workspace> docker create --name some-redmine -e REDMINE_DB_MYSQL=some-mysql -e REDMINE_DB_USERNAME=redmine -e REDMINE_DB_PASSWORD=secret --link some-mysql:mysql -p 3000:3000 redmine
6eff4cd35ebe2dcddcf33890b15934ee319612b4b729057f6db9c4b9950bf689
PS E:\workspace>
PS E:\workspace>
PS E:\workspace> docker start 6e
6e
```

## 起動確認

localhost:3000にアクセスすることで実行の確認ができた。  
いろいろと実験してみたいが、[Qiita]記事にあるような文字コード問題にもぶち当たるだろう。  
まあ、今回は連結することの確認だったので、それは別の話にすることにする。

[![Image from Gyazo](https://i.gyazo.com/aa7c3107c4bc6bab06343f6e8c330d3f.png)](https://gyazo.com/aa7c3107c4bc6bab06343f6e8c330d3f)

## 本当に連結されているか？

前提として、localhost:3000でアクセスしたredmineでユーザー登録をしたことにする。ここでは、「testuser」というユーザーを登録した。そして、そのユーザーがmysql内に登録されるか確認してみる。

まずは、docker execコマンドでmysqlのコンテナ内部に入る。

```PowerSHell
PS E:\workspace> docker exec -it --user root some-mysql /bin/bash
```

次に、mysqlコンテナ内部でデータベースの状況を確認する。白状すると、ここでmysql内のユーザーやパスワード周りで手間取ったのだけれど、結論のみ記載する。

mysqlコマンドを使用すればよいが、コンテナを作成した時点で作成している「redmine」ユーザーを使用する。また、ホスト名はコンテナ名？になっているようなので、127.0.0.1を指定する。さらに、パスワードもコンテナ作成時点のパスワードを指定する。今回は「secret」としていたので、それを入力する。

```bash
root@c1fb3eaf1264:/# mysql -u redmine -p -h 127.0.0.1
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 25
Server version: 5.7.26 MySQL Community Server (GPL)

Copyright (c) 2000, 2019, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
mysql> show tables from redmine;
+-------------------------------------+
| Tables_in_redmine                   |
+-------------------------------------+
| ar_internal_metadata                |
| attachments                         |
| auth_sources                        |
| boards                              |
| changes                             |
| changeset_parents                   |
| changesets                          |
| changesets_issues                   |
| comments                            |
| custom_field_enumerations           |
| custom_fields                       |
| custom_fields_projects              |
| custom_fields_roles                 |
| custom_fields_trackers              |
| custom_values                       |
| documents                           |
| email_addresses                     |
| enabled_modules                     |
| enumerations                        |
| groups_users                        |
| import_items                        |
| imports                             |
| issue_categories                    |
| issue_relations                     |
| issue_statuses                      |
| issues                              |
| journal_details                     |
| journals                            |
| member_roles                        |
| members                             |
| messages                            |
| news                                |
| open_id_authentication_associations |
| open_id_authentication_nonces       |
| projects                            |
| projects_trackers                   |
| queries                             |
| queries_roles                       |
| repositories                        |
| roles                               |
| roles_managed_roles                 |
| schema_migrations                   |
| settings                            |
| time_entries                        |
| tokens                              |
| trackers                            |
| user_preferences                    |
| users                               |
| versions                            |
| watchers                            |
| wiki_content_versions               |
| wiki_contents                       |
| wiki_pages                          |
| wiki_redirects                      |
| wikis                               |
| workflows                           |
+-------------------------------------+
56 rows in set (0.00 sec)
mysql>
mysql> use redmine
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -A

Database changed
mysql>
mysql> select * from users
    -> ;
+----+----------+------------------------------------------+-----------+------------------+-------+--------+---------------------+----------+----------------+---------------------+---------------------+----------------+--------------+-------------------+----------------------------------+--------------------+---------------------+
| id | login    | hashed_password                          | firstname | lastname         | admin | status | last_login_on       | language | auth_source_id | created_on          | updated_on          | type           | identity_url | mail_notification | salt                             | must_change_passwd | passwd_changed_on   |
+----+----------+------------------------------------------+-----------+------------------+-------+--------+---------------------+----------+----------------+---------------------+---------------------+----------------+--------------+-------------------+----------------------------------+--------------------+---------------------+
|  1 | admin    | b50201775f7da0980ea9988cdbb5b1a84201202e | Redmine   | Admin            |     1 |      1 | 2019-05-10 14:33:05 | ja       |           NULL | 2019-05-06 05:55:51 | 2019-05-10 14:34:10 | User           | NULL         | none              | b58b56e37f84387d70878f3e7b40a74a |                  0 | 2019-05-10 14:33:21 |
|  2 |          |                                          |           | Anonymous users  |     0 |      1 | NULL                |          |           NULL | 2019-05-06 05:55:59 | 2019-05-06 05:55:59 | GroupAnonymous | NULL         |                   | NULL                             |                  0 | NULL                |
|  3 |          |                                          |           | Non member users |     0 |      1 | NULL                |          |           NULL | 2019-05-06 05:55:59 | 2019-05-06 05:55:59 | GroupNonMember | NULL         |                   | NULL                             |                  0 | NULL                |
|  4 |          |                                          |           | Anonymous        |     0 |      0 | NULL                |          |           NULL | 2019-05-06 05:56:07 | 2019-05-06 05:56:07 | AnonymousUser  | NULL         | only_my_events    | NULL                             |                  0 | NULL                |
|  5 | testuser | 9f701acd70b720d13c09aaf91acfe9b2e12af0be | test      | user             |     0 |      1 | NULL                | ja       |           NULL | 2019-05-10 14:36:04 | 2019-05-10 14:36:04 | User           | NULL         | none              | 1cf1fe08fb6d071905a0a1d2e08b9500 |                  0 | 2019-05-10 14:36:04 |
|  6 |          |                                          |           | testgroup        |     0 |      1 | NULL                |          |           NULL | 2019-05-10 14:36:21 | 2019-05-10 14:36:21 | Group          | NULL         |                   | NULL                             |                  0 | NULL                |
+----+----------+------------------------------------------+-----------+------------------+-------+--------+---------------------+----------+----------------+---------------------+---------------------+----------------+--------------+-------------------+----------------------------------+--------------------+---------------------+
6 rows in set (0.00 sec)
```

折返しのせいでわかりにくいが、5番目に「testuser」が追加されていることがわかった。これで無事に連結されていることを確認できた。

## 結論

- redmineコンテナとmysqlコンテナの2つを作ることができた。
- また、redmineコンテナの作成時に--linkオプションを使うことで、redmineにmysqlコンテナを連結させることができた。
- 実際にredmine上でユーザー登録などを行うことで、dockerのmysqlでその情報が反映されていることを確認できた。

## 補足

- なお、上記のコマンドをトレースしたとしても、いろいろと問題がでる。参考文献中の[Qiita]の記事のように日本語が使えなかったりするなど、確認できている。
  - もっとも、これらはdockerで環境を構築していくうえで必要になるし、勉強することになる。
  - なので、今回は割愛する。

## 次回予告

複数のコンテナを組み合わせるなどして、簡易ながらではあるが、dockerで実践的な環境を構築することができた。いろいろと実験したりすることも可能だろう。しかし、dockerにはまだ未知なるコマンドやオプションなどが数多に存在する。

それに、そもそも「コンテナ」はどうやって作られる？　docker「イメージ」はどうやって作られる？

当然それらは開発者が作成可能なはずだ…。それができなければ、dockerのいろはの「い」の字まではいけでも、「ろ」の字までいけない…。

まだまだ知らなければいけないことがたくさんあるようだ。まずは、何から手を付けていいか調べてみよう…。

次回「予定は未定！」

### 参考文献

- [redmine \- Docker Hub][redmine]
- [初心者のDocker入門4 \- Redmine \+ MySQL \- Qiita][Qiita]

[redmine]:https://hub.docker.com/_/redmine
[Qiita]:https://qiita.com/queth/items/96bec024d48db6652223