利用シーン
実は、システムを docker-compose 環境を gzip 提供して、解凍したらスクリプト一発でインストールしたいことってありますよねえ。
- docker image はネットアクセスでは取得できないから、ローカルのイメージを使いたい。
- バージョンアップ時に、イメージだけ提供したい。
でも docker-compose の image 定義はどこぞにとりに行ってしまうし。
docker-compose の誤解
「docker-compse でローカルイメージを使うには」 こうしたヘルプ投稿は結構多いんですが、これちょっとした勘違いなんです。 僕も image に tar.gz 書けないよ、って思ったことがります。
ですが、そもそも ローカルの docker 環境に docker-compose.yml の image で定義した イメージがあれば、それ使ってくれるんです。 つまりは、
- docker save で作った dockerイメージの tar.gz を
- docker-compose up 前に docker load で ローカル環境にロードしておけば
- docker-compose up 時には、それを使ってくれるんです。
具体的な docker 操作
make 環境
docker build -t {Target}:{version} .
docker save {Target} | gzip > {TargetImage}.tar.gz
docker-compose.yml
:
services:
xxx-system:
image: {Target}:latest
container_name: {コンテナ名}
volumes:
:
volumes:
:
デプロイ環境 (インストール時)
#
# docker イメージをローカル環境にロード
#
gzip -d {TargetImage}.tar.gz -c | docker load
docker image ls
{Target} {version} {image id} {when} xxx GB
#
# load したイメージに latest タグを振っておく
# docker-compose では latest イメージを使うように書いているから
#
docker tag {Target}:{version} {Target}:latest
#
# docker-compose で起動
#
docker-compose up -d
デプロイ環境 (バージョンアップ時)
#
# docker-compose を停止
#
docker-compose down
#
# バージョンアップした docker イメージをローカル環境にロード
#
gzip -d {TargetImage}.tar.gz -c | docker load
docker image ls
{Target} {version} {image id} {when} xxx GB
#
# load したイメージに latest タグを振っておく
# これで今ロードしたイメージが latest になります
# (旧イメージを削除するなら docker rmi などで)
#
docker tag {Target}:{version} {Target}:latest
#
# docker-compose で起動
#
docker-compose up -d
おわりに
全くなにを言ってるんだか、当たり前田のクラッカーだろうが。。。
なんて思われるでしょうが、それはきっと「バージョンアップまで考えたデプロイ」を経験しているからで、知らない人だっているでしょうから。
だって デバッグでは docker-compse.yml では開発ソース環境一式を volume でホストマウントして、Visual Studio Code の リモート機能使って、開発してますよね。 yml は image ではなく build を使って。
それをそのまま環境に置けば、自身が開発したコードの修正だけなら、ホスト上の開発コードをバージョンアップすればいいだけですから。 git 管理なら git pull だけですし。
この記事がお役に立つのはごくごく一部の人だと思いますが、その人達にとってはきっとお役に立つと思うので記事にしておきました!