製品(納品物、成果物)の一部として Docker を扱う時、リンク切れは大敵です。Docker を利用してイメージを作る際にはベースイメージ、apt-getやgitなどのコマンドで得るライブラリなど様々なものに依存することがほとんどです。リンク切れによってこれらの依存先が消えると納品した Dockerfile からイメージを作り直すことができなくなります。こうなると障害対応間近です。何がしかの理由でイメージ再ビルドを含むコンテナ再生成を行った場合、問題があらわになり、障害となります。そういった状況を避けるために製品としての諸々が備わった状態のイメージをファイルとして作り、これを納品する方法が考えられます。こうするとリンク切れが起きても、そのイメージファイルからイメージ、ひいては製品を動作させるために必要なコンテナを生成することができ、耐用年数が増えます。
余談ですがおおよそのサービスはサポート切れ→リンク切れの順でことが起こるので、まめに製品を更新できる環境であればこれを考慮する必要はあまりありません。サポート切れを放置しなければ基本的にリンク切れになりませんので、Docker イメージ云々の問題は適切なライブラリ更新がされ続ける限りほとんど起きません。まめに更新できるパターンで問題が起こるのは、Git リポジトリを突然削除された場合、前提となっていたダウンロード用の URL がいつの間にか変更された場合、たまたまコンテナ再構築とダウンロード先の障害が重なった場合、といった比較的珍しい場合です。
完成状態のイメージをファイル化する、ファイル化したイメージからイメージやコンテナを作るコマンドは以下です。
# 前提: 完成状態(apt-get, apk等のプログラム用のダウンロードがこれ以上要らない状態)のイメージをコンテナ化できている。 # 完成状態のコンテナをイメージ化 # https://docs.docker.com/engine/reference/commandline/commit/ docker commit [コンテナID] [出力後イメージ名] # 例. docker commit e68acd7cd50e cpl/test_docker_img # 実際はもっと意味のある名前を推奨 # 任意のイメージをファイル化 # https://docs.docker.com/engine/reference/commandline/save/ docker save [イメージ名] -o [出力後ファイル名] # 例. docker save cpl/test_docker_img -o cpl-test_docker_img.tar # 任意のファイル化されたイメージから Docker 内で使えるイメージを作成 # https://docs.docker.com/engine/reference/commandline/load/ docker load -i [イメージになる元のファイル名] # 例. docker load -i cpl-test_docker_img.tar
一連の commit, save でファイル化、load でイメージ化ができます。イメージ化ができたならば docker run で実行するなり、docker-compose.yml 内の image 部分にイメージ名を書いて docker-compose up するなりしてイメージを元にしたコンテナを動かせます。
# docker-compose.yml version: "3" services: test: image: cpl/test_docker_img
この様にすると納品した後の対応が少なく済みやすくなる Docker の扱いが可能になります。また、このイメージのファイル化とファイルからのイメージ作成によって外部との通信を封じる様な閉じた環境においても USB メモリなりハードディスクなりを介して Docker を介した諸々を構築できる様になります。