- 追加された行はこの色です。
- 削除された行はこの色です。
#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>)