Translate

2017年6月12日月曜日

PROXY環境下でRedmine/Jenkins/RocketChatをdocker-composeで管理する

表題の環境を作ったので、ブログにも残しておきます。

docker/docker-composeが使用可能なアカウントが読み書きできる適当なディレクトリで、以下のような docker-compose.yml ファイルを作成します。

version: '2'

services:

  jenkins:
    image: jenkins:latest
    restart: unless-stopped
    volumes:
      - ./data/jenkins:/var/jenkins_home
    ports:
      - 3002:8080
      - 50000:50000
    environment:
      - TZ=Asia/Tokyo
      - HTTP_PROXY=http://your.proxy.server:8080
      - HTTPS_PROXY=http://your.proxy.server:8080

  redmine:
    image: redmine:latest
    restart: unless-stopped
    volumes:
      - ./data/redmine:/usr/src/redmine/files
    ports:
      - 3001:3000
    environment:
      - REDMINE_DB_MYSQL=mariadb
      - REDMINE_DB_PASSWORD=admin123
      - TZ=Asia/Tokyo
      - HTTP_PROXY=http://your.proxy.server:8080
      - HTTPS_PROXY=http://your.proxy.server:8080
    depends_on:
      - mariadb

  mariadb:
    image: mariadb:latest
    restart: unless-stopped
    volumes:
      - ./data/mariadb/conf:/etc/mysql/conf.d
      - ./data/mariadb/data:/var/lib/mysql
    environment:
      - MYSQL_ROOT_PASSWORD=admin123
      - MYSQL_DATABASE=redmine
      - TZ=Asia/Tokyo

  rocketchat:
    image: rocketchat/rocket.chat:latest
    restart: unless-stopped
    volumes:
      - ./data/rocketchat:/app/uploads
    ports:
      - 3000:3000
    environment:
      - PORT=3000
      - ROOT_URL=http://your.host.fqdn:3000
      - MONGO_URL=mongodb://mongo:27017/rocketchat
      - MONGO_OPLOG_URL=mongodb://mongo:27017/local
      - MAIL_URL=smtp://127.0.0.11
      - TZ=Asia/Tokyo
    depends_on:
      - mongo
    labels:
      - "traefik.backend=rocketchat"
      - "traefik.frontend.rule=Host: your.domain"

  mongo:
    image: mongo:3.2
    restart: unless-stopped
    volumes:
     - ./data/mongo/db:/data/db
     - ./data/mongo/dump:/dump
    command: mongod --smallfiles --oplogSize 128 --replSet rs0
    labels:
      - "traefik.enable=false"

  mongo-init-replica:
    image: mongo:3.2
    command: 'mongo mongo/rocketchat --eval "rs.initiate({ _id: ''rs0'', members: [ { _id: 0, host: ''localhost:27017'' } ]})"'
    depends_on:
      - mongo

ポートは3000~3002へ変更していますが、このあたりは各自で適当に振り替えてください。

RocketChatの http://your.host.fqdn:3000 はホスト側のFQDNに変更してください。
また your.proxy.server:8080 も環境に合わせて変更してください。

imageのタグ"latest"はそれぞれバージョンを指定してあげたほうが良いと思います。
なお Jenkins は自分でバージョンを上げる機能があるので、latestでも良いかもしれません(新バージョンが出てくるとトップにメッセージが出て、リンクを踏むと更新できるようになっている)。

起動するにはまず docker-compose.ymlが存在するディレクトリ上に data ディレクトリを作成します。
CentOSでSELINUX=enforcingしている場合は

chcon -Rt svirt_sandbox_file_t ./data

を実行しておいてください。
またfirewalldenableにしたまま運用する場合、firewall-cmdでポートを使えるように設定しておいてください。

firewall-cmd --zone=public --add-port=3000/tcp --permanent
firewall-cmd --zone=public --add-port=3001/tcp --permanent
firewall-cmd --zone=public --add-port=3002/tcp --permanent
firewall-cmd --reload



最初に起動する場合だけ

docker-compose up -d

でうごかします。 up は、イメージのダウンロードから起動までおこないます。
ただし Jenkins は、初回の起動時のみログ上に初回パスワードが表示されます。
なので

docker-compose logs jenkins

を実行してパスワードを確認してください。
最後のjenkins部分をdocker-compose.yml上のほかのコンテナ名(redmine, mariadb, rocketchat, mongo)にすることで、それぞれのログを参照できます。


コンテナの状態確認は

doker-compose ps

です。動作中かどうか確認できます。
mongo-init-replicaはレプリカなのでExitしているのが正常です。

全部一気に起動・停止させる場合は

docker-compose start
docker-compose stop

でおこないます。今回はrestart指定をunless-stoppedにしているので、上記のstopをかけずにOSのrebootを行うと、自動でコンテナも再起動します。


個別コンテナの起動・停止・再起動は、logs同様最後にdocker-compose.yml上のコンテナ名を最後に指定します。

docker-compose start redmine
docker-compose stop redmine
docker-compose restart redmine

redminedepend_onmariadbも指定しているのでstart時にmariadbが起動していなければ一緒に起動しますが、stop時はmariadbを落としません。

redmineのマイナーバージョンを3.3.1から3.3.2にしたい場合は、一旦redmineだけ停止し、docker-compose.ymlimageラストのタグを3.3.2に変えてから以下のコマンドを実行します。

docker-compose rm redmine
docker-compose up -d redmine

mariadb上のオブジェクト構成をマイナーバージョンで変えていなければ正常にバージョンアップが可能になります。

redmineのプラグインをインストールするためにログインしたい場合は、以下のコマンドで入ることができます。

docker-compose exec redmine /bin/bash

どうもredmine(、jenkins、rocketchatも,)コンテナはUbuntu/apt構成なのでaptしたり、curlしたりする場合は、それぞれのプロクシ設定を行う必要があります

Jenkins のプラグインは初期設定指示のプロクシ指定さえ正しく行えていれば、execする必要なく実行できます。


バックアップは、docker-compose.ymlの存在するディレクトリ上に backup をつくっておいて
以下のようなスクリプトをcrontabなどに仕込んでおけば1日分の復元は可能です。

#!/bin/sh
TAR=/usr/bin/tar
COMPOSE=/usr/local/bin/docker-compose
RSYNC=/usr/bin/rsync
# docker-compose.ymlのあるディレクトリフルパス
CONTAINERS_HOME=hogehoge
# rsync server config
RSYNC_SERVER=your.rsync.server
RSYNC_TARGET=your_rsync_server_target
#
# operations
#
cd ${HOGEHOGE}
${COMPOSE} stop
${TAR} cvfz ./backup/data.tar.gz ./data
${COMPOSE} start
#${RSYNC} -avz --delete ${CONTAINERS_HOME}/backup/ ${RDYNC_SERVER}:${RSYNC_TARGET}

上記スクリプトではrsyncで移動させていますが、別途rsyncサーバが必要なのでコメント化してあります。

当然、タグをlatestにしていて、復元時にメジャーバージョンアップされてしまうと戻せなくなったりするので注意してください。





おそらく、Redmine、Jenkins、rocketChatなどのアジャイル開発3種の神器はdocker-composeで上げ下げ・rysncでバックアップが正解なきがしています。

なので、PMOのおじさんたちはdocker/docker-composeはしっかり覚えて欲しいところですねえ..

0 件のコメント:

既存アプリケーションをK8s上でコンテナ化して動かす場合の設計注意事項メモ

既存アプリをK8sなどのコンテナにして動かすには、どこを注意すればいいか..ちょっと調べたときの注意事項をメモにした。   1. The Twelve Factors (日本語訳からの転記) コードベース   バージョン管理されている1つのコードベースと複数のデプロイ 依存関係 ...