Dockerで5分くらいでGitLabを試す

# 2015/09/21追記

気がついたら http://www.damagehead.com/docker-gitlab/ では Docker Compose を使う方法に変わってました。これなら複数のコンテナの起動・停止を簡単に、気持ちよく記述、実行できますね・・・！
実行は以下のような感じ。

```sh
wget https://raw.githubusercontent.com/sameersbn/docker-gitlab/master/docker-compose.yml
docker-compose up
```

コンテナ構成など基本的な考え方は変わってなさそうなので、自分の構成に合わせて docker-compose.yml を調整するとよさげ。

あとGitLabのロゴが[だいぶスマートな感じ](http://qiita.com/takanemu/items/019e220ce22d4d7735a2#%E8%BF%BD%E8%A8%98)になってる・・・！

----


インフラ管理のための仕掛けを自動化するのはそれなりにうまくできつつあるのですが、これらのスクリプトや設定ファイル類の管理はやっぱりそれなりに面倒なわけです。
これらのファイルをそれなりにバージョン管理しつつ、ファイルの変更によって何か別の処理をキックしたり、別のシステムからそれらのファイルを簡単に引っ張り出せるようにしたい、みたいなことを考えはじめると、ここ最近はGitLabのようなGitHubクローンが思いつきます。個人的にはロゴがかわいくなくてアレなのですけど。

で、お試しとしてDockerで動かねえかなあと探すわけですが、
http://www.damagehead.com/docker-gitlab/ に、**5秒でできる！**みたいなアオリ文句があって、ほんとに簡単に動きます。
動くのですけど、それどうなんだろうな・・・と思う部分もあったので、もうちょっと時間をかけて、**5分くらいで**Docker上でGitLabを動かしてみたのでそのメモ。

#5秒(※)で試す方法

※イメージのダウンロードとコンテナ起動時間を除く

http://www.damagehead.com/docker-gitlab/ とか https://github.com/sameersbn/docker-gitlab#quick-start とかで紹介されているコマンドはこんな感じ。

```sh
docker run --name='gitlab' -it --rm \
-e 'GITLAB_PORT=10080' -e 'GITLAB_SSH_PORT=10022' \
-p 10022:22 -p 10080:80 \
-v /var/run/docker.sock:/run/docker.sock \
-v $(which docker):/bin/docker \
sameersbn/gitlab:latest
```

これを起動すると、sameersbn/gitlabのほか、sameersbn/postgresql, sameersbn/redisコンテナができる。
これは、`-v`オプションで、ホストのDockerコマンドとDockerにさわるためのUNIXソケットをコンテナ内に見せてあげていて、コンテナ内の `/app/init` スクリプトで `docker run` しているため。

確かに、サービス一式そろって動作確認できてやったねとなるのだけど、sameersbn/gitlabコンテナを停止しても他の2つは停止しなかったり、少しもやっとする感じはある。

#5分くらい(※)で試してみる

※イメージのダウンロードとコンテナ起動時間を(ry

https://github.com/sameersbn/docker-gitlab#configuration を見ながら、こんな感じかなー、と。 

###コンテナ構成を考える

今回はPostgreSQLでなくてMySQLを使ってみる。PostgreSQLのほうを推奨ということではあるのだけど、個人的環境では他にもMySQLコンテナがいそうな雰囲気なので、できれば管理対象はMySQLにしぼっておきたい。

というわけで、目指すコンテナ構成はこんな感じ。

![gitlab-design.jpg](https://qiita-image-store.s3.amazonaws.com/0/28770/8c551cf9-67eb-10ea-b405-4abf9ad5886c.jpeg)

ポイントとしては、

* Redisコンテナ, MySQLコンテナはGitLabコンテナから `--link` でつなぐようにする。そのため、Redis, MySQLコンテナには `--name` で名前をつけておく(今回は `gitlab-redis`, `gitlab-mysql`)
    * GitLabコンテナからは、 `redisio`, `mysql`という名前でそれぞれ見えるようにする必要がある
* コンテナが削除されても残しておきたいデータは `-v` でホスト側ディレクトリをマウントする
    * GitLabコンテナ `/home/git/data` ... ホスト側ディレクトリ `/vagrant/gitlab/git`
    * MySQLコンテナ `/var/lib/mysql` ... ホスト側ディレクトリ `/vagrant/gitlab/mysql`
* GitLabのサービスにアクセスするためのポートはとりあえずHTTPだけ試してみる
    * コンテナのポート `80` ... ホスト側ポート `10080`

###コンテナを起動してみる

1. Redisコンテナを起動する
    https://github.com/sameersbn/docker-gitlab#linking-to-redis-container の説明を踏まえて、以下のようなコマンドを実行する。

    ```sh
    docker run --name gitlab-redis -d sameersbn/redis:latest
    ```

    特にエラーなど報告されなければOK。念のため `gitlab-redis` という名前で起動できているか確認。

    ```shell-session
    docker@boot2docker:/vagrant$ docker ps
    XXXXXXXXXXXX  sameersbn/redis:latest  ...  6379/tcp  gitlab-redis
    ```

2. MySQLコンテナを起動する
    これも https://github.com/sameersbn/docker-gitlab#linking-to-mysql-container の説明を踏まえて、

    ```sh
    docker run --name gitlab-mysql -d -e 'DB_NAME=gitlabhq_production' -e 'DB_USER=gitlab' -e 'DB_PASS=password' -v /vagrant/gitlab/mysql:/var/lib/mysql sameersbn/mysql:latest
    ```

    Redisと同様に `docker ps` して `gitlab-mysql` コンテナがいるか確認。また、ホストの `/vagrant/gitlab/mysql` ディレクトリにMySQL関連のデータファイルっぽいファイルができていることを確認。

    ```shell-session
    docker@boot2docker:/vagrant$ docker ps
    YYYYYYYYYYYY  sameersbn/mysql:latest  ...  3306/tcp  gitlab-mysql
    XXXXXXXXXXXX  sameersbn/redis:latest  ...  6379/tcp  gitlab-redis
    ```

    初回起動時はDATABASEを生成するので、ちょっと待ってあげるのが無難かもしれない。

3. GitLabコンテナを起動する
    この辺 https://github.com/sameersbn/docker-gitlab#data-store を踏まえて、
    
    ```sh
    docker run -d -p 10080:80 -e 'GITLAB_PORT=10080' -e 'GITLAB_HOST=192.168.33.10' -v /vagrant/gitlab/git:/home/git/data --link gitlab-mysql:mysql --link gitlab-redis:redisio sameersbn/gitlab:latest
    ```

    ちなみに、`-e` オプション `GITLAB_HOST` 環境変数には、ホストのアドレスを指定する。今回試した環境はboot2dockerでprivate-networkを設定した状態なので、上記の例では `192.168.33.10` としている。 (参考: http://qiita.com/yacchin1205/items/a422e4e130ef92457390#3-1)

    3つコンテナができていればOK。MySQLと同じように、ホストの `/vagrant/gitlab/git` ディレクトリにいろいろファイルができる。

    ```shell-session
    docker@boot2docker:/vagrant$ docker ps
    ZZZZZZZZZZZZ  sameersbn/gitlab:latest  ...  22/tcp, 443/tcp, 0.0.0.0:10080->80/tcp  evil_shockley
    YYYYYYYYYYYY  sameersbn/mysql:latest  ...  3306/tcp  evil_shockley/mysql,gitlab-mysql
    XXXXXXXXXXXX  sameersbn/redis:latest  ...  6379/tcp  evil_shockley/redisio,gitlab-redis
    ```

    すぐには起動しないので、 `docker logs` とかしながら様子見。

    ```shell-session
    docker@boot2docker:/vagrant$ docker logs ZZZZZZZZZZZZ
    Creating SSH2 RSA key; this may take some time ...
    Creating SSH2 DSA key; this may take some time ...
    Creating SSH2 ECDSA key; this may take some time ...
    Creating SSH2 ED25519 key; this may take some time ...
    invoke-rc.d: policy-rc.d denied execution of restart.
    Setting up GitLab for firstrun. Please be patient, this could take a while...
    ```
    
    `success: nginx entered RUNNING state`とかログが確認できればOKっぽい。

###動作確認してみる

これでGitLabに必要なコンテナはすべて起動完了。gitlabのコンテナのポート `80` に対しては、ホストのポート `10080` を介することでアクセスすることができる。

動作確認は、ブラウザから `http://(DockerホストのIPアドレス):10080` とかする。

![gitlab.png](https://qiita-image-store.s3.amazonaws.com/0/28770/24875097-724d-985a-6fea-ea64e5a10ede.png)

動きました。ロゴがかわいくないです(個人的には)ね。

あとは元ページの言っている通り、

* username: root
* password: 5iveL!fe

でログインできます。パスワード変更させられますので、その後は適当に。

そんなわけで、Dockerで簡単にGitLab環境が作れました。これでAPIの感じとか色々試せます。この設定でいいかどうかは色々試してみる中で。

###余談

ロゴがかわいくないのが耐え難い ( **こっちみんな** という気持ちになる) ので、今度
 http://qiita.com/takanemu/items/019e220ce22d4d7735a2 を参考にさせていただいてロゴを変えようと考え中・・・