#author("2020-01-17T12:26:16+00:00","","")
#mynavi()
#setlinebreak(on);

* 目次 [#uc91c552]
* 目次 [#k9c1266c]
#contents
- 関連
-- [[gitコマンド]]
-- [[dockerメモ]]
-- [[GitリポジトリをMavenリポジトリとして使用する]]
- 参考
-- https://docs.gitlab.com/omnibus/docker/
-- https://docs.gitlab.com/ce/user/packages/container_registry/
-- https://docs.gitlab.com/omnibus/docker/#install-gitlab-using-docker-compose
-- [[Apache+openSSLでクライアント認証]]
-- [[Javaでhttps通信時の証明書検証について]]
-- [[サーバ名がIPアドレスの場合のSSL証明書作成]]


* 概要 [#l882ecb6]
#html(<div>)
* 概要 [#wcf1173b]
#html(<div class="pl10">)
Gitlab の Container Registry でプライベートな Dockerレジストリを構築する。
※尚、ここでいう Gitlab はストレージサービスとしてのそれではなく、OSS としての Gitlab を指す。
※尚、ここでいう Gitlab は ストレージサービスとしてのそれではなく、OSS としての GitLab CE を指す。
#html(</div>)

* GitLabのインストール [#n13046ab]
* 作業用ディレクトリ作成 [#qe9dac67]
#html(<div class="pl10">)
#myterm2(){{
mkdir work_gitlab_container
cd work_gitlab_container
}}
#html(</div>)

Gitlab を Docker コンテナとしてインストールする。
公開されているものは 1コンテナに必要なものが収まっている為、docker run でも良いのだが、コード化はしておきたいので docker-compose で構築する。
* サーバ証明書の作成 [#cb249828]
#html(<div class="pl10">)
#myterm2(){{
mkdir certs
openssl req \
>     -newkey rsa:4096 -nodes -sha256 -keyout certs/サーバ名.key \
>     -x509 -days 365 -out certs/サーバ名.crt
Generating a 4096 bit RSA private key
..............................................................................................++
.............................................................................................................++
writing new private key to 'certs/サーバ名.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) []:JP
State or Province Name (full name) []:
Locality Name (eg, city) []:
Organization Name (eg, company) []:サーバ名
Organizational Unit Name (eg, section) []:
Common Name (eg, fully qualified host name) []:サーバ名
Email Address []:
}}
#html(</div>)

** docker-compose.yml の作成 [#e6cd9ec2]
* docker-compose.yml の作成 [#g2b1de37]
#html(<div class="pl10">)

コンテナレジストリを有効にするには 環境変数: GITLAB_OMNIBUS_CONFIG に、幾つかのオプションを指定する必要がある。
具体的には、以下のようなものがあげられる。
| オプション | 説明 |h
| xxx | xxx |
| xxx | xxx |
※ https://gitlab.com/gitlab-org/omnibus-gitlab/blob/master/files/gitlab-config-template/gitlab.rb.template
.env
#mycode2(){{
SERVER_NAME=サーバ名
}}

ただし、以下の記載によると、Omnibus GitLab(docker image 版のGitlab)を使用している場合、コンテナレジストリはデフォルトドメインのポート5050で自動的に有効になる模様。
https://docs.gitlab.com/ce/administration/packages/container_registry.html#enable-the-container-registry 

なので、最低限指定すべきオプションは以下の3つだけ。
| オプション | 設定例 |h
| registry_external_url | registry_external_url 'https://gitlab.example.com:4567' |
| registry_nginx['ssl_certificate'] | registry_nginx['ssl_certificate'] = "/path/to/certificate.pem" |
| registry_nginx['ssl_certificate_key'] | registry_nginx['ssl_certificate_key'] = "/path/to/certificate.key" |
※ https://docs.gitlab.com/ce/administration/packages/container_registry.html#configure-container-registry-under-an-existing-gitlab-domain

docker-compose.yml
#mycode2(){{
web:
  image: 'gitlab/gitlab-ce:latest'
  image: gitlab/gitlab-ce:latest
  restart: always
  hostname: 'gitlab.example.com'
  container_name: gitlab
  hostname: localhost
  container_name: mygitlab
  environment:
    GITLAB_OMNIBUS_CONFIG: |
      external_url "http://localhost"
      gitlab_rails['gitlab_shell_ssh_port'] = 2224
      external_url "https://${SERVER_NAME}"
      registry_external_url "https://${SERVER_NAME}:4567"
      registry_nginx['ssl_certificate'] = "/var/certs/${SERVER_NAME}.crt"
      registry_nginx['ssl_certificate_key'] = "/var/certs/${SERVER_NAME}.key"
  ports:
    - '80:80'
    - '443:443'
    - '22:22'
    - '8022:22'
    - '4567:4567'
  volumes:
    - './gitlab/config:/etc/gitlab'
    - './gitlab/logs:/var/log/gitlab'
    - './gitlab/data:/var/opt/gitlab'
    - './certs:/var/certs'
}}
#html(</div>)

** コンテナ作成/起動 [#c87a7e09]
* ビルド/起動 [#gdb545fb]
#html(<div class="pl10">)

#myterm2(){{
docker-compose up -d
}}

#html(</div>)
しばらくすると、以下のようなログが出力され、コンテナがリスタートする。
※Let's Encrypt を利用して証明書周りのセットアップを行おうとしている模様。(自分で作成しているので不要なのだが)
#myterm2(){{
docker logs -g mygitlab

    ================================================================================
    Error executing action `create` on resource 'letsencrypt_certificate[XXX.XXX.XXX.XXX]'
    ================================================================================

    :


Recipe: gitlab::gitlab-rails
  * execute[clear the gitlab-rails cache] action run
    - execute /opt/gitlab/bin/gitlab-rake cache:clear
Recipe: <Dynamically Defined Resource>
  * service[gitaly] action restart
    - restart service service[gitaly]
Recipe: gitaly::enable
  * runit_service[gitaly] action hup
    - send hup to runit_service[gitaly]
Recipe: <Dynamically Defined Resource>
  * service[gitlab-workhorse] action restart
    - restart service service[gitlab-workhorse]
  * service[registry] action restart
    - restart service service[registry]
  * service[gitlab-exporter] action restart
    - restart service service[gitlab-exporter]
  * service[redis-exporter] action restart
    - restart service service[redis-exporter]
  * service[prometheus] action restart
    - restart service service[prometheus]
Recipe: monitoring::prometheus
  * execute[reload prometheus] action run
    - execute /opt/gitlab/bin/gitlab-ctl hup prometheus
Recipe: <Dynamically Defined Resource>
  * service[alertmanager] action restart
    - restart service service[alertmanager]
  * service[postgres-exporter] action restart
    - restart service service[postgres-exporter]
  * service[grafana] action restart
    - restart service service[grafana]

Running handlers:
There was an error running gitlab-ctl reconfigure:

letsencrypt_certificate[XXX.XXX.XXX.XXX] (letsencrypt::http_authorization line 5) had an error: Acme::Client::Error::RejectedIdentifier:\
 acme_certificate[staging] (/opt/gitlab/embedded/cookbooks/cache/cookbooks/letsencrypt/resources/certificate.rb line 25) had an error:\
 Acme::Client::Error::RejectedIdentifier: Error creating new order :: Cannot issue for "XXX.XXX.XXX.XXX": The ACME server can not issue a certificate for an IP address

Running handlers complete
Chef Client failed. 539 resources updated in 03 minutes 09 seconds
}}



#html(</div>)


* netstat インストール [#p3f4542c]
apt-get update
apt install net-tools
* イメージをpushしてみる [#q0917c6b]
#html(<div class="pl10">)

#myterm2(){{
docker login サーバ名:4567

#####
# 適当なイメージをpull
docker pull ubuntu

https://docs.docker.com/registry/deploying/
# タグ付け/プッシュ
docker image tag ubuntu サーバ名:4567/group1/myproject1
docker push サーバ名:4567/group1/myproject1

#mycode2(){{
docker run -d \
  --restart=always \
  --name registry \
  -v "$(pwd)"/certs:/certs \
  -e REGISTRY_HTTP_ADDR=0.0.0.0:443 \
  -e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
  -e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
  -p 443:443 \
  registry:2
# ver2 をタグ付け/プッシュ
docker image tag ubuntu サーバ名:4567/group1/myproject1:ver2
docker push サーバ名:4567/group1/myproject1:ver2
}}

プッシュ後の状態
#html(<div style="display: inline-block; border: 1px solid #333">)
#ref(gitlab_container_registry.png)
#html(</div>)

https://docs.docker.com/registry/deploying/
#html(</div>)

* 補足 [#a68ade77]
#html(<div class="pl10">)

サーバ名をIPアドレスにする場合は、証明書の Subject Alternative Name もチェックされるので、これを含む証明書を作成する必要がある。
でないと、docker login 時に以下のように怒られる。

#myterm2(){{
Error response from daemon: Get https://192.168.0.12:4567/v2/: x509: cannot validate certificate for 192.168.0.12 because it doesn't contain any IP SANs
}}

※参考: [[サーバ名がIPアドレスの場合のSSL証明書作成]]

#html(</div>)


トップ   一覧 単語検索 最終更新   ヘルプ   最終更新のRSS