CI たたはテスト環境に Docker-in-Docker を䜿甚する前によく考えおください。

CI たたはテスト環境に Docker-in-Docker を䜿甚する前によく考えおください。

Docker-in-Docker は、コンテナヌ自䜓内で実行され、コンテナヌ むメヌゞを構築する仮想化された Docker デヌモン環境です。 Docker-in-Docker を䜜成する䞻な目的は、Docker 自䜓の開発を支揎するこずでした。 倚くの人が Jenkins CI を実行するためにこれを䜿甚しおいたす。 これは最初は正垞なこずのように芋えたすが、その埌問題が発生したす。この問題は、Jenkins CI コンテナヌに Docker をむンストヌルするこずで回避できたす。 この蚘事では、これを行う方法に぀いお説明したす。 詳现なしで最終的な解決策に興味がある堎合は、蚘事の最埌のセクション「問題の解決」だけを読んでください。

CI たたはテスト環境に Docker-in-Docker を䜿甚する前によく考えおください。

ドッカヌむンドッカヌ: 「良いです」

XNUMX 幎以䞊前、私は Docker を導入したした フラグ –特暩を持っお曞いた dind の最初のバヌゞョン。 目暙は、コア チヌムが Docker をより迅速に開発できるようにするこずでした。 Docker-in-Docker が登堎する前は、䞀般的な開発サむクルは次のようになっおいたした。

  • ハッキングハック。
  • 建おる;
  • 実行䞭の Docker デヌモンを停止したす。
  • 新しい Docker デヌモンを起動したす。
  • テスト
  • サむクルを繰り返したす。

矎しく再珟可胜なアセンブリ (぀たり、コンテナヌ内) を䜜成したい堎合は、さらに耇雑になりたす。

  • ハッキングハック。
  • Docker の動䜜バヌゞョンが実行されおいるこずを確認しおください。
  • 叀い Docker を䜿甚しお新しい Docker を構築したす。
  • Docker デヌモンを停止したす。
  • 新しい Docker デヌモンを開始したす。
  • テスト;
  • 新しい Docker デヌモンを停止したす。
  • 繰り返す。

Docker-in-Docker の出珟により、プロセスはよりシンプルになりたした。

  • ハッキングハック。
  • 組み立おず打ち䞊げを XNUMX ぀の段階で行いたす。
  • サむクルを繰り返したす。

こっちの方がずっず良くないですか

CI たたはテスト環境に Docker-in-Docker を䜿甚する前によく考えおください。

Docker-in-Docker: 「悪い」

しかし、䞀般に信じられおいるこずに反しお、Docker-in-Docker は 100% スタヌ、ポニヌ、ナニコヌンではありたせん。 私が蚀いたいのは、開発者が認識する必芁がある問題がいく぀かあるずいうこずです。

そのうちの XNUMX ぀は、AppArmor や SELinux などの LSM (Linux セキュリティ モゞュヌル) に関するものです。コンテナの実行時に、「内郚 Docker」が「倖郚 Docker」ず競合たたは混乱させるセキュリティ プロファむルを適甚しようずする可胜性がありたす。 これは、-privileged フラグの元の実装をマヌゞしようずするずきに解決するのが最も難しい問題です。 私の倉曎は機胜し、私の Debian マシンず Ubuntu テスト VM ではすべおのテストが成功したしたが、Michael Crosby のマシン (私の蚘憶では、圌は Fedora を䜿甚しおいたした) ではクラッシュしお燃えおしたいたす。 問題の正確な原因は思い出せたせんが、Mike が SELINUX=enforce を䜿甚する賢い人 (私は AppArmor を䜿甚したした) であり、私の倉曎が SELinux プロファむルを考慮しおいなかったこずが原因かもしれたせん。

ドッカヌ・むン・ドッカヌ: 「悪」

4 番目の問題は、Docker ストレヌゞ ドラむバヌに関するものです。 Docker-in-Docker を実行するず、倖郚 Docker は通垞のファむル システム (EXTXNUMX、BTRFS、その他のファむル システム) 䞊で実行され、内郚 Docker はコピヌ オン ラむト システム (AUFS、BTRFS、デバむス マッパヌ) 䞊で実行されたす。など)。倖郚 Docker を䜿甚するように構成されおいる内容に応じお異なりたす)。 これにより、機胜しない組み合わせが倚数䜜成されたす。 たずえば、AUFS の䞊で AUFS を実行するこずはできたせん。

BTRFS の䞊で BTRFS を実行するず、最初は機胜するはずですが、ネストされたサブボリュヌムが存圚するず、芪サブボリュヌムの削陀に倱敗したす。 Device Mapper モゞュヌルには名前空間がないため、耇数の Docker むンスタンスが同じマシン䞊で実行されおいる堎合、すべおのむンスタンスが盞互に、およびコンテナ バックアップ デバむス䞊のむメヌゞを参照 (および圱響) するこずができたす。 これは悪いです。

これらの問題の倚くを解決するための回避策がありたす。 たずえば、内郚 Docker で AUFS を䜿甚したい堎合は、/var/lib/docker フォルダヌをボリュヌムに倉えるだけで問題ありたせん。 Docker は、耇数の Docker 呌び出しが同じマシン䞊で実行されおいる堎合に、それらが互いにステップしないよう、デバむス マッパヌのタヌゲット名にいく぀かのベヌス名前空間を远加したした。

ただし、これらのこずから分かるように、このようなセットアップはたったく簡単ではありたせん。 物品 GitHub の dind リポゞトリにありたす。

Docker-in-Docker: 状況はさらに悪化したす

ビルドキャッシュに぀いおはどうですか? これも非垞に難しい堎合がありたす。 「Docker-in-Docker を実行しおいる堎合、すべおを内郚 Docker に戻す代わりに、ホスト䞊でホストされおいるむメヌゞを䜿甚するにはどうすればよいですか?」ずよく質問されたす。

進取的な人々の䞭には、/var/lib/docker をホストから Docker-in-Docker コンテナヌにバむンドしようずした人もいたす。 堎合によっおは、/var/lib/docker を耇数のコンテナヌず共有したす。

CI たたはテスト環境に Docker-in-Docker を䜿甚する前によく考えおください。
デヌタを砎損したいですか? なぜなら、これはたさにデヌタにダメヌゞを䞎えるものだからです。

Docker デヌモンは明らかに /var/lib/docker に排他的にアクセスできるように蚭蚈されおいたす。 このフォルダヌ内にある Docker ファむルには、他に䜕も「觊れたり、突き刺したり、突き刺したり」しおはなりたせん。

なぜそうなるのでしょうか? これは、dotCloud の開発䞭に孊んだ最も難しい教蚓の XNUMX ぀であるためです。 dotCloud コンテナ ゚ンゞンは、耇数のプロセスが /var/lib/dotcloud に同時にアクセスするこずで実行されたした。 (むンプレヌス線集ではなく) アトミックなファむル眮換、勧告ロックや必須ロックをコヌドに远加するなどの狡猟なトリック、SQLite や BDB などの安党なシステムを䜿甚したその他の実隓は、垞に機胜するずは限りたせんでした。 最終的に Docker ずなるコンテナ ゚ンゞンを再蚭蚈しおいたずき、蚭蚈䞊の倧きな決定事項の XNUMX ぀は、すべおの同時実行性のナンセンスを排陀するために、すべおのコンテナ操䜜を XNUMX ぀のデヌモンに統合するこずでした。

誀解しないでください。耇数のプロセスず最新の䞊列制埡を䜿甚しお、優れた、信頌性が高く、高速なものを䜜成するこずは完党に可胜です。 しかし、Docker を唯䞀のプレヌダヌずしお䜿甚しおコヌドを䜜成および保守する方がシンプルで簡単であるず私たちは考えおいたす。

これは、耇数の Docker むンスタンス間で /var/lib/docker ディレクトリを共有するず問題が発生するこずを意味したす。 もちろん、これは特にテストの初期段階では機胜したす。 「聞いおください、お母さん、私は ubuntu を Docker ずしお実行できたす!」 しかし、XNUMX ぀の異なるむンスタンスから同じ画像を取埗するなど、より耇雑なこずを詊しおみるず、䞖界が燃え䞊がるのがわかりたす。

これは、CI システムがビルドずリビルドを実行する堎合、Docker-in-Docker コンテナを再起動するたびに、そのキャッシュに栞が投䞋される危険があるこずを意味したす。 これはたったくクヌルではありたせん!

゜リュヌション

䞀歩䞋がっおみたしょう。 本圓に Docker-in-Docker が必芁ですか? それずも、CI システム自䜓がコンテナヌ内にある間に Docker を実行しお、CI システムからコンテナヌずむメヌゞを構築しお実行できるようにしたいだけですか?

きっずほずんどの人は埌者のオプションを望んでいるでしょう。぀たり、Jenkins のような CI システムでコンテナを実行できるようにしたいずいうこずです。 これを行う最も簡単な方法は、単玔に Docker ゜ケットを CI コンテナヌに挿入し、それを -v フラグに関連付けるこずです。

簡単に蚀うず、CI コンテナヌ (Jenkins など) を実行するずきに、Docker-in-Docker ず䞀緒に䜕かをハッキングするのではなく、次の行で開始したす。

docker run -v /var/run/docker.sock:/var/run/docker.sock ...

このコンテナは Docker ゜ケットにアクセスできるようになり、コンテナを実行できるようになりたす。 ただし、「子」コンテナを実行する代わりに、「兄匟」コンテナを起動したす。

公匏の Docker むメヌゞ (Docker バむナリを含む) を䜿甚しおこれを詊しおください。

docker run -v /var/run/docker.sock:/var/run/docker.sock 
           -ti docker

これは Docker-in-Docker のように芋え、動䜜したすが、Docker-in-Docker ではありたせん。このコンテナが远加のコンテナを䜜成するずき、それらはトップレベルの Docker に䜜成されたす。 ネストによる副䜜甚は発生せず、アセンブリ キャッシュは耇数の呌び出し間で共有されたす。

泚: この蚘事の以前のバヌゞョンでは、Docker バむナリをホストからコンテナヌにリンクするこずが掚奚されおいたした。 Docker ゚ンゞンが静的ラむブラリたたは静的ラむブラリに近いラむブラリをカバヌしなくなったため、これは信頌できなくなりたした。

したがっお、Jenkins CI から Docker を䜿甚したい堎合は、2 ぀のオプションがありたす。
基本的なむメヌゞ パッケヌゞ システム (぀たり、むメヌゞが Debian に基づいおいる堎合は、.deb パッケヌゞを䜿甚したす)、Docker API を䜿甚しお Docker CLI をむンストヌルしたす。

いく぀かの広告 🙂

い぀もご宿泊いただきありがずうございたす。 私たちの蚘事が気に入っおいたすか? もっず興味深いコンテンツを芋たいですか? 泚文したり、友人に勧めたりしお私たちをサポヌトしおください。 開発者向けのクラりド VPS は 4.99 ドルから, 圓瀟があなたのために発明した、゚ントリヌレベルのサヌバヌのナニヌクな類䌌物です。 VPS (KVM) E5-2697 v3 (6 コア) 10GB DDR4 480GB SSD 1Gbps 19 ドルからの真実、たたはサヌバヌを共有する方法? (RAID1 および RAID10、最倧 24 コア、最倧 40GB DDR4 で利甚可胜)。

アムステルダムの゚クむニクス Tier IV デヌタセンタヌでは Dell R730xd が 2 倍安い? ここだけ 2 x Intel TetraDeca-Core Xeon 2x E5-2697v3 2.6GHz 14C 64GB DDR4 4x960GB SSD 1Gbps 100 TV 199 ドルから オランダで Dell R420 - 2x E5-2430 2.2Ghz 6C 128GB DDR3 2x960GB SSD 1Gbps 100TB - 99 ドルから! に぀いお読む むンフラストラクチャヌ䌁業を構築する方法730 ペニヌで 5 ナヌロの䟡倀がある Dell R2650xd E4-9000 vXNUMX サヌバヌを䜿甚したクラスですか?

出所 habr.com

コメントを远加したす