はじめまして、インフラ部でアルバイトをしているmya0です。
コンテナ化していないアプリケーションで、デプロイにコンテナレジストリを活用しました。
GitLab CI実行時にアセットをビルドし、結果をDocker Imageとしてコンテナレジストリに保管し、デプロイ時にこの中身をコピーすることでデプロイを高速化しています。
この方法であれば本番環境でコンテナ化したアプリケーションを動作させる準備が整っていない状態でもコンテナレジストリを利用し、徐々にコンテナを利用するように移行していくことができます。
Docker Imageについて
DockerのImageはレイヤー毎にtarファイル(layer.tar)として取り出すことができ、
docker saveすると含まれているlayer.tarをすべて確認することができます。
layer.tarの中身にファイルがそのまま保存されているので、アセットのビルド時のlayer.tarを取得すれば展開するだけで取り出す事ができるようになります。
$ docker pull nginx $ docker save nginx | tar -t 32e685789750dc3ab389d5087dc1ffccb74b09772545557ea0e60b3623ae76c8/ 32e685789750dc3ab389d5087dc1ffccb74b09772545557ea0e60b3623ae76c8/VERSION 32e685789750dc3ab389d5087dc1ffccb74b09772545557ea0e60b3623ae76c8/json 32e685789750dc3ab389d5087dc1ffccb74b09772545557ea0e60b3623ae76c8/layer.tar ... e8195fa5e23e15681e125a8c5e2fe744c215170d0efb71c8833f0ff0af1582c3/layer.tar manifest.json repositories
コンテナ化していないアプリケーションのデプロイでの利用
GitLab Container Registryでも使用できる、Docker Registry HTTP API V2を使用することでdockerを介さずにイメージのlayer.tarのみ取得することができる為、これをデプロイ時に使用することでコンテナ化していないアプリケーションでもコンテナレジストリを活用することができます。
GitLab、GitLab Container Registryでこれを簡単に行うためにglcr-fetcherという社内ツールを作成し、社内の各アプリケーションの担当者がデプロイに組み込みやすい仕組みを作りました。
社内では、pixivコミックのCIでビルドしたJavaScriptを各アプリケーションサーバーに配置するなどに活用しています。この仕組みを使うことで各アプリケーションサーバーでJavascriptをビルドする必要がなくなりデプロイが高速化されました。
glcr-fetcher
glcr-fetcherはGitLab Container RegistryからイメージのレイヤーをダウンロードすることができるGo製のツールです。
以下の手順でimage_name:$COMMIT_SHAをコンテナレジストリから取得し、このイメージ内のファイルを展開することができます。
$ glcr-fetcher -r "image_name" -t ${COMMIT_SHA} -o layer.tar $ tar -xvf layer.tar $ rm layer.tar
まとめ
コンテナ化していないアプリケーションであってもDocker Imageにファイルを保存しておくことでコンテナレジストリを活用し、徐々にコンテナ化するための土台を作っていくことができます。
インフラ部では、アプリケーションをコンテナ環境に移行させていきたいエンジニアを募集しています。