Docker Deskopを使ってGitLabを立ててみた

# はじめに
はじめてDockerに触れてみます。Docker Desktopを使ってGitLabを構築してみました。
今回は初めてなので、違いを知るためにコンテナ単体とcomposeと2パターンで試してみましたが
複数のコンテナを連携できて便利なので、今後はcomposeを使っていこうと思っています。

# 環境

<details><summary>Windowsのバージョン</summary><div>

```
エディション：Windows 10 Home
バージョン　：20H2
OSビルド　　：19042.928
```
</div></details>

<details><summary>Dockerのバージョン</summary><div>

```
PS C:\Users\xxx> docker version
Client:
 Cloud integration: 1.0.14
 Version:           20.10.6
 API version:       1.41
 Go version:        go1.16.3
 Git commit:        370c289
 Built:             Fri Apr  9 22:49:36 2021
 OS/Arch:           windows/amd64
 Context:           default
 Experimental:      true

Server: Docker Engine - Community
 Engine:
  Version:          20.10.6
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8728dd2
  Built:            Fri Apr  9 22:44:56 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0
```
</div></details>

<details><summary>Docker Composeのバージョン</summary><div>

```
PS C:\Users\xxx> docker-compose version
docker-compose version 1.29.1, build c34c88b2
docker-py version: 5.0.0
CPython version: 3.9.0
OpenSSL version: OpenSSL 1.1.1g  21 Apr 2020
```
</div></details>

# 手順(コンテナ単体版)

## 流れ

- gitlab-ceイメージの取得
- 取得したイメージを使って、コンテナの作成と起動
- しばらく待ってから、GitLabへアクセス

## gitlab-ceイメージの取得

- 実行するコマンド：`docker pull gitlab/gitlab-ce:latest`

`gitlab/gitlab-ce`はイメージ名、コロンに続く`latest`がタグになります。
どんなタグがあるかというと、「[Docker Hub](https://hub.docker.com/r/gitlab/gitlab-ce/tags?page=1&ordering=last_updated)」に載ってます。

```
PS C:\Users\xxx> docker pull gitlab/gitlab-ce:latest
latest: Pulling from gitlab/gitlab-ce
345e3491a907: Pull complete
～～省略～～
a5e82faf9eb6: Pull complete
Digest: sha256:3421d0b39f305bacf63176bf73760fe1352f352472c6f02e7a6b4b19365d73d6
Status: Downloaded newer image for gitlab/gitlab-ce:latest
docker.io/gitlab/gitlab-ce:latest
```

## 取得したイメージを使って、コンテナの作成と起動

- フォーマット：`docker run [オプション] イメージ名 [コマンド] [引数...]`
- 実行するコマンド：`docker run -d -p 8080:80 --name gitlab gitlab/gitlab-ce:latest`

`-d`はデタッチ。バックグラウンド起動です。
`-p 8080:80`でHostの8080ポートを、コンテナの80ポートに割り当てています。
`--name gitlab`は、起動するコンテナに`gitlab`という名前をつけています。

```
PS C:\Users\xxx> docker run -d -p 8080:80 --name gitlab gitlab/gitlab-ce:latest
33a2cdb39603140ac9c0bed339bf500a8063a1edad483d5e794a1f1adad73ea7
```

コンテナのステータスを確認すると、Hostの8080ポートがコンテナの80ポートに割り当たっていることや
`NAMES`が`gitlab`になっていることが確認できます。

```
PS C:\Users\xxx> docker ps
CONTAINER ID   IMAGE                     COMMAND             CREATED          STATUS                             PORTS                                                    NAMES
33a2cdb39603   gitlab/gitlab-ce:latest   "/assets/wrapper"   19 seconds ago   Up 17 seconds (health: starting)   22/tcp, 443/tcp, 0.0.0.0:8080->80/tcp, :::8080->80/tcp   gitlab
P
```

# 手順(docker compose版)
次はdocker composeを使った手順です。

## docker composeとは
docker composeとは、複数のコンテナからなるサービスを構築をする機能です。
`docker-compose.yml`というファイルを用意して、コンテナごとに定義を用意してやり
`docker-compose up -d`を実行するだけで起動できます。

今回はgitlabの単一コンテナを例にした手順ですが、ゆくゆくgitlab runnerコンテナと連携して
CI/CDできる環境を構築するつもりなので、そういった時にdocker composeは便利になります。

## 流れ

- `docker-compose.yml`の用意
- イメージの取得と、コンテナの作成と起動
- ブラウザでアクセス

## `docker-compose.yml`の用意

`docker-compose.yml`は、「[ここ](https://gitlab.com/gitlab-org/omnibus-gitlab/raw/master/docker/docker-compose.yml)」に用意されています。
ほぼそのままですが、portを変更しています。

```yml
web:
  image: 'gitlab/gitlab-ce:latest'
  restart: always
  hostname: 'gitlab.example.com'
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url 'https://gitlab.example.com'
  ports:
    - '8080:80'
    - '443:443'
  volumes:
    - '/srv/gitlab/config:/etc/gitlab'
    - '/srv/gitlab/logs:/var/log/gitlab'
    - '/srv/gitlab/data:/var/opt/gitlab'
```

ディレクトリ構成はこんな感じ

```
PS D:\xxx\docker\gitlab> ls


    ディレクトリ: D:\xxx\docker\gitlab


Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----        2021/05/16     15:48            368 docker-compose.yml
```

## DockerComposeの状態確認

`docker-compose ps`を実行して確認します。
まだ作成も起動もしていないので、何も現れません。

```
PS D:\xxx\docker\gitlab> docker-compose ps -a

Name   Command   State   Ports
------------------------------
```

### コンテナの作成と起動

`docker-compose up -d`を実行します。
もし、イメージを取得してなければ、自動で取得してくれます。

```
(実行例)
docker-compose up -d

Docker Compose is now in the Docker CLI, try `docker compose up`

Pulling web (gitlab/gitlab-ce:latest)...
latest: Pulling from gitlab/gitlab-ce
a70d879fa598: Pull complete
（中略）
f02a0cd519df: Pull complete
Digest: sha256:526e5d4da70f1b19ca4b95e431b8383d42c1cae21af0a002331cbf3650a2e8d9
Status: Downloaded newer image for gitlab/gitlab-ce:latest
Creating docker_web_1 ... done
```

### DockerComposeの状態確認

起動したコンテナが現れました。

```
(実行例)
docker-compose ps -a

    Name           Command               State                                       Ports
-----------------------------------------------------------------------------------------------------------------------
docker_web_1   /assets/wrapper   Up (health: starting)   0.0.0.0:22->22/tcp, 0.0.0.0:443->443/tcp, 0.0.0.0:8080->80/tcp
```

### ブラウザでアクセス

数分待ってから、`localhost`にアクセス
どういうわけか443ポートだと接続できるんですが
8080ポートだとERR_EMPTY_RESPONSEとなって接続できない。
気が向いたら後日調べてみようと思います。