タイトル通りですが、ローカルネットワークにオレオレ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 | { |
また、WindowsやMacのDocker Desktopでは、[Settings] –> [Docker Engine]等に設定出来る箇所があると思いますので、そこに設定します
レジストリサーバを外部公開する場合
そのまま公開するのは危険です。レジストリサーバ起動時に、証明書を指定します
1 | // 例: certsディレクトリにサーバ証明書をこんな感じに用意しておく |
1 | // 証明書を指定しつつ、レジストリ起動 |
ドメインが例えば、 my-registry.com
であれば、前述のコマンドの localhost
の部分を my-registry.com
に置き換える感じになります
レジストリを削除する場合
1 | $ docker stop registry && docker rm -v registry |