zaki work log

作業ログやら生活ログやらなんやら

パラメタの多いdocker runをdocker-composeを使ってYAMLで定義する(GitLab CE編)

docker runのパラメタが多いと設定変更して再実行しづらかったりメンテが大変なので、YAMLに書いてdocker-composeで実行すれば色々と便利です。
ということで、お題として以下のGitLab CEを起動するdocker rundocker-composeで動かせるようにしてみます。

zaki-hmkc.hatenablog.com

元のdocker run

$ sudo docker run --detach \
   --hostname gitlab-ce.example.org \
   --env GITLAB_OMNIBUS_CONFIG="external_url 'https://gitlab-ce.example.org:8443'; nginx['listen_port']=8443; gitlab_rails['registry_enabled']=true; registry_external_url 'https://gitlab-ce.example.org:25000'" \
   --publish 8443:8443 --publish 25000:25000 \
   --name gitlab-registry \
   --restart always \
   --volume /opt/gitlab-reg/config:/etc/gitlab:Z \
   --volume /opt/gitlab-reg/logs:/var/log/gitlab:Z \
   --volume /opt/gitlab-reg/data:/var/opt/gitlab:Z \
   --volume /opt/gitlab-reg/registry:/var/opt/gitlab/gitlab-rails/shared/registry:Z \
   --volume /opt/gitlab-cert:/etc/gitlab/ssl \
   gitlab/gitlab-ce:12.7.4-ce.0

これにちょっとパラメタ追加したり変更して再実行したりするの、まぁめんどいよね、というお話。

docker-composeのインストール

debian系だとaptで入るけど、yumだとリポジトリにないので、公式の手順通りGitHubからダウンロードしてインストールする。

docs.docker.com

$ sudo curl -L "https://github.com/docker/compose/releases/download/1.25.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100   617  100   617    0     0   1720      0 --:--:-- --:--:-- --:--:--  1718
100 16.3M  100 16.3M    0     0  3150k      0  0:00:05  0:00:05 --:--:-- 4093k
$ ls -l /usr/local/bin/docker-compose 
-rw-r--r--. 1 root root 17176256  2月 28 07:12 /usr/local/bin/docker-compose
$ sudo chmod 775 /usr/local/bin/docker-compose
$ docker-compose version
docker-compose version 1.25.4, build 8d51620a
docker-py version: 4.1.0
CPython version: 3.7.5
OpenSSL version: OpenSSL 1.1.0l  10 Sep 2019

Compose fileを書く

みんな大好きYAML
docker runで指定してるパラメタを基本そのまま書けばいい。
-d(--detach)のみはコンテナの動作自体の動作ではなく、docker-composeの引数に指定する必要があるのでここには書かない。

---
version: '3'
services:
  gitlab-registry:
    image: gitlab/gitlab-ce:12.7.4-ce.0
    hostname: gitlab-ce.example.org
    restart: always
    ports:
      - "8443:8443"
      - "25000:25000"
    environment:
      GITLAB_OMNIBUS_CONFIG: "external_url 'https://gitlab-ce.example.org:8443'; nginx['listen_port']=8443; gitlab_rails['registry_enabled']=true; registry_external_url 'https://gitlab-ce.example.org:25000'"
    volumes:
      - /opt/gitlab-reg/config:/etc/gitlab:Z
      - /opt/gitlab-reg/logs:/var/log/gitlab:Z
      - /opt/gitlab-reg/data:/var/opt/gitlab:Z
      - /opt/gitlab-reg/registry:/var/opt/gitlab/gitlab-rails/shared/registry:Z
      - /opt/gitlab-cert:/etc/gitlab/ssl

リファレンスはこちら

docs.docker.com

起動

元コンテナの停止

docker runで既に実行済みのコンテナがあれば止めておく(同じ設定で動かすのでportとかコンフリクトする)

[zaki@registry gitlab]$ sudo docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                    PORTS                                                                       NAMES
64248b188a0e        gitlab/gitlab-ce:12.7.4-ce.0   "/assets/wrapper"   3 weeks ago         Up 43 minutes (healthy)   22/tcp, 80/tcp, 0.0.0.0:8443->8443/tcp, 443/tcp, 0.0.0.0:25000->25000/tcp   gitlab-registry
[zaki@registry gitlab]$ sudo docker stop gitlab-registry
gitlab-registry
[zaki@registry gitlab]$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[zaki@registry gitlab]$

docker-compose up

ここで(必要に応じて)-dを付ける

[zaki@registry gitlab]$ sudo /usr/local/bin/docker-compose up -d
Creating network "gitlab_default" with the default driver
Creating gitlab_gitlab-registry_1 ... done
[zaki@registry gitlab]$ sudo docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                             PORTS                                                                       NAMES
651cc6c71558        gitlab/gitlab-ce:12.7.4-ce.0   "/assets/wrapper"   14 seconds ago      Up 13 seconds (health: starting)   22/tcp, 80/tcp, 0.0.0.0:8443->8443/tcp, 443/tcp, 0.0.0.0:25000->25000/tcp   gitlab_gitlab-registry_1

あとは起動するまで少し待てばOK

[zaki@registry gitlab]$ sudo docker ps
CONTAINER ID        IMAGE                          COMMAND             CREATED             STATUS                   PORTS                                                                       NAMES
651cc6c71558        gitlab/gitlab-ce:12.7.4-ce.0   "/assets/wrapper"   3 minutes ago       Up 2 minutes (healthy)   22/tcp, 80/tcp, 0.0.0.0:8443->8443/tcp, 443/tcp, 0.0.0.0:25000->25000/tcp   gitlab_gitlab-registry_1

停止・その他コマンド

頻度が高いものをピックアップ

composeファイルを編集して再起動(コンテナ再作成)

running状態のままおもむろにdocker-compose upすれば再作成される。便利

# docker-compose up -d
Recreating gitlab_gitlab-registry_1 ... done

Recreatingの通り、起動中だったコンテナは破棄されて、新しいコンテナが起動する。
データを永続化したい場合はvolumes設定をお忘れなく。

停止・削除する(down)

# docker-compose down

コンテナが停止して更に削除される。
(docker ps -aしても残らない)
ホストOSに設定したvolumeは消えないのでご安心を。。

再度実行するにはupする。

ポートのpublish設定など変更する場合はこちら。

停止する(stop)

# docker-compose stop

停止しただけなので、docker ps -aすれば見える。

停止中コンテナの起動(start)

stopされたコンテナを再起動する

# docker-compose start

ログを見る(logs)

# docker-compose logs

特定のコンテナのログのみ見るには、サービス名を指定。

# docker-compose logs gitlab-registry

tail -f的に見るには-f追加。

# docker-compose logs -f

SSH

2020.12.12追記:
ここまでSSHの設定に増えれてなかったので、以下の記事で追加

zaki-hmkc.hatenablog.com