前回はdocker for runnersでdockerを使いましたが、特権モードが必要です
ファイルを作成:
version: '3.7'
services:
runner:
image: gitlab/gitlab-runner:latest
volumes:
- ./config:/etc/gitlab-runner
- ./run:/var/run/
# - /var/run/docker.sock:/var/run/docker.sock
docker:
image: docker:dind
restart: always
privileged: true # <-- security problems
volumes:
- ./run:/var/run/
私は個人用のPCを持っています。GitlabチームではGitlab CIでスクリプトを実行する必要がありますdocker build
。CIdocker-compose up
をスピードアップしたいのです。だから私は自分のホストドッカーランナー今では、Docker キャッシュ (イメージなど) があり、あるステージでイメージをビルドし、別のステージでそれを必要とする場合、非常に高速になります。
Jenkins でも同じ問題があります。ホスト Docker をワーカー ノードと共有する必要があります。
前回、新しいアプローチをテストし、独自のdockerでランナーを実行したいと考えました。重要なことが2つあります。 - リソース制限(CPUコア8個のうち7個、メモリ16GBのうち10個、HDD制限を共有したい) - セキュリティ
重要な点として、GPU、ネットワーク機能、デバイスのマウントなどを必要とするCIスクリプトはありません。通常は単純な と を実行しdocker build
、docker push
で成果物を取得する必要がある場合がありますがdocker cp
、それだけです。主な質問:ホストマシンへのルート権限なしでdockerでdockerを実行する?
ソケット共有や特権モードはホストマシンに脆弱性を与え、仮想マシン(VirtualBoxなど)は遅くて難しいです。また、リソースを共有したいので、dockerが必要です。できる16 GB のうち 10 GB を使用しますが、使用しないときは 10 GB は空きになるはずです。
通常の権限で実行すると、dind コンテナー (失敗前) から情報のないエラーがいくつか発生します。
gitlab-runner-docker | mount: permission denied (are you root?)
gitlab-runner-docker | mount: permission denied (are you root?)
gitlab-runner-docker | Could not mount /sys/kernel/security.
gitlab-runner-docker | AppArmor detection and --privileged mode might break.
特権モードなしで docker で docker を実行しようとすると、どのような問題が発生しますか? どうすればいいですか?
答え1
まあ、RAMメモリの負荷分散に関しては、現在のユーザーをdockerグループに追加することで、sudo権限なしでdocker(dind)でdockerを実行することができますが、
共有ソケットのセキュリティは整合性が失われるためわかりませんが、特権パラメータ付きのコンポーザパラメータを使用してdindをインスタンス化することをお勧めします: true