DockerでMarkLogic環境構築してみた

はじめに
===
お試しでDockerでMarkLogic環境を構築してみたため、その手順を記載します

# 動作確認環境

| OS | Docker version| docker-compose version |
|---|---|---|
|Windows 10 Home|18.09.9| 1.24.1|

※Windows 10 HomeはDocker for Windowsをインストールできないため、Docker ToolBoxインストールして試しました

# 前提条件

本記事は以下がインストール・登録されていることが前提となります

- Dockerのインストール
- docker-composeのインストール
- MarkLogic コミュニティの登録（無料）
    - [こちら](https://developer.marklogic.com/people/signup)から登録できます

# ディレクトリ構成

ディレクトリ構成は以下のようにしてみました

```
.
├ docker ← Dockerファイルやrpmファイル等の格納ディレクトリ
│    │ 
│    └　marklogic ← Marklogic用のコンテナで必要なDockerファイルやrpmファイル等格納ディレクトリ
│        │ 
│        └　10-0-2 ← Marklogic10.0.2の資材格納ディレクトリ
│            │
│            └ Dockerfile ← Dockerファイル
│            │
│            └ rpm ← rpmファイル格納ディレクトリ
│            │   │
│            │   └ MarkLogic-10.0-2.x86_64.rpm ← Marklogicのrpmファイル
│            │
│            └ conf ← 設定ファイル格納ディレクトリ
│                │
│                └ supervisord.conf ← supervisord用設定ファイル
│
├ docker-compose.yml ← Composeファイル

```

MarkLogicのrpmファイルは以下サイトより取得します。ダウンロードにはMarkLogicコミュニティに登録している必要があります

https://developer.marklogic.com/products/marklogic-server/10.0

「Red Hat Enterprise Linux/CentOS,Version7」のrpmファイルをダウンロードしてください
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227176/80a92baa-33c3-1bbf-61be-9d6adf126f90.png)



# 各種ファイル設定

DockerfileとComposeファイル、supervisord.confファイルを修正します

## Dockerファイル

Dockerファイルは以下のように修正します
コンテナ起動時にサービスを自動起動したいため、supervisordもインストールしています

```dockerfile:Dockerfile
FROM centos:centos7

RUN yum -y update && yum clean all

RUN yum -y install glibc.i686 gdb.x86_64 redhat-lsb.x86_64 && yum clean all

RUN yum -y install initscripts && yum clean all

RUN yum install -y epel-release
RUN yum install -y supervisor && yum clean all
COPY ./conf/supervisord.conf /etc/

ENV PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/opt/MarkLogic/mlcmd/bin

COPY ./rpm/MarkLogic-10.0-2.x86_64.rpm /tmp/MarkLogic.rpm

RUN yum -y install /tmp/MarkLogic.rpm && rm /tmp/MarkLogic.rpm

EXPOSE 7997 7998 7999 8000 8001 8002

ENTRYPOINT ["/usr/bin/supervisord"]
```

## Composeファイル

Composeファイルは以下のように修正

```yml:docker-compose.yml
version: '3'

services:
  ml10-node-1:
    build: ./docker/marklogic/10-0-2
    tty: true
    expose:
      - "7997"
      - "7998"
      - "7999"
    ports:
      - "8000:8000"
      - "8001:8001"
      - "8002:8002"
      - "8010:8010"
    hostname: "ml10-host-1.local"
    container_name: "ml0-node-1.local"
```

## supervisord.confファイル

コンテナ起動時に起動させたいサービスを設定します
今回はMarkLogicを起動させます

```conf:supervisord.conf
[supervisord]
nodaemon=true
 
[program:MarkLogic]
command=/sbin/service MarkLogic start

```

#コンテナ作成と起動

Composeファイルがあるディレクトリで以下コマンドを実行
実行完了まで少々時間がかかります

```
$ docker-compose up -d
```

実行が完了したら以下にアクセス

```
http://localhost:8001
```

※localhostの部分は環境によって異なります。例えば、Docker Toolboxを使用している方は、「docker-machine ip」を実行してIPアドレスを確認してlocalhost部分を置き換えてください

無事に起動できました
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227176/e5ef6ed8-4fc7-2b06-a074-e9c3863da580.png)

# クラスタ構成にしたい場合

クラスタ構成で環境構築したい場合はComposeファイルを修正するだけでよい
以下は、3台のクラスタ構成にしたい場合

```yml:docker-compse.yml
version: '3'

services:
  ml10-node-1:
    build: ./docker/marklogic/10-0-2
    tty: true
    expose:
      - "7997"
      - "7998"
      - "7999"
    ports:
      - "8000:8000"
      - "8001:8001"
      - "8002:8002"
      - "8010:8010"
    hostname: "ml10-host-1.local"
    container_name: "ml0-node-1.local"

  ml10-node-2:
    build: ./docker/marklogic/10-0-2
    tty: true
    expose:
      - "7997"
      - "7998"
      - "7999"
    ports:
      - "18000:8000"
      - "18001:8001"
      - "18002:8002"
      - "18010:8010"
    hostname: "ml10-host-2.local"
    container_name: "ml0-node-2.local"
  
  ml10-node-3:
    build: ./docker/marklogic/10-0-2
    tty: true
    expose:
      - "7997"
      - "7998"
      - "7999"
    ports:
      - "28000:8000"
      - "28001:8001"
      - "28002:8002"
      - "28010:8010"
    hostname: "ml10-host-3.local"
    container_name: "ml0-node-3.local"
```

コンテナ作成・起動をし、諸々設定してクラスタ構成にすることに成功
クラスタ構成の手順はここでは割愛する
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/227176/d48935d2-716e-5085-cf07-4ff10db21b0b.png)


# 参考

https://www.marklogic.com/blog/building-a-marklogic-docker-container/