自宅サーバや社内サーバで Kubernetes を運用している際、手元の Mac でビルドした Docker イメージを、外部のイメージリポジトリ(DockerHub, ECR等) を介さずに、SSH でサーバに Push したい場合のやりかた。
まずは、Kubernetes に関係なく、ローカルの Docker から リモートの Docker にイメージを送る方法。
docker save ${image_name}:${image_tag} | ssh -C username@remote.example.com docker load
とすれば、ローカルの Docker イメージを直接リモートサーバに送信できる。
ただし、イメージリポジトリを使って docker push / docker pull を使う方法と比べると、更新のあったレイヤのみの差分更新はされず、全レイヤをすべて通信するため、比較して動作は遅い。
サーバで MicroK8s を使っている場合、サーバ内の docker のイメージリポジトリとは別に、ctr 用のイメージリポジトリが作られ、MicroK8s ではその ctr を使うため、docker load してたイメージは使えない。
MicroK8s で ctr にイメージをインポートするには、
docker save mynginx > myimage.tar
microk8s ctr image import myimage.tar
参考 https://microk8s.io/docs/registry-images
上記のように、 ctr image import
コマンドを使う。このコマンドは標準入力からのインポートはサポートしていないため、一旦イメージをファイルに保存する必要がある。
ローカルのイメージを、リモートの ctr に読み込ませるには
docker save ${image_name}:${image_tag} | ssh -C username@remote.example.com "cat > /tmp/_exported_image.tar"
ssh username@remote.example.com "sudo microk8s ctr image import /tmp/_exported_image.tar"
このように、一旦ファイルに書き込んでから microk8s ctr image import
するとできる。
sudo が必要なので、sudores に下記のように登録しておくと良いと思う。
username ALL=(ALL) NOPASSWD: /snap/bin/microk8s
コメント