Redmine4.2と,依存関係でDBが必要なので,mariaDB(10.11.2)(MySQL系)2つのdockerコンテナを作成します。Redmineコンテナ起動後にwebhookというpluginをインストール,更にDBをRDS(mySQL)に変更後,作成したコンテナからイメージを作成し,ECRに登録します。そのイメージからECSサービスをデプロイします。今回は,ECRに登録するイメージを作成するまでの手順です。
1. 利用するAWSのリソースと作成するシステム構成図
2. Docker環境構築
EC2(図AのDockerコンテナ)にdocker,docker-composeをインストールして,dockerが動作する環境を構築します。
#Dockerのインストール
sudo yum install -y docker
sudo systemctl start docker
sudo usermod -a -G docker ec2-user
#自動起動を有効にする
sudo systemctl enable docker
#docker-composeのインストール
sudo curl -L https://github.com/docker/compose/releases/download/1.28.5/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose ←一行です
sudo chmod +x /usr/local/bin/docker-compose
#Docker Composeが使用できるか確認
/usr/local/bin/docker-compose --version
docker-compose version 1.28.5, build c4eb3a1f
コマンド docker ps とすると以下のメッセージ出力
#Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/containe
rs/json": dial unix /var/run/docker.sock: connect: permission denied
###対策 dockerグループにec2-userを追加
sudo usermod -g docker ec2-user
3. docker-compose.ymlファイルを作成して、docker コンテナを作成
作成するコンテナの設計図ですね。今回は,redmineとそのDBのコンテナを作成して,webhookというPluginを入れ、更にDBをRDS(Mysql)に変更します。
version: '3.8'
services:
redmine:
image: redmine:4.2
container_name: redmine
ports:
- 80:3000
environment:
REDMINE_DB_MYSQL: redmine-db
REDMINE_DB_PASSWORD: xxxxxx
depends_on:
- redmine-db
restart: always
redmine-db:
image: mariadb
container_name: redmine-db
ports:
- 3306:3306
environment:
MYSQL_ROOT_PASSWORD: xxxxxx
MYSQL_DATABASE: redmine
volumes:
- ./data/db:/var/lib/mysql
command: mysqld --character-set-server=utf8 --collation-server=utf8_unicode_ci
restart: always
4. Docker コンテナの作成と起動
docker-compose.ymlファイルのあるディレクトリで以下のコマンドを実行します。完了したら,docker ps -a コマンドで動作しているかどうか確認します。
sudo su
cd /usr/local/src/redmine
/usr/local/bin/docker-compose up -d
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
9e7f0be2bc5b redmine:4.2 "/docker-entrypoint.…" 7 seconds ago Up 5 seconds 0.0.0.0:80->3000/tcp, :::80->3000/tcp redmine
3cd27d886b4f mariadb "docker-entrypoint.s…" 8 seconds ago Up 6 seconds 0.0.0.0:3306->3306/tcp, :::3306->3306/tcp redmine-db
docker コンテナが作成されて起動されているのがわかります。Webでアクセスして確認しましょう。アドレスは、EC2のグローバルアドレスです。http://xx.xx.xx.xx/ログイン出来ればOKです。
5. webhook pluginをコンテナにインストール
作成したコンテナ(図AのDockerコンテナ)にwebhookというpluginをインストールします。
#Docker コンテナの中に入ります
docker container exec -it redmine bash
# pluginsディレクトリに移ります
root@f3baf480c406:/usr/src/redmine# cd plugins/
root@f3baf480c406:/usr/src/redmine/plugins# git clone https://github.com/suer/redmine_webhook.git ← 一行
root@f3baf480c406:/usr/src/redmine/plugins# cd redmine_webhook
root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# bundle install
rake redmine:plugins:migrate RAILS_ENV=production
#docker コンテナから抜けます
root@f3baf480c406:/usr/src/redmine/plugins/redmine_webhook# exit
redmine コンテナを再起動します。
docker stop redmine
docker start redmine
ブラウザでアクセスして、管理タブをクリックプラグインが表示されればOKです。
6. RDSと接続
privateサブネットに作成したRDS(Mysql)に接続させるように変更していきます。
#database接続定義(database.yml)の作成
production:
adapter: "mysql2"
host: "databasexxx.xxxxxx.ap-northeast-1.rds.amazonaws.com"
port: "3306"
username: "Admin"
password: "xxxxxx"
database: "redmine_db"
database.ymlをdockerコンテナ内にコピー
sudo docker cp database.yml redmine:/usr/src/redmine/config/
#redmine migrate実行
#docker コンテナ内部に入ります
docker container exec -it redmine bash
/usr/src/redmin/# bundle exec rake generate_secret_token
/usr/src/redmine# bundle exec rake db:migrate RAILS_ENV=production
これで,ECSサービスとして起動可能なredmineコンテナが作成できました。 このコンテナを利用してECRに登録するimageを作成します。
7. ECR登録用のイメージ作成
作成したDockerコンテナからECRに登録するイメージを作成します。
#コンテナからイメージの作成
$ docker commit redmine redminesql
#イメージの確認
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redminesql latest 304ab9ccde49 8 seconds ago 554MB
fortune-whale latest 0df1bdab20e2 2 days ago 280MB
redmine 4.2 d4ea63462562 2 days ago 531MB
mariadb latest 4a632f970181 2 weeks ago 401MB
docker/whalesay latest 6b362a9f73eb 7 years ago 247MB
これで登録するdockerのイメージが作成できました。次回は、ECRにログインしてimageの登録,ECSのデプロイ,ECSタスクの実行する手順です。