Docker Meetup Tokyo #4 ã«ã¦ãDocker Performance on Web Applicationãã¨ããé¡ã§çºè¡¨ãã¾ããã çºè¡¨å 容ã¯ãä¸è¨ã®2ã¤ã®è¨äºãã¾ã¨ãããã®ã«å ãã¦ãææ°ãã¼ã¸ã§ã³ã® Docker 1.4 ã§ã® ISUCON ãã³ããã¼ã¯ã¨ãstorage-driver ã¨ã㦠Device Mapper + Docker 1.4 ããå®è£ ããã OverlayFS ã試ãã¾ããã
ãã®è¨äºã¯ãä¸è¨2è¨äºã§ãããã¤ãé£ãããã¤ã³ãããã£ãã¨ãã£ã¼ãããã¯ãããã ããã®ã§ãDocker Meetup ã§ã®çºè¡¨å 容ãå°ã詳ããã«èª¬æãããã®ã«ãªãã¾ãã
1. Dockerã®ããã©ã¼ãã³ã¹ã«ã¤ãã¦éè¦ãªäºã¯ãªã«ã
Docker ã®ããã©ã¼ãã³ã¹æ¤è¨¼ã«é¢ãã IBM ã® Research Report ã§ãã An Updated Performance Comparison of Virtual Machines and Linux Containersã®å 容ãªã©ãã Linux ContainersãUNION FilesystemãVolumeãPortmapperãHost Networking ãéè¦ãªè¦ç´ ã§ãããã¨ããããã¾ããã
Linux Containers
ã¾ããLinux Containers ã«ã¤ãã¦ã¯ãã³ã³ããã¨ããæ©è½ãããã®ã§ã¯ãªããã«ã¼ãã«ã®åãªã½ã¼ã¹ï¼ãã¡ã¤ã«ã·ã¹ãã ããããã¯ã¼ã¯ãã¦ã¼ã¶ãããã»ã¹ãã¼ãã«ãªã©ï¼ã«ã¤ãã¦å®è£
ããã¦ãã Namespace ã«ãã£ã¦åºåããã空éã®ãã¨ãã³ã³ããã¨å¼ãã§ãã¾ããã¤ã¾ããNamespace ã§éé¢ããã空éã§ããã»ã¹ãçæããã¨ããã¢ãã«ã«ãªãã¾ãã(æ®éã®ããã»ã¹ã¨æ±ããå¤ãããªãã®ã§ãDockerã³ã³ããã®èµ·åãéãã®ã¯å½ç¶ï¼å
¨ã¦ã® Namespace ãåæã«ä½¿ãå¿
è¦ã¯ãªããä¸é¨ã® Namespace ã使ããã¨ãå½ç¶å¯è½ã§ãã(ä¾ãã°ãdocker run
ã³ãã³ãã® --net=host
ãªãã·ã§ã³ã¯ãNetwork Namespace ã使ã£ã¦ããªãã ãã®ã¯ã)
Linux Containers ã¯åä½ã®ã«ã¼ãã«ã§åä½ããã®ã§ã親ã¨åã§å¥ã
ã®ã«ã¼ãã«ãã㤠Hypervisor ã«ããä»®æ³åã¨æ¯ã¹ã¦ãCPUå½ä»¤ããã©ããããããã¡ã¢ãªã¢ã¯ã»ã¹ããã±ããã³ãã¼ã®äºéå¦çãããªãã¦ããã®ã§ããªã¼ãããããããã¾ãããï¼ãã¡ãããVT-xãSR-IOVãªã©ããã¼ãã¦ã§ã¢æ¯æ´ã«ããé«éåææ³ã¯ããï¼
@ten_forward ããã®è¨äº コンテナの歴史と Linux カーネルのコンテナ関連機能についての割とどうでも良い愚痴 - TenForward ãèªãã¨ããã¨æãã¾ãã
Linuxã®åå空éã£ã¦ãå®ã¯ã³ã³ãããæèçã«ä½¿ã£ã¦ããªãã¦ããæ¨æºã§rootã®åå空éãä½ããã¦ä½¿ããã¦ãããããã³ã³ããã使ã£ã¦ãçå±çã«ã¯æ§è½å£åããªããã§ãã #dockerjp
— Emma Haruka Iwao (@Yuryu) 2015å¹´1æ17æ¥
Linux Containersã«ã¤ãã¦å®è£ ã¬ãã«ã§çè§£ããã¦ããæ¹ã ã«ã¨ã£ã¦ã¯ãæ®éã®ããã»ã¹ã¨å¯¾ãã¦å¤ãããªãããããããæ¤è¨¼ããã¾ã§ããªããã¨æãã¾ãããproduction ã§ã®ãµã¼ãã¹ã¤ã³ãèããä¸ã§ä¸å¿è¦ã¦ãããªãã¨ãããªãã¨æãã¾ããã
UNION Filesystem
次㫠UNION Filesystem ã«ã¤ãã¦ã¯ãä¸è¨ã®å ¬å¼ç»åãã¿ãã¨ã ãããããã£ãæ°ã«ãªãã¾ãã
UNION Mount ã¨ããææ³ã§ãã¡ã¤ã«ã·ã¹ãã ã®å±¤ãå®ç¾ããã¦ãããè¦ã¯æ¢ã«ãã¦ã³ãããã¦ãããã¤ã³ãã«å¯¾ãã¦éãã¦å¥ã®ãããã¯ããã¤ã¹ï¼ãã£ã¬ã¯ããªï¼ããã¦ã³ãããæä¸ä½å±¤ã®ã¿ã read-write 屿§ã«ããã以å¤ã®å±¤ã read-only ã«ãããããªã¤ã¡ã¼ã¸ã§ããè¤æ°ã®ãããã¯ããã¤ã¹ï¼ãã£ã¬ã¯ããªï¼ãåããã¦ã³ããã¤ã³ãããã¢ã¯ã»ã¹ã§ãã¾ãã åºæ¬çã«ãä»»æã®ãã¡ã¤ã«ã·ã¹ãã ã®ç¶æ ããæ°è¦æ¸ãè¾¼ã¿ã®åã ãä¸ä½å±¤ã«æ¸ãããã«ããã°ãæä¸å±¤ã«ãã¼ã¹ãã¡ã¤ã«ã·ã¹ãã ãããããã®ä¸ã«å·®åãã¼ã¿ã ããæã¤ãã¡ã¤ã«ã·ã¹ãã 層ãä¹ã£ã¦ããããã«ãªãã¾ãã
ãã®ãããªä»çµã¿ãå®è£
ããã«ããã£ã¦ããããã¯ããã¤ã¹ã¬ãã«ã§ã®å®è£
ã¨ãã¡ã¤ã«ã·ã¹ãã ã¬ãã«ã®å®è£
ãããã¾ãã
Docker ã§ã¯ storage-driver ã¨ãããªãã·ã§ã³ã«ãããUNION Filesystem ã®å®è£
ãåãæ¿ãããã¨ãã§ãã¾ãã
aufs,btrfs,devicemapper,vfs,overlayfs ã使ç¨å¯è½ã§ãã
devicemapper ããããã¯ããã¤ã¹ã¬ãã«ã§ã®å®è£
ã§ãããaufs,btrfs,overlayfs ããã¡ã¤ã«ã·ã¹ãã ã¬ãã«ã§ã®å®è£
ã¨ãªãã¾ãã(vfs 㯠dockerå´ã§ç¡çãã層ãä½ã£ã¦ãï¼ï¼
Device Mapper ã¯ç¹å®ã®ãã¡ã¤ã«ã·ã¹ãã ã«ä¾åããªããã¤ãã«ã¼ãã«æ¨æºã®æ©è½ãªã®ã§æ°è»½ã«ä½¿ããããã¨ããã¡ãªãããããã¾ãã(LVM ã«ã使ããã¦ããï¼
䏿¹ã§ãDevice Mapperã®å ´åãã¤ã¡ã¼ã¸å±¤ã®ä½æã»åé¤ã®æ§è½ã¯è½ã¡ãã¨ããæ¤è¨¼çµæãããã¾ãã(Protected Blog › Log in)
æ±ç¨çã§ããªããã£ããªæ©è½ãæã£ãDevice Mapperã使ã£ã¦éä¸ã層ã¨ãªãä»®æ³ãããã¯ããã¤ã¹ã®ä½æãåé¤ããããããå°ç¨ã®æ©è½ãå®è£
ãããã¡ã¤ã«ã·ã¹ãã ã¬ãã«ã®å®è£
ãéããã¨ããã®ã¯ãªãã¨ãªãããã話ã§ã¯ããã¾ãã
çºè¡¨å
ã§ããã©ã«ãã Device Mapper ã¨ãè¨ã£ã¦ãã¾ããããRHEL/CentOSã§ã¯äºå®ä¸ Device Mapper ãããã©ã«ãã§ããã¨ããã®ãæ£ããã§ãã
ãè©«ã³ãã¦è¨æ£ãã¾ãã(ISUCON ãã³ããã¼ã¯ã§ä½¿ã£ã Ubuntu 14.04 ã§ã¯ãmodprobe aufs
ããç¶æ
ã§ããã©ã«ãã devicemapper ã«ãªã£ã¦ããã¯ããªãã ãã©ãã«ã¼ãã«ãã¼ã¸ã§ã³å¤ãã¦ããããªãããã¹ã£ã¦ãã®ãããããªãï¼
ã¡ããã¨ã³ã¼ããèªãã§ã¿ã㨠https://github.com/docker/docker/blob/5bc2ff8a36e9a768e8b479de4fe3ea9c9daf4121/daemon/graphdriver/driver.go#L79-84
ã¨ãªã£ã¦ãããaufs,btrfs,devicemapper,vfs,overlayfs ã®é ã«ãªã£ã¦ããããã§ãããã©ã«ãã AUFS ã¨ããã®ãæ£ããã§ãã
ç§ã試ããã¨ããã 㨠Ubuntu Trusty + lxc-docker 1.4.1 ã§ã aufs ãæ¨æºã§ä½¿ããããã§ãããUbuntu ã§ devicemapper ãæ¨æºã«ãªãã®ã¯ã©ãããæ¡ä»¶ãªãã.... #dockerjp
— Emma Haruka Iwao (@Yuryu) 2015å¹´1æ17æ¥
Volume
UNION Filesystem ã使ãã¨è¤æ°ã®å±¤ã«å¯¾ãã¦ãI/Oè¦æ±ãããã¯ãã®ä»ã®å¦çãå¤éã«çºè¡ãããã¯ãã§ï¼æé©åã¯ããã¦ããã¨ã¯æãã¾ãã)ããªã¼ãããããæ°ã«ãªãã¨ããã§ããDocker ã«ã¯ Volume ã¨ããæ©è½ããããããã使ãã¨æå®ãããã£ã¬ã¯ããªã UNION Mount ããªãããã«ãªãã¾ãããããã£ã¦ããã®ãã£ã¬ã¯ããªä»¥ä¸ã®ãã¡ã¤ã«ã¸ã®I/Oå¹çããããªãå¯è½æ§ãããã¾ãã
Volume èªä½ã¯ããã©ã¼ãã³ã¹ç®çã§ä½¿ããã®ã§ã¯ãªããã³ã³ããéãããã¯ãã¹ãã»ã³ã³ããéã§ãã¼ã¿ãå ±æããããã®ãã®ã§ãã
Portmapper
ã³ã³ããééä¿¡ããã¹ãã»ã³ã³ããééä¿¡ã§ã¯ããã¹ãå´ã® iptables ã«ããNAPTã§å®ç¾ããã¦ãã¾ãã(172.17.0.3ãã³ã³ããã®IP)
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER -A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER -A POSTROUTING -s 172.17.0.0/16 ! -o docker0 -j MASQUERADE -A POSTROUTING -s 10.0.3.0/24 ! -d 10.0.3.0/24 -j MASQUERADE -A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.3:8000
ãã ããiptablesãå©ç¨ã§ããªãç°å¢ã®ããã«ãã³ã³ããééä¿¡ã®ã¿ docker-proxy
ã¨ããã¦ã¼ã¶ã©ã³ãã®ãããã·ã使ç¨ããã¾ããdocker-proxy
èªä½ã¯iptablesã使ã£ã¦ãã使ã£ã¦ããªãã«é¢ãããèµ·åãã¦ããããã§ãã
docker-proxy -proto tcp -host-ip 0.0.0.0 -host-port 80 -container-ip 172.17.0.3 -container-port 8000
iptablesãã¤ã¾ãã«ã¼ãã«ã©ã³ãã® netfilter ã§ NAPT ã§ããã¨ãããã¦ã¼ã¶ã©ã³ãã®ãããã·ãçµç±ããã°æããã«ãªã¼ããããã大ãããªãã¨ããäºæ³ãã¤ãã¾ãã
Host Networking
Docker ã§ã¯ Network Namespace ã使ããã«ããã¹ãã¨åã Namespace ãå©ç¨ãã Host Networking æ©è½ãããã¾ãã
Host Networking 㯠--net=host
ã§ä½¿ãã¾ãã
ãããã¯ã¼ã¯ã«ã¤ãã¦ã¯ããã¹ãã§ããã»ã¹ãèµ·åããã®ã¨å¤ãããªããã¨ã«ãªãã¾ãã
ãããªãã°ãå
ã»ã©ã® Portmapper ãå¿
è¦ãªããªããããNAPTã®ãªã¼ããããããªããªãã¾ãã
Host Networking ã«ã¤ãã¦ã¯ @deeeetããã® DockerのHost networking機能 | SOTA ã詳ããã§ãã
2. DockeråããISUCONã¢ããªã±ã¼ã·ã§ã³ã®ãã³ããã¼ã¯
ãã³ããã¼ã¯ã¯ãNginx 㨠MySQL ãããã¾ã§ç´¹ä»ãããªãã·ã§ã³ãåãæ¿ã㦠Dockerå ãã¦ãããããã®ã¹ã³ã¢ãæ¯è¼ãã¾ããã ç°å¢ã¯ååã¨ã®å·®åã¯ããæ°ãã Linux ã«ã¼ãã« 3.8.0ãDocker 1.4.1 ã使ã£ã¦ããç¹ã§ãã 詳ããå 容ã¯ä¸è¨ã®ã¹ã©ã¤ããåç §ãã¦ããã ãã¨ãã¦ãçµæã¯ Nginx ã Docker åããã¨ãã« Host Networking ã使ããNAPTãããã¨ãã«ã15%ç¨åº¦ã¹ã³ã¢ãè½ã¡ãã¨ãããã®ã§ããããã以å¤ã®ãVolumeã®On/Off ã storage-driver ã®åãæ¿ãã«ããããã©ã¼ãã³ã¹ã®å¤å㯠ISUCON4äºé¸ã®ç°å¢ã§ã¯èµ·ãã¾ããã§ããã
Host Networking 㨠Volume ON ã®ç¶æ ã§ãæ§è½ãå¤ãããªãã®ã¯äºæ³éãã§ãããstorage-driver ã®åãæ¿ãã«ããããã©ã¼ãã³ã¹ã«å¤åããªãã®ã¯æå¤ã§ããã ããã¯ãããããä»åã®ç°å¢ã§ã¯ããã¼ã¿ãå ¨ã¦ã¡ã¢ãªã«ã®ã£ã¦ãããããRead I/Oã¯ã»ã¼çºçãã¦ããªãã¨ãããã¨ã¨ãWrite I/O㯠UNION FS ã®æä¸å±¤ã®ã¿ã«é©ç¨ããã°ããã®ã§ãè¤æ°ã®å±¤ããããã¨ã«ãããªã¼ããããããã¾ããªãã®ã§ã¯ãªããã¨èãã¦ãã¾ãã
NAPTã®ãªã¼ãããããé¡èã§ããããã㯠docker-proxy ããã»ã¹ãCPU ã 50% ã»ã©ä½¿ç¨ãã¦ããããã§ãã iptables ãæå¹ã«ãã¦ããã®ã«ãªã docker-proxy ã使ãããã®ãã¨æãã¾ããããiptablesã®ã«ã¼ã«ã«å®å ãã«ã¼ãããã¯ã¢ãã¬ã¹ã®å ´åã¯ã³ã³ããã¸ã«ã¼ãã£ã³ã°ãããªãããã§ãã
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
benchmarker ã¯ããã©ã«ãã§ã¯ 127.0.0.1:80 ã¸æ¥ç¶ãããããbenchmarker - Nginx éã§ã®æ¥ç¶ã«ããã¹ãã® 0.0.0.0:80 ã§ LISTEN ãã¦ã docker-proxy ã使ããã¦ãã¾ãã¨ããäºæ
ã«ãªã£ã¦ãã¾ãã
benchmarker ã®ãªãã·ã§ã³ã§ --host <host eth0 ipaddr>
ã¨ãã¦ããã¨ãiptables ã§ã«ã¼ãã£ã³ã°ãããããã«ãªããããã¹ã³ã¢ã¯Dockeråãã¦ããªãç¶æ
ã¨ã»ã¼åãã«ãªãã¾ããã
ãªãã«ã¼ãããã¯ã¢ãã¬ã¹ã ãå¤ãããã®ã
å®å ã¢ãã¬ã¹ã 127.0.0.1 ã®ã¾ã¾ã ã¨ãã³ã³ããããã±ãããåä¿¡ãã¦è¿ä¿¡ããã¨ãã«ãå®å ã¢ãã¬ã¹ã 127.0.0.1 ã«ãã¦ãã¾ããã³ã³ããèªèº«ã«ã«ã¼ãããã¯ãã¾ãã ã«ã¼ãããã¯ãé¿ããããã以ä¸ã®æ§ãªPOSTROUTINGã«ã¼ã«ã§NAPTããè¨å®ãå¿ è¦ãªããã§ãã 127.0.0.1 ãã³ã³ããã®IPã«æ¸ãæãããã³ã³ãããããã¹ãã¸ã®è¿ä¿¡æã«å®å ã¢ãã¬ã¹ãã³ã³ããã®IPã«ãªããçµå±èªåã«æ»ã£ã¦ããããã«ã¿ãã¾ããããããDocker ã¯ä»®æ³ããªãã¸çµç±ã§ãã¹ãå´ã®ãããã¯ã¼ã¯ã¨ã³ã³ããå´ã®ãããã¯ã¼ã¯ãæ¥ç¶ãã¦ããã®ã§ãä»®æ³ããªãã¸(docker 0)ã®ãã¢ãã³NATï¼NATã«ã¼ãããã¯ï¼ãæå¹ã«ãããã¨ã§ããã¹ãå´ã¸NATãã¦ãããããã§ããï¼ãã®è¾ºããããæªããï¼
-A POSTROUTING -p tcp -s <container ipaddr>/28 -d <container ipaddr>/28 --dport <container port> -j MASQUERADE
ãã ãRHEL/CentOS 6.5ç°å¢ä¸ã§ /sys
以ä¸ã readonly
ã§ãã¦ã³ãããã¦ããã /sys/class/net/{ifname}/brport/hairpin_mode
ã«æ¸ãè¾¼ããªããããä»®æ³ããªãã¸ç°å¢ã§ãã¢ãã³NATã¢ã¼ããæå¹ã«ã§ããªãããã§ãã(RHEL/CentOS 6.5ç°å¢ã®ã¿ãã©ããã¯ã¡ããã¨èª¿ã¹ã¦ãªãã§ã)
ãã¢ãã³NAT ãµãã¼ãã䏿¦ããã¼ã¸ããã¦ãªãã¼ããããã®ããã®ããã§ãã
- Remove userland proxy by icecrime · Pull Request #9078 · moby/moby · GitHub
- Support hairpin NAT by phemmer · Pull Request #6810 · moby/moby · GitHub
- Update libcontainer to 84c1636580a356db88b079d118b94abe6a1a0acd by crosbymichael · Pull Request #9269 · moby/moby · GitHub
çºè¡¨ã¹ã©ã¤ã
ããã«è©³ããæ å ±ã¯ä¸è¨ã¹ã©ã¤ããåç §ãã¦ãã ããã
Keynote ãã¼ãã¯å¼ç¤¾ã®ãã¶ã¤ã @murata_s ãããä½ã£ããã¼ãã使ããã¦ããã£ã¦ãã¾ãã
é¢é£æ å ±
RedHatã® @enakai ããã®å¿ èªã®ã¹ã©ã¤ããã³ã³ããã¨VMMãDockerã®ãã¡ã¤ã«ã·ã¹ãã ããããã¯ã¼ã¯ã«ã¤ãã¦è©³ããæ¸ããã¦ãã¦é常ã«åèã«ãªãã¾ããã 26æç®ã®ãiptables ã§ã«ã¼ãããã¯ã¢ãã¬ã¹å®ã®ãã±ããã ãå¤ããã¦ããçç±ãããããªãã¨ããç¹ã«ã¤ãã¦ã®åçã¯åè¿°ã®ä»®æ³ããªãã¸ã§ã®ãã¢ãã³NATã®è©±ããªã¨æãã¾ãã
- Namespaces in operation, part 1: namespaces overview [LWN.net]
- https://guinan.ten-forward.ws/container-20131005.pdf
Linux Containers ã«ã¤ãã¦ã¯ãLWN ã®è¨äºã¨ @ten_forward ããã®è¨äºãåèã«ãªãã¨æãã¾ãã
Device mapper ã«ã¤ãã¦ã¯ãä¸è¨ã¹ã©ã¤ããåèã«ãªãã¾ããã
UNION Mount ã«ã¤ãã¦ã¯ãOreilly ã® Programmer's High ã®ããã°ãåèã«ãªãã¾ããã
ã¾ã¨ã
DockeråããWebã¢ããªã±ã¼ã·ã§ã³ã«ãããããã©ã¼ãã³ã¹ç ç©¶ã®ææã«ã¤ãã¦æ¸ãã¾ããã IBMã®ã¬ãã¼ãã®å 容ãããLinuxã«ã¼ãã«ã¨ã®æ¥ç¹ã¨ãªãUNION Filesystem ãããã®ä» Host NetworkingãVolume ãªã©ãããã©ã¼ãã³ã¹ã«ãããéè¦ãªè¦ç´ ã§ãããã¨ããããã¾ããããããããèªåã§æ¤è¨¼ãã¦ã¿ã¦ãISUCON4äºé¸åé¡ã®ç¯çã§ã¯ãiptables ã使ããã« docker-proxy ã¨ããã¦ã¼ã¶ã©ã³ãã®ãããã·ã®ä½¿ç¨ãåé¿ããããã°ããããã®ãã¿ã¼ã³ã§ãæ§è½ã®å¤åã¯ãªããã¨ãããã£ã¦ãã¾ããã
iptablesãåã£ã¦ãnf_conntrack ãåã£ã¦ãã¥ã¼ãã³ã°ãããããªç°å¢ã§ã¯ããããã¾ã¨ãã«Dockerã¯åãããªãã®ã§ãã®ãªã®ãªã¾ã§ãªã½ã¼ã¹ã使ãåããããªãã¹ãã®å ´åã¯ãããã«I/Oã¾ããã®ããã©ã¼ãã³ã¹ãåé¡ã¨ãªã£ã¦ããã¨æãã¾ãã Linuxã«ã¼ãã«ãç¹ã«UNION Filesystemå¨ãã§ããã©ã¼ãã³ã¹ã«é¢ããç¥è¦ãããã°ãã²æãã¦ããã ããã¨å©ããã¾ãã
ããã©ã¼ãã³ã¹ã®è¦³ç¹ãã Docker ãæ¯ããæè¡ã調æ»ãã¦ãã¦ã¾ããããã ãããæºè¶³ãã¾ããã1å¹´åDockerã触ã£ã¦ãã¦ãç¥è¦ãããªããã¾ã£ã¦ããã®ã§ãProduction ã§ Docker ãæå ¥ã§ããããªé åãã ã¨æã£ã¦ãã¾ãã
ä¼å ´ãæä¾ãã¦ããã ãã Recruit Technologies ã®çæ§ãã¤ãã³ããä¼ç»éå¶ãã¦ããã ããçæ§ãã©ãããããã¨ããããã¾ããã éå¸¸ã«ææç¾©ãªã¤ãã³ãã§ããã