Upgrade to Pro — share decks privately, control downloads, hide ads and more …

chroot,lxcそしてdocker

Sponsored · Your Podcast. Everywhere. Effortlessly. Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.

 chroot,lxcそしてdocker

Avatar for Creationline

Creationline

December 05, 2025
Tweet

More Decks by Creationline

Other Decks in Technology

Transcript

  1. 自己紹介 樋口大輔 (twitter: @dai_lxr) クリエーションライン株式会社 CL-LAB: http://www.creationline.com/lab Chef Approved Contributor

    (2012/06/27) busser-serverspec, knife-sakura, ... Debian Project Official Developer (2012/01/01) mikutter, uim, ...
  2. chroot change rootdirectory ルートディレクトリを変更するコマンド(システムコ ール) / ←ルートディレクトリ % ls /

    bin dev initrd.img lost+found proc sbin usr boot etc lib media root sys var cdrom home lib64 mnt run tmp vmlinuz
  3. ルートディレクトリを変更するといいことあ るの?(2/4) API/ABI互換のないソフトウェアの利用 chroot以下に現在のシステムと異なるAPI/ABIのライ ブラリを閉じ込めることで共存が可能になる (ex. 古 いソフトウェア) present% /tmp/potato-root/tmp/sl

    -l /tmp/potato-root/tmp/sl: error while loading shared libraries: libncurses.so.4: cannot open shared object file: No such file or directory present% sudo chroot /tmp/potato-root old# /tmp/sl -l ++ +------ || |+-+ | /---------|| | | + ======== +-+ | _|--/~\------/~\-+ //// O========O_/
  4. chrootの残念なところ(2/3) chrootはroot権限がないと動作しない。 さらにchroot後はroot権限を持ったままなので、即 脱獄したり、不正なこともできる。 How to break out of a

    chroot() jail: http:// www.bpfh.net/simes/computing/chroot- break.html inside# ls / bin dev home lib64 mnt proc run srv tmp var boot etc lib media opt root sbin sys usr inside# /tmp/jailbreak outside# ls / bin dev initrd.img lost+found proc sbin usr boot etc lib media root sys var cdrom home lib64 mnt run tmp vmlinuz outside#
  5. chrootの残念なところ(3/3) ファイルシステムベースで隔離しているだけなの で、外のプロセスに干渉できる。 % ps auxwww | grep '[ t]op'

    dai 9919 0.1 0.0 27580 1728 pts/8 S+ 16:51 0:00 top % sudo chroot /tmp/pseudo_root # /bin/busybox kill 9919 # exit % ps auxwww | grep '[ t]op' % 当然、CPU・メモリ・I/O・ネットワークなどのリ ソースも共用なので制限されない。 このあたりを強化したのがFreeBSD jailやコンテナ 技術。
  6. Linuxにおけるコンテナ技術 Virtuozzo (ばーちゅおっぞ) PleskやParallels Desktopで有名なParallels, Inc. (旧SWsoft)による商用製品。 OpenVZ (おーぷんう゛ぃーずぃー) Virtuozzoのオープンソース版。

    LXC (えるえっくすしー) cgroup (control group)と名前空間 (Namespace)でプロセスやリソースを、chrootで ファイルシステムを隔離して作ったコンテナを扱う ための仕組み。
  7. lxcのリソース隔離(1/4): ファイルシステム chrootと同じ。 outside% ls /var/cache/lxc/precise/rootfs-amd64 bin dev home lib64

    mnt proc run selinux sys usr boot etc lib media opt root sbin srv tmp var outside% inside$ ls / bin dev home lib64 mnt proc run selinux sys usr boot etc lib media opt root sbin srv tmp var inside$
  8. lxcのリソース隔離(2/4): プロセス lxcのコンテナ内からは外のプロセスに干渉できな い。 名前空間で実現している。 そもそもPIDがまったく異なる。 もちろん、lxcのコンテナ同士も干渉できない。 outside% ps auxwww

    | grep '[ /]sbin/init' root 1 0.0 0.0 45972 4532 ? Ss 15:20 0:00 /sbin/init root 2650 0.0 0.0 24968 2036 ? Ss 18:00 0:00 /sbin/init outside% inside$ ps auxwww | grep '[ /]sbin/init' root 1 0.0 0.0 24968 2036 ? Ss 18:00 0:00 /sbin/init inside$
  9. lxcのリソース隔離(3/4): ネットワーク 個々のコンテナがネットワークの口を持つ。 名前空間で実現している。 lxcのコンテナごとに仮想NIC(vethX)を割り当てて、 物理NIC(eth0)とブリッジ(br0)で接続する。 outside% brctl show bridge

    name bridge id STP enabled interfaces br0 8000.8c89a56f525d yes eth0 veth1TEH9P outside% ifconfig veth1TEH9P Link encap:Ethernet HWaddr fe:84:c5:17:a0:9d inside$ ifconfig eth0 Link encap:Ethernet HWaddr 4a:49:43:49:79:bf inet addr:192.168.24.72 Bcast:192.168.24.255 Mask:255.255.255.0
  10. lxcのリソース隔離(4/4): CPU・メモリ・I/ O・帯域制御など cgroupで制限ができる inside$ cat /proc/cgroups #subsys_name hierarchy num_cgroups

    enabled cpuset 3 3 1 cpu 4 25 1 cpuacct 4 25 1 memory 0 1 0 devices 5 3 1 freezer 6 3 1 net_cls 7 3 1 blkio 8 3 1 perf_event 9 3 1
  11. docker 簡単に言えば、既存の技術を組み合わせて使いや すくしたコンテナ技術。 libcontainerによるkernel API呼び出し (0.9 以前 はlxcを直接利用) AUFS (Another

    Union File System)によるコンテ ナの世代・差分管理 新しい技術でもないのになぜこんなに騒がれるの か?
  12. なぜdockerなのか?(2/4) 簡単なビルド debian% cat Dockerfile FROM ubuntu MAINTAINER d-higuchi <[email protected]>

    RUN apt-get install -y nginx debian% debian% sudo docker build -t nginx-ubuntu . : Successfully built 53a44d8c6ca9 debian%
  13. なぜdockerなのか?(3/4) 高いポータビリティ dockerで作ったコンテナはどのdockerでも動く。 debian% sudo docker export 800c967d6cd9 > nginx-ubuntu.tar

    centos$ cat nginx-ubuntu.tar | sudo docker import - nginx-ubuntu Debianのdockerで作ったUbuntuのNginxコンテ ナがCentOSのdockerでも動く。
  14. なぜdockerなのか?(4/4) gitライクな世代・差分管理 コンテナをあたかもgitで管理するかのように履歴を 追ったり分岐したりできる。 % sudo docker ps -a CONTAINER

    ID IMAGE COMMAND CREATED ... 800c967d6cd9 nginx-test:latest /usr/sbin/nginx -g ' 38 minutes ago ... % % sudo docker commit 800c967d6cd9 tag-test e0ad2d2f909272f2d9966aa163bedca1644ac0b440a4f4a3d59303fbdf51a371 % % sudo docker images | head REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE tag-test latest e0ad2d2f9092 14 seconds ago 294.9 MB nginx-test latest 53a44d8c6ca9 41 minutes ago 294.9 MB %