タイトル通りですが、ローカルネットワークにオレオレDockerレジストリを構築する手順のメモです

環境

  • Debian 10 buster →レジストリにするサーバ。(以下例では 192.168.1.20
  • Docker 20 →サーバのDockerバージョン

レジストリを構築する

ポート 5000へフォワードします

1
$ docker run -d -p 5000:5000 --name registry registry

レジストリに登録するイメージを作成する

動作確認用になんでもよいので適当なイメージを pullします。ここでは ubuntu

1
$ docker pull ubuntu

レジストリにイメージを登録する

レジストリ上のイメージ名を指定します。わかりやすいように ubuntuで揃えていますが、レジストリ(localhost:5000)側はどんな名前でも構いません

1
$ docker tag ubuntu localhost:5000/ubuntu

送信します

1
$ docker push localhost:5000/ubuntu

レジストリからイメージを取得する

その後は localhost:5000/ubuntuでアクセスできます

1
$ docker pull localhost:5000/ubuntu

ローカルネットワーク内の別のマシンからも可能です。例えば、レジストリサーバのIPが 192.168.1.20だった場合

1
$ docker pull 192.168.1.20:5000/ubuntu

エラー http: server gave HTTP response to HTTPS client が出る場合

1
ERROR: Get http://192.168.1.20:5000  http: server gave HTTP response to HTTPS client

HTTPS非対応のレジストリを立てた場合、こんな感じのエラーが出る場合があります

Dockerクライアント側で、Debian/Ubuntuの場合は、 /etc/docker/daemon.jsonに以下の設定をします( daemon.jsonファイルが存在しない場合は作成する)

1
2
3
{
"insecure-registries" : ["192.168.1.20:5000"]
}

また、WindowsやMacのDocker Desktopでは、[Settings] –> [Docker Engine]等に設定出来る箇所があると思いますので、そこに設定します

レジストリサーバを外部公開する場合

そのまま公開するのは危険です。レジストリサーバ起動時に、証明書を指定します

1
2
3
// 例: certsディレクトリにサーバ証明書をこんな感じに用意しておく
$ ls ./certs
domain.crt domain.key
1
2
3
4
5
6
// 証明書を指定しつつ、レジストリ起動
docker run -d -p 5000:5000 --restart=always --name registry \
-v `pwd`/certs:/certs \
-e REGISTRY_HTTP_TLS_CERTIFICATE=/certs/domain.crt \
-e REGISTRY_HTTP_TLS_KEY=/certs/domain.key \
registry

ドメインが例えば、 my-registry.comであれば、前述のコマンドの localhostの部分を my-registry.comに置き換える感じになります

レジストリを削除する場合

1
$ docker stop registry && docker rm -v registry