DockerでGitBucketを簡単に構築してみる。

　転職に際し、自分の進めていた＋管理していた業務自動化スクリプトを引き継ぎしようと思ったが、引き継ぎ先メンバーがGitを使用できないことが分かったので、練習してもらう環境を整えるためにDockerでGitBucketサーバーを簡単に構築してみる。
今回はゲストOSのRocky LinuxにDockerをインストールして、GitBucketサーバーを構築します。
（最近Dockerを触っていないので、ほぼ自分の勉強が目当て）

### 環境
---
ホストOS: Windows11
ゲストOS:Rocky8(Hyper-V)

![for_gitbucket.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909270/aa653cbf-df9b-77f6-b886-0e86c792398c.png)
### 構築手順
---
1. Dockerインストール
1. dockerfileの作成
1. docker-compose.ymlの作成
1. ホスト側でのポートフォワーディング設定（おまけ）

### 1. Dockerのインストール
まずゲストOSにDockerをインストールする必要がある。
デフォルトのレポジトリからdnf install dockerで適用にインストできると思ってたが、podmanというコンテナ技術を使ってDockerのCLIをエミュレートしているものしかインストできなさそうだった

```
pcp-pmda-docker.x86_64 : Performance Co-Pilot (PCP) metrics from the Docker daemon
podman-docker.noarch : Emulate Docker CLI using podman
```
これでもいいやと思って使ってたらdocker-composeでエラーをはいて詰まってしまったので、Dockerの公式リポジトリからDockerをインストールする。
```
#リポジトリの追加
[root@localhost ~]#  dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

#インスト可能なパッケージが増えていることを確認
[root@localhost ~]# dnf search docker
Docker CE Stable - x86_64                                                                    441 kB/s |  66 kB     00:00    
================================================= 名前 & 概要 一致: docker ==================================================
docker-buildx-plugin.x86_64 : Docker Buildx plugin for the Docker CLI
docker-ce-rootless-extras.x86_64 : Rootless support for Docker
docker-compose-plugin.x86_64 : Docker Compose (V2) plugin for the Docker CLI
docker-scan-plugin.x86_64 : Docker Scan plugin for the Docker CLI
pcp-pmda-docker.x86_64 : Performance Co-Pilot (PCP) metrics from the Docker daemon
podman-docker.noarch : Emulate Docker CLI using podman
===================================================== 名前 一致: docker =====================================================
docker-ce.x86_64 : The open-source application container engine
docker-ce-cli.x86_64 : The open-source application container engine

#dockerのインスト
[root@localhost ~]# sudo dnf install docker-ce docker-ce-cli containerd.io docker-compose-plugin
```

### 2. dockerfileの作成

基本GitBucketのコンテナイメージをそのままrunするだけでいいのだが、勉強＋拡張性のためにdockerfileを使う。
下記のファイルを適時コメントアウトを無効化して使用すればOK。
```
#コンテナのイメージ指定
FROM gitbucket/gitbucket:latest

#コンテナの公開ポート指定
EXPOSE 8080

#何かコピーしたいものがあれば
#COPY /host/target/path /container/target/path

#コンテナイメージのビルド時に設定する環境変数（コンテナのOSには引き継がれない）
#ARG APP_ENV=production

#コンテナ起動時に設定する環境変数
#ENV APP_ENV=production

#Dockerイメージを作成する際に実行するコマンド
#RUN apt install hogehoge　

#Dockerコンテナを起動した際に実行するコマンド(上書き可)
#CMD python /app/app.py

#Dockerコンテナを起動した際に実行する必須で実行するコマンド(上書き不可)
#ENTRYPOINT python /app/app.py

```

### 3. docker-compose.ymlの作成
同じく勉強＋拡張性のためにdocker-composeを使用する。
通常gitbucketイメージだけのコンテナで十分だが、場合によってはDBサーバを別で構築したい場合もあると思うので、例としてDBコンテナの記述も下記に追加した。(GitBucket側でのDBサーバ指定の設定は割愛)

```
version: '3'
services:
  gitbucket:
    build: .
    #ローカルとコンテナでファイルを同期する場合(ホストボリューム/バインドマウント)
    #volumes:                                                        
      #- ./src:/app
    ports: 
      - "80:8080"
    restart: always
    depends_on: 
      - db

#DBを別で用意する場合は、下記のサービスも追加する
  db: 
    image: postgres:latest
    restart: always
    environment: 
      - POSTGRES_DB=gitbucket
      - POSTGRES_USER=gitbucket
      - POSTGRES_PASSWORD=gitbucket
```

Dockerfileとdocker-compose.ymlが準備できたので、下記コマンドを実行してみる。
(カレントディレクトリにDockerfileとdocker-compose.ymlを配置してる)
```
[root@localhost ~]# docker compose up -d gitbucket
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS              PORTS                                              NAMES
427f094ed8f0   root-gitbucket    "sh -c 'java -jar /o…"   9 minutes ago   Up About a minute   29418/tcp, 0.0.0.0:80->8080/tcp, :::80->8080/tcp   root-gitbucket-1
83dfad8df75d   postgres:latest   "docker-entrypoint.s…"   9 minutes ago   Up 9 minutes        5432/tcp                                           root-db-1
```
gitbucketコンテナとDBコンテナが立ち上がっていることが確認できた。
ゲストOSあてにhttpでアクセスしてみる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3909270/d7c3183d-5cb4-288c-ef87-0de741566b1d.png)
無事GitBucketにアクセスできることを確認。

### 4. ホスト側でのポートフォワーディング設定(おまけ)
ホストOSのHyper-Vで内部ネットワークを使用し、ホストOS側でNAT変換することで、ゲストOSが外部ネットワークと通信できるようにしている。そのため、基本的に外部からゲストOSに通信することができなくなっているので、この構成ではポートフォワーディング設定が必要になる。
```
netsh interface portproxy add v4tov4 listenaddress=ホストOSのIP listenport=80 connectaddress=ゲストOSのIP connectport=80
```

外部のクライアントからホストOSの80番ポート宛に通信が来ると、ゲストOSの80番ポートに転送されるようになる。
ゲストOSの80番ポートはDockerで作成したGitBucketコンテナの8080番ポート宛に転送されるため、外部からでもGitBucketを使えるようになる。

### 終わり
普段使わないと細かいDockerfileやdocker-composeの項目を忘れてしまいますね。
これで簡易的ではありますがリモートリポジトリを使っていただく環境が作れたかなーと思います。