docker-composeで保守力の高いサーバー構築を

#概要
らい さむ(@tyariponzu614 )です。
サーバーの入れ替えを行いました。
ホストはなるべくクリーンな状態を保ちたいため、
`docker-compose`で以下のツールを構築しました。

また、`docker run`にどんな引数が入っているかわからないと管理が大変です。
ymlを見ればどういうビルドがされたかわかるため、
保守が楽になるかなと思います。

ちなみにコンテナ間は連携していないです。

| 用途      |      ツール名 |
|:-----------------|------------------:|
| 社内Wiki             | [Growi](https://docs.growi.org/ja/)
| ソースコード管理           |            [gitlab](https://about.gitlab.com/)  |
| ファイル共有             |              [samba](https://www.samba.org/samba/docs/GPL.html) |
| タスク管理               |               [openproject](https://www.openproject.org/) |


##環境
```bash
> cat /etc/lsb-release
Ubuntu 18.04.3 LTS

> docker --version
Docker version 18.09.7, build 2d0083d

> docker-compose --version
docker-compose version 1.17.1, build unknown
```

##環境構築

```bash
> sudo apt-get update
> sudo apt-get upgrade

> sudo apt-get install docker
> sudo apt-get install docker-compose
```

##growi
公式ドキュメントのdocker-composeで構築します。

※一点ご注意ください。
ubuntuの前にraspberrypi model 2で試していますが、
どうやらalm7lアーキテクチャのため、
MongoDBイメージのビルドが失敗するようです。

本記事ではコミットNo. `b5b96cf`を編集しています。

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

services:
  app:
    build:
      context: .
      dockerfile: ./Dockerfile
    ports:
      - 0.0.0.0:3000:3000    # localhost以外からのアクセスに対応
    links:
      - mongo:mongo
      - elasticsearch:elasticsearch
    depends_on:
      - mongo
      - elasticsearch
    environment:
      - MONGO_URI=mongodb://mongo:27017/growi
      - ELASTICSEARCH_URI=http://elasticsearch:9200/growi
      - PASSWORD_SEED=changeme
      # - FILE_UPLOAD=mongodb   # activate this line if you use MongoDB GridFS rather than AWS
      # - FILE_UPLOAD=local     # activate this line if you use local storage of server rather than AWS
      # - MATHJAX=1             # activate this line if you want to use MathJax
      # - PLANTUML_URI=http://  # activate this line and specify if you use your own PlantUML server rather than public plantuml.com
      # - HACKMD_URI=http://    # activate this line and specify HackMD server URI which can be accessed from GROWI client browsers
      # - HACKMD_URI_FOR_SERVER=http://hackmd:3000  # activate this line and specify HackMD server URI which can be accessed from this server container
      # - FORCE_WIKI_MODE='public'    # activate this line to force wiki public mode
      # - FORCE_WIKI_MODE='private'   # activate this line to force wiki private mode

    command: "dockerize
              -wait tcp://mongo:27017
              -wait tcp://elasticsearch:9200
              -timeout 60s
              npm run server:prod"
    restart: unless-stopped
    volumes:
      - growi_data:/data

  mongo:
    image: mongo:3.6
    restart: unless-stopped
    volumes:
      - mongo_configdb:/data/configdb
      - mongo_db:/data/db

  elasticsearch:
    build:
      context: ./elasticsearch
      dockerfile: ./Dockerfile
    environment:
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms256m -Xmx256m"  # increase amount if you have enough memory
    ulimits:
      memlock:
        soft: -1
        hard: -1
    restart: unless-stopped
    volumes:
      - es_data:/usr/share/elasticsearch/data
      - ./elasticsearch/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml

volumes:
  growi_data:
  mongo_configdb:
  mongo_db:
  es_data:
```

##gitlab

`docker-compose`で管理できるようにymlファイルを作成します。

```yml:docker-compose.yml
services:
  gitLab:
    image: gitlab/gitlab-ce:latest
    ports:
     - 0.0.0.0:10080:80
    volumes:
     - '/srv/gitlab/config:/etc/gitlab'
     - '/srv/gitlab/logs:/var/log/gitlab'
     - '/srv/gitlab/data:/var/opt/gitlab'
```

##samba

共有フォルダを以下の権限を与えないと、
クライアントからファイルの読み書きができません。

```bash
> cd ~/samba/pub
> sudo chmod 777 pub
> ls -la
drwxrwxrwx  2 xxxxx xxxxxx 4096  1月 29 12:07 pub
```

公式のイメージが無かったため、スター数が多い`dperson/samba`を使用します。

```bash
> sudo docker search samba
NAME                              DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
dperson/samba                                                                     324                                     [OK]
svendowideit/samba                Sharing a Docker container's volume should b…   55                                      [OK]
```
`docker-compose`で管理できるようにymlファイルを作成します。

```yml:docker-compose.yml
samba:
  image: dperson/samba
  container_name: samba
  ports:
    - "137:137/udp"
    - "138:138/udp"
    - "139:139/tcp"
    - "445:445/tcp"
  volumes:
    - ~/samba/pub:/mnt/pub:rw
  command:
    "-s public;/mnt/pub;yes;no;yes;all;none"
  restart: unless-stopped
```

##OpenProject

スター数が多い`openproject/community`を使用します。

```bash
NAME                                        DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
openproject/community                       Docker image for OpenProject Community Editi…   167
progtologist/openproject                    OpenProject 5.0                                 17                                      [OK]
```
`docker-compose`で管理できるようにymlファイルを作成します。

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

services:
  openproject:
    image: openproject/community:latest
    ports:
      - 0.0.0.0:30080:80
    volumes:
      - ./db-data:/var/lib/postgresql/data
      - ./data:/var/db/openproject
    environment:
      SECRET_KEY_BASE: openproject_secret_key
```

#ビルド方法

```bash
sudo docker-compose up -d
```
`-d`デタッチモードです。バックグラウンドで実行してくれます。

#結果
docker-composeでサーバー管理が楽になりそうです。