dockerシリーズ1---docker分離と制限技術


dockerシリーズ1-docker分離と制限技術
  • この文章は主に以下のいくつかの質問に答えた.
  • Dockerとプロセスの関係は何ですか
  • Dockerは、各コンテナがカーネルを共有する場合に、独自のPID空間を持つ方法、およびリソース分離
  • を実現する方法について説明します.

    dockerとプロセス
  • dockerは仮想マシンのような感じがしますが、dockerと仮想マシンには本質的な違いがあります
  • 仮想マシンは1つの仮想マシンオペレーティングシステムを実行する時、ホストオペレーティングシステムの上で、1つの割り当てられた完全なディスク空間で、オペレーティングシステムをインストールして実行して、(オペレーティングシステムは1つのソフトウェアで、これはまた1つのオペレーティングシステムソフトウェアを実行したことに相当します)、これは明らかに隔離された
  • です.
  • でdockerがコンテナを起動した後、そのコンテナ(効果は仮想マシンの中のシステムと似ている)はオペレーティングシステムの1つのプロセスとしてシンクホストに存在し、1つのプロセスとして存在し、つまり複数のコンテナ間または他のプロセス間でオペレーティングシステムのカーネルを共有することを意味し、言い換えれば、dockerがコンテナを起動する代価はプロセスを起動する代価であり、仮想マシンが仮想マシン内のシステムを起動するのに新しいシステムカーネルを実行するのに比べて、オーバーヘッドが大幅に低減されます.もちろん、仮想マシンに取って代わる製品として、ファイル分離、プロセスID分離、ユーザー名分離などの仮想マシンのリソース分離は、コンテナをプロセスとして実行した上で完了する必要があります.本稿では、その後、リソース分離を実現する2つの技術NamespaceとCgroups技術
  • を分析します.
  • docker消費は小さいが、彼の限界もある.
  • はプロセスとして存在する以上、コンテナ内のシステムが彼と同じカーネルまたは互換性のあるカーネルのホスト上で実行されなければならないことを意味し、Windows上のdockerがlinuxを実行したり、linux上のdockerがwindowsを実行したりするのはだめであり、低カーネルバージョンのlinuxが高カーネルバージョンのlinuxを実行しようとするのもだめな
  • である.


    NameServer
  • これはLinuxシステムの技術であり、PID Namespaceのような様々なリソースの分離を実現することができます.Mount Namespace(現在のNamespaceのマウントポイント情報のみを分離されたプロセスに表示させる)、Network(現在のNamespace内のネットワークデバイスと構成のみを分離プロセスに表示させる)とUserというリソース、これらのNameServer、Linuxシステムはシステム呼び出しapiを提供することによって他の人に呼び出され、dockerはこれらのシステム呼び出しを呼び出すことによって様々なリソースの分離を実現する
  • である.
  • 次にPID Namespaceを例にとります
  • コンテナはプロセスとして存在し、シンクホストの他のプロセスと平等に競争しているため、シンクホストが割り当てたPID、例えば1005もある.
  • docker run-it busybox/bin/sh、例えばこのコマンドは、コンテナを実行した後、コンテナに入ってプロセスを確認すると、PIDが1のプロセスとpsプロセス(ps-efの中のps)があることがわかりますが、ホストではPIDが1005で、このdockerコンテナがホストプロセスと隔離された効果を実現していることがわかります.この効果は、分離アプリケーションのプロセス空間を変更することによって、これらのプロセスに修正後のプロセス番号
  • しか見えないようにすることである.
  • int pid = clone(main_function, stack_size, SIGCHLD, NULL); 
    
  • の上のコードブロックはシステム呼び出しであり、呼び出されると、システムは新しいプロセスを作成し、このプロセスのPID
  • に戻る.
  • int pid = clone(main_function, stack_size, CLONE_NEWPID | SIGCHLD, NULL); 
    
  • それ以上CLONE_NEWPIDは、このプロセスはシステム管理であるため、そのプロセスで見られるものもシステム管理であり、このプロセスで実行されるときにシステム呼び出しで得られるPIDは修正されたものであり、他のNamespaceも同様であり、この例で説明したいのは、これらのNamespaceはLinuxのメカニズムによって実現されることである.


  • CGroup
  • デフォルトでは、プロセスにリソース制限は行われず、プロセスが利用するコンピューティングリソースは絶えず変化する.それは、コンピューティングリソースを制限し、仮想マシンのようなコンピューティングリソース分離の効果を達成するために、CGroupはdockerによってこの目標
  • を実現するために使用される.
  • まず、CGroupはシステム呼び出しで、まず彼の使い方を見てみましょう.彼はLinuxのあるディレクトリのファイルの変動を通じてこの機能を呼び出しています.
  • $ mount -t cgroup 
    #         ,                     
    cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/lib/systemd/systemd-cgroups-agent,name=systemd)
    cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
    cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
    cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
    cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
    cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
    cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
    cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
    cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
    cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
    cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
    
    
  • の上のコードブロックの中で、/sys/fs/cgroup/cpuは、このようにcpuリソースを呼び出す入口であり、異なるプロセスのCPU制限の呼び出しに対して、私たちはこのディレクトリの下でサブディレクトリを作成することができ、1つのスレッドに対応することができ、以下の
    cd /sys/fs/cgroup/cpu
    mkdir test
    #              
    cd test
    ll test
    
    drwxr-xr-x 2 root root 0 Sep 12 22:20 ./
    dr-xr-xr-x 7 root root 0 Sep 12 22:20 ../
    -rw-r--r-- 1 root root 0 Sep 12 22:20 cgroup.clone_children
    -rw-r--r-- 1 root root 0 Sep 12 22:20 cgroup.procs
    -r--r--r-- 1 root root 0 Sep 12 22:20 cpuacct.stat
    -rw-r--r-- 1 root root 0 Sep 12 22:20 cpuacct.usage
    -r--r--r-- 1 root root 0 Sep 12 22:20 cpuacct.usage_percpu
    -rw-r--r-- 1 root root 0 Sep 12 22:20 cpu.cfs_period_us
    -rw-r--r-- 1 root root 0 Sep 12 22:20 cpu.cfs_quota_us
    -rw-r--r-- 1 root root 0 Sep 12 22:20 cpu.shares
    -r--r--r-- 1 root root 0 Sep 12 22:20 cpu.stat
    -rw-r--r-- 1 root root 0 Sep 12 22:20 notify_on_release
    -rw-r--r-- 1 root root 0 Sep 12 22:20 tasks
    #                   ,            
    
    
    はcpuにとって、2つの比較的重要なファイルがあり、1つはcpuである.cfs_quota_us、もう一つはcpuです.cfs_period_us、この2つは一般的に組み合わせて使用され、cpuごとを表しています.cfs_period_usの時間では、cpuはcpuしか占有できません.cfs_quota_usの時間、これらの構成を有効にするにはtasksで制限されたスレッドのPIDを指定する必要があります.このcpuの中のサブフォルダや再帰的なサブフォルダはフォルダを作成すれば、これらのファイルはすべてのフォルダに現れますが、tasksでタスクのidを指定しなければ有効になりません.dockerはコンテナを生成し、pidを取得した後、これらのディレクトリを操作することで、リソースを制限する目的を簡単に達成することができます.