Docker-ComposeでRedmineを作ってみた

## やろうと思ったきっかけ
新しい案件でKubernetesを使うことになりました。
Dockerもほぼ使ったことがないので、これを機にDocker-Composeを使ってみようと思いました。

## 開発環境
PC：Windows10
仮想基盤：VirtualBox
OS：CentOS7
WEB：Nginx 1.25.2(latest)
コンテナ：Docker 24.0.6
　　　　：Docker-Compose 2.6.1
APP：Redmine 4.0.5
DB：MySQL 5.7

## 注意事項
- VirtualBox周りやOS周りの設定は今回の内容から外れるので省略します。
- イントラ環境等の企業内で検証を行う場合はプロキシ設定も確認すること。
- 検証目的のため、rootユーザでやっています。
- 証明書は自己署名証明書で行なっています。
- Nginxはリバースプロキシを行うために起動します。

## やってみる
### 必要なパッケージを入れる
```
# yum -y install wget net-tools bind-utils yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
# yum -y install docker-ce docker-ce-cli container.io docker-buildx-plugin docker-compose-plugin docker-compose
```

### 証明書を発行
作業ディレクトリを作成
```
# mkdir ~/docker-compose
# cd ~/docker-compose
```

秘密鍵の生成
```
# openssl genrsa -out privkey.key 2048
```

CSRの発行
```
# openssl req -new -key privkey.key -out server.csr
```

証明書の発行
```
# openssl x509 -days 3650 -req -signkey privkey.key < server.csr > fullchain.crt
```

### Dockerを起動
```
# systemctl start docker
# systemctl enable docker
# systemctl status docker
```

### Docker-Composeを入れる
```
# curl -SL https://github.com/docker/compose/releases/download/v2.6.1/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
# chmod +x /usr/local/bin/docker-compose
# docker-compose --version
```

### Docker-Compose YAMLファイルを作成
YAMLファイルを作成
※今回はサービスごとに分けておりませんが、
```
version: "3"
services:
  proxy:
    image: nginx:latest
    ports:
      - "80:80"
      - "443:443"
    container_name: proxy
    volumes:
      - ./ssl.conf:/etc/nginx/conf.d/ssl.conf
      - ./fullchain.crt:/etc/nginx/conf.d/fullchain.crt:ro
      - ./privkey.key:/etc/nginx/conf.d/privkey.key:ro
  redmime:
    container_name: redmine
    image: redmine:4.0.5-passenger
    restart: always
    ports:
      - 8080:3000
    environment:
      TZ: Asia/Tokyo
      REDMINE_DB_MYSQL: mysql
      REDMINE_DB_DATABASE: redmine_mytheme
      REDMINE_DB_USERNAME: redmine_mytheme
      REDMINE_DB_PASSWORD: redmine_mytheme
      REDMINE_DB_ENCODING: utf8mb4
      VIRTUAL_HOST: redmine.example.com
    depends_on:
      - mysql
    volumes:
      - ./src/assets:/usr/src/redmine/public/themes/mytheme
      - ./src/plugins:/usr/src/redmine/plugins
      - ./src/themes:/usr/src/redmine/public/themes
  mysql:
    container_name: mysql
    image: mysql:5.7
    restart: always
    environment:
      TZ: Asia/Tokyo
      MYSQL_ROOT_PASSWORD: <MySQLのルートユーザのパスワード>
      MYSQL_DATABASE: redmine_mytheme
      MYSQL_USER: redmine_mytheme
      MYSQL_PASSWORD: redmine_mytheme
    command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_bin --general-log=true --general-log-file=/var/log/mysql/general.log
    volumes:
      - type: bind
        source: ./volume/data
        target: /dmp_data
```

リバースプロキシ用のNginxファイルを作成
```
server {
    root /dev/null;
    server_name redmine;
    charset UTF-8;
    access_log /var/log/nginx/redmine.local.access.log;
    error_log /var/log/nginx/redmine.local.error.log;

    # Set up SSL only connections:
    listen *:443 ssl;
    ssl_certificate            /etc/nginx/conf.d/fullchain.crt;
    ssl_certificate_key        /etc/nginx/conf.d/privkey.key;

    ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:!aNULL:!EXPORT:!DES:!MD5:!PSK:!RC4';
    ssl_protocols  TLSv1.2;
    ssl_prefer_server_siphers on;
    ssl_session_cache builtin:1000 shared:SSL10m;
    ssl_session_timeout 5m;

    client_max_body_size 0;
    chunked_transfer_encoding on;


    location / {
        proxy_pass http://redmine:3000
        proxy_set_header  Host              $http_host;
        proxy_set_header  X-Real-IP         $remote_addr;
        proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
        proxy_set_header  X-Forwarded-Proto $scheme;
        proxy_set_header  X-Forwarded-Host  $host;
        proxy_read_timeout                  900;
        proxy_redirect default;
    }

}

server {
    listen 80;
    server_name  redmine;
    server_tokens off
    return 301 https://$http_host:$request_uri;
}
```

### Docker-Composeを起動
```
# docker-compose up -d
```

### コンテナ起動確認
```
# docker ps -a
```

### ホストファイル設定
```
# vi /etc/hosts

※以下を追加する
<仮想マシンのIPアドレス>　　<バーチャルホスト名>
```

### ブラウザ確認
```
https://<バーチャルホスト名>
```


## 番外編
### docker-compose.yamlを変更した場合の反映コマンド
```
# docker-compose up -d --build
# docker-compose up -d
```

### 検証終わって掃除する場合のコマンド
コンテナを一掃する
```
# docker-compose down --rmi all --volumes --remove-orphans

#もしくはこちら
# docker rm -f `docker ps -a -q`
```

### プロキシ環境で行う場合
systemdユニットファイルを追加
```
# mkdir -p /etc/systemd/system/docker.service.d
# touch /etc/systemd/system/docker.service.d/override.conf
# vi /etc/systemd/system/docker.service.d/override.conf

※こちらを追加
[Service]
Environment=HTTP_PROXY=<プロキシサーバのURLもしくはIPアドレス>:<ポート番号>
Environment=HTTPS_PROXY=<プロキシサーバのURLもしくはIPアドレス>:<ポート番号>

# systemctl daemon-reload
# systemctl restart docker

※念の為通信状態を確認し、できなければプロファイル上にプロキシ設定を確認などを行うこと
# docker run hello-world
```

## 参考
・[Install Docker Engine](https://docs.docker.com/engine/install/)