Slide 1

Slide 1 text

Docker Meetup Tokyo #6 docker-compose patterns

Slide 2

Slide 2 text

@pottava தؙ ྑ 461*/'*OD $PNQMFUFE %PDLFS"ENJOJTUSBUJPOBOE0QFSBUJPOT "84$FSUJpFE 4" %FW0QT&OHJOFFS1SP

Slide 3

Slide 3 text

தؙ ྑ "VUPNBUFECVJME EPDLFSSVO

Slide 4

Slide 4 text

தؙ ྑ "VUPNBUFE CVJME

Slide 5

Slide 5 text

ձࣾʢ461*/'εϐϯϑʣͰ͸ %PDLFSΫϥελͰෳ਺λΠτϧຊ൪ӡ༻தʂ ։ൃ΋ςετ΋΋ͪΖΜ͢΂ͯ%PDLFS

Slide 6

Slide 6 text

+"846( ίϯςφࢧ෦ º $-* ઐ໳ࢧ෦ "NB[PO &$4 &$3 ϋϯζΦϯ Ր ʙ!/)/ςίϥεגࣜձࣾ͞Μ !KBXTVHDPOUBJOFS

Slide 7

Slide 7 text

patterns

Slide 8

Slide 8 text

͍ΖΜͳίϯςφͷ࢖͍ํ5JQTΛ EPDLFSDPNQPTFZNMͰ·ͱΊͯΈ·ͨ͠

Slide 9

Slide 9 text

ίϯςφͷ࢖͍ํΛ੔ཧ͢Δͱ͖ʹ Կ͔ͷ͓໾ʹཱͯ͹ͱɾɾ

Slide 10

Slide 10 text

·ͣ͸

Slide 11

Slide 11 text

docker

Slide 12

Slide 12 text

docker patterns [ جຊܗ ]

Slide 13

Slide 13 text

αʔϏε ίϯςφʔ* service containers ίϯςφͷ໾ׂΛ෼ྨ͢ΔͨΊͷศٓతͳ୯ޠͰ͢

Slide 14

Slide 14 text

αʔϏε ίϯςφʔ service containers ੈͷதͷେ൒͸͖ͬͱ͜Εɻ ֎෦͔ΒͷϦΫΤετʹԠ౴͢Δ͜ͱΛظ଴͞Ε͍ͯΔɻ ଟ͘ͷ৔߹ϙʔτ͸ύϒϦογϡ͞ΕɺՔಇ͠ଓ͚Δ͸ͣͷίϯςφɻ IPTUNBDIJOF NZTRM DPOUBJOFS NZTRM DPOUBJOFS NZTRM DPOUBJOFS FH.Z42- ZPVSDPNQVUFS .Z42-DMJFOU

Slide 15

Slide 15 text

// Nginx, Apache ͳͲͷ Web αʔό web: image: nginx ports: - "80:80" volumes: - "./content:/usr/share/nginx/html" // MySQL, PostgreSQL ͳͲͷ DB αʔό db: image: mysql:5.7 ports: - "3306:3306" volumes: - "./init-scripts:/docker-entrypoint-initdb.d" environment: - MYSQL_ROOT_PASSWORD - MYSQL_DATABASE - MYSQL_USER - MYSQL_PASSWORD // Redis, Memcached ͳͲͷΩϟογϡαʔό cache: image: redis ports: - "6379:6379" // ͳͲͳͲ..

Slide 16

Slide 16 text

w αʔϏεతʹศརͳىಈ࣌Φϓγϣϯ w SFTUBSUίϯςφʹ෮׆ͷຐ๏͕͔͔Δɻͨͩ͠ϦεΫ΋͋Δɾɾ w MPHESJWFSศརͳϩάυϥΠόʔ͕૿͑·ͨ͠ʂ w OFUEPDLFSDPNQPTFͱͷ૊Έ߹Θͤൈ܈ w ߟྀ͢΂͖ϙΠϯτ w όΠφϦʗιʔείʔυ͸SVOWʁ%PDLFSpMF"%% w ͪͳΈʹฐࣾ͸%PDLFSΒ͠͞Λੜ͔ͯ͠ w ։ൃத͸ιʔείʔυΛϚ΢ϯτ w ςετʗධՁʗຊ൪؀ڥ͸%PDLFSΠϝʔδʹࠝแ w σϓϩΠΛߟ͑Δͱɺ΍͸Γ%PDLFSJNBHF͸খ͘͢͞΂͖ w "MQJOF-JOVYਆʢ͚ͲNVTMMJCDɾɾʣ w ຊ֨తʹӡ༻͠Α͏ͱ͢Δͱͦͷଞࢮ͵΄Ͳ͍Ζ͍Ζ

Slide 17

Slide 17 text

δϣϒ ίϯςφʔ* job containers ίϯςφͷ໾ׂΛ෼ྨ͢ΔͨΊͷศٓతͳ୯ޠͰ͢

Slide 18

Slide 18 text

δϣϒ ίϯςφʔ job containers DSPOͷΑ͏ʹཪͰͦͦ͜͜ؤு͍ͬͯΔίϯςφɻ ։ൃɾӡ༻ͷݱ৔ʹ࣋ͪࠐΉͳΒ͜ͷ෼໺͔Β࢝ΊΔͱ͍͍͔΋͠Εͳ͍ɻ ఆ࣌όονॲཧɺ$*ςετɺʢϩάυϥΠόΛͳ͔ͥ࢖Θͳ͍ʣϩά؅ཧͳͲ IPTUNBDIJOF UPNDBU DPOUBJOFS NZTRM DPOUBJOFS qVFOUqVFOUE DPOUBJOFS FH'MVFOUEʢࠓͬΆ͘ͳ͍͚ͲϚ΢ϯτͨ͠ϩάϑΥϧμΛ؂ࢹʣ "NB[PO
 $MPVE8BUDI-PHT &MBTUJDTFBSDI

Slide 19

Slide 19 text

// ఆ࣌όονॲཧ batch: image: someones/cool-image:batch environment: - CRON="5 0 * * *" - MYSQL_DATABASE - MYSQL_USER - MYSQL_PASSWORD // CI ςετ test: image: someones/cool-image:test command: go test ./... volumes: - INTERVAL=1d - REPOSITORY=github.com/your/project working_dir: /go/src/github.com/your/project // ϩάసૹʢਂ෵ͳཧ༝ͰϑΥϫʔμʔͰ͸ͳ͍έʔεʣ fluentd: image: fluent/fluentd volumes: - "/path/to/dir:/fluentd/etc:ro" - "/var/log:/var/log/" environment: - FLUENTD_CONF=my.conf // ͳͲͳͲ..

Slide 20

Slide 20 text

w ΋͠όονॲཧʹႈ౳ੑ͕͋ΔͳΒɺίϯςφಋೖʹ͸΋͍ͬͯ͜ w ͦͷଞϙʔτΛެ։ͤͣɺҰ࣌తʹམͪͯ΋͍͍αʔϏε΋޲͍ͯΔ w ϗετͷϦιʔεΛޮՌతʹ࢖͏Α͏؆୯ʹεέʔϧͰ͖Δ w FH EPDLFSDPNQPTFTDBMFCBUDI

Slide 21

Slide 21 text

σʔλ ϘϦϡʔϜ ίϯςφʔ data volume containers

Slide 22

Slide 22 text

σʔλ ϘϦϡʔϜ ίϯςφʔ data volume containers γϯϓϧʹϗετͷσΟϨΫτϦΛϚ΢ϯτ͢Δͷͱ͸ҧ͍ɺ ؒʹઐ༻ͷίϯςφΛڬΉ͜ͱͰʜ ɾෳ਺ͷίϯςφ͔ΒϦΞϧλΠϜʹಉ͡ϑΝΠϧΛࢀরՄೳ ɾαʔϏείϯςφ͕ഁغ͞ΕͨޙͰ΋όοΫΞοϓ΍ϦετΞ͕؆୯ IPTUNBDIJOF NZTRM DPOUBJOFS EBUBWPMVNF DPOUBJOFS FH.Z42- WPMVNFTGSPN W WPMVNF IPTUpMFTZTUFN $ docker create --name data \ -v /var/lib/mysql busybox $ docker run -p 3306:3306 \ --volumes-from data mysql:5.7

Slide 23

Slide 23 text

version: "2" services: // Data volume container dvc: image: "busybox" volumes: - /var/lib/mysql // Data volume container Λ࢖ͬͨ MySQL db1: image: mysql:5.7 ports: - "3306:3306" volumes_from: - dvc // ϗετϚγϯ͔Β௚઀Ϛ΢ϯτ͍ͯ͠Δ MySQL db2: image: mysql:5.7 ports: - "3307:3306" volumes: - "mysql-data:/var/lib/mysql" volumes: mysql-data:

Slide 24

Slide 24 text

docker patterns [ ࢧԉܥ ]

Slide 25

Slide 25 text

αΠυΧʔύλʔϯ sidecar pattern

Slide 26

Slide 26 text

EBUBWPMVNF DPOUBJOFS αΠυΧʔ ύλʔϯ sidecar pattern ͢Ͱʹଘࡏ͢ΔྡͷίϯςφΛ֦ு͠ɺڧԽ͢ΔͨΊͷ΋ͷɻ ͜ΕͰΞϓϦέʔγϣϯଆ͸ࣗ෼ͷؔ৺ͷΈʹूதͰ͖Δ͠ɺ αΠυΧʔଆ΋ͲΜͳΞϓϦέʔγϣϯʹͰ΋࢖͍·ΘͤΔ෦඼ʹͳΕΔɻ IPTUNBDIJOF OPEFKTTMJN DPOUBJOFS FHϦϙδτϦͷߋ৽ TPNFHJUTZOD DPOUBJOFS WPMVNFTGSPN WPMVNFTGSPN

Slide 27

Slide 27 text

w EPDLFSDPO͓͢͢Ίಈը 5IFEJTUSJCVUFETZTUFNUPPMLJU$POUBJOFSQBUUFSOTGPSNPEVMBSEJTUSJCVUFETZTUFNEFTJHO 1SFTFOUFECZ#SFOEBO#VSOT 4PGUXBSF&OHJOFFS (PPHMF IUUQTZPVUVCF1IUK*U UNT

Slide 28

Slide 28 text

Ξϯόαμʔύλʔϯ ambassador pattern

Slide 29

Slide 29 text

Ξϯόαμʔ ύλʔϯ ambassador pattern αʔϏείϯςφͱಉ͡ωοτϫʔΫωʔϜεϖʔεʹ͋ΔίϯςφͰ Ͳ͔͜ผͷͱ͜ΖͰಈ͘αʔϏεͷϓϥϛϯάʢαʔϏεΛݟ͚ͭɺ ܨ͛ɺෛՙ෼ࢄʣΛͯ͘͠ΕΔͷ͕Ξϯόαμʔɻ εέʔϧ͢Δʹ͸ඞਢͷύλʔϯɻ IPTUNBDIJOF QIQ DPOUBJOFS [BQJFSUXFNQSPYZ DPOUBJOFS FHUXFNQSPYZ NFNDBDIFE NFNDBDIFE MPDBMIPTU

Slide 30

Slide 30 text

w SF*OWFOU͓͢͢Ίࢿྉ 'SPN-PDBM%PDLFS%FWFMPQNFOUUP1SPEVDUJPO%FQMPZNFOUz 1SFTFOUFECZ+ÉSÔNF1FUB[[POJ %PDLFS*OD IUUQXXXTMJEFTIBSFOFUSZPOBLBNBSVGSPNEFWUPQSPEBXTSFJOWFOU

Slide 31

Slide 31 text

Ξμϓλʔύλʔϯ adapter pattern

Slide 32

Slide 32 text

Ξμϓλʔ ύλʔϯ adapter pattern αʔϏείϯςφ΁ͷΠϯλʔϑΣΠεΛ౷Ұ͢ΔͨΊͷίϯςφɻ ͜ΕʹΑΓɺϞχλϦϯάͳͲ֎͔ΒͷϦΫΤετʹରͯ͠ αʔϏείϯςφͷத਎ʹΑΒͣɺಉ͡ΠϯλʔϑΣΠεͰԠ౴Ͱ͖Δɻ IPTUNBDIJOF SFEJTBMQJOF DPOUBJOFS GPPSFEJTFYQPSUFS DPOUBJOFS FH3FEJTFYQPSUFS NVOJO /BHJPT MPDBMIPTU

Slide 33

Slide 33 text

؂ࢹɾ؅ཧίϯςφʔ monitoring containers

Slide 34

Slide 34 text

؅ཧɾ؂ࢹ ίϯςφʔ monitoring containers %PDLFSίϯςφͷঢ়ଶΛ೺Ѳͨ͠ΓɺͦͷϝτϦΫεΛऩूͨ͠Γ ίϯςφ͕ಈ͘ϗετͷϝτϦΫεΛऩूͨ͠Γ͢Δίϯςφɻ %PDLFSͷιέοτΛίϯςφʹ౉͢΋ͷ΋ଟ͍ɻ IPTUNBDIJOF EKBOHP DPOUBJOFS QPTUHSFT DPOUBJOFS HPPHMFDBEWJTPS DPOUBJOFS FHD"EWJTPS *OqVY%# (SBGBOB

Slide 35

Slide 35 text

w %BUB%PH΍.BDLFSFMͳͲ΋ಉ͡࢓૊ΈͰΤʔδΣϯτ͕ ɹϝτϦΫεΛσʔλऩूαʔόʹૹ৴͍ͯ͠Δɻ w ͨͩϝτϦΫεΛ֎෦ʹૹ৴͢ΔλΠϓͱɺTXBSN΍&$4BHFOUͷ ɹΑ͏ʹͦͷϗετͷίϯςφΛ؅ཧ͢ΔλΠϓ͕͋Δɻ

Slide 36

Slide 36 text

docker patterns [ ςϯϙϥϦܥ ]

Slide 37

Slide 37 text

୯ൃίϚϯυύλʔϯ one-off commands pattern

Slide 38

Slide 38 text

୯ൃίϚϯυύλʔϯ one-off commands pattern ϗετʹΠϯετʔϧ͞Ε͍ͯͳ͍ϛυϧ΢ΣΞ΍$-*πʔϧΛ࢖ͬͯ ϗετ্ͷϑΝΠϧ΍֎෦ϦιʔεʹӨڹΛ༩͑Δίϯςφɻ ϗετΛΫϦʔϯʹอͯɺπʔϧͷෳ਺όʔδϣϯར༻΋༰қʹͳΔɻ ZPVSDPNQVUFSXJUIPVU+BWB FH(SBEMF WPMVNF CVJME $ docker create --name cache \ -v /root/.gradle/caches \ busybox $ docker run --rm \ -v `pwd`/app:/app \ --volumes-from cache \ pottava/gradle:2.9 \ build HSBEMFDPNNBOEDPOUBJOFS

Slide 39

Slide 39 text

# e.g. docker-compose run build idea: image: pottava/gradle:2.9 command: idea volumes: - "./app:/app" volumes_from: - caches idea-fix: image: busybox command: sed -i -e "s/\/root\/\.gradle\/caches/\.\.\/caches/g" /app/project.iml volumes: - "./app:/app" build: image: pottava/gradle:2.9 command: build volumes: - "./app:/app" volumes_from: - caches caches: image: busybox volumes: - "./caches:/root/.gradle/caches" clean: image: pottava/gradle:2.9 command: clean volumes: - "./app:/app"

Slide 40

Slide 40 text

w Α͘ݟΔͷ͸BMJBTʹઃఆͯ͠͠·͏ྫ ɹFH BMJBTBXTEPDLFSSVOSNW)0.&BXTSPPUBXTQPUUBWBBXTDMJ w 1*%ΦϓγϣϯʢEPDLFSSVOQJElIPTUʣΛ࢖͏ͱ ɹ͜Μͳ͜ͱ΋Ͱ͖ΔʂʢެࣜυΩϡϝϯτ΄΅ͦͷ··ɾɾʣ DBU&0'%PDLFSpMF '30.BMQJOF 36/BQLBEEOPDBDIFIUPQ $.% &0' EPDLFSCVJMEUNZIUPQ EPDLFSSVOJUSNQJEIPTUNZIUPQ w $PSF04ͳͲ%PDLFSલఏͷ04ͷ৔߹ɺ͜ͷύλʔϯ͸ͱͯ΋ศརɻ ɹπʔϧ͕%PDLFSJ[F͞Ε͍ͯΕ͹͢΂ͯίϯςφͰ׬݁Ͱ͖Δɻ

Slide 41

Slide 41 text

εΫϦϓτࢼߦࡨޡύλʔϯ shell scripts pattern

Slide 42

Slide 42 text

εΫϦϓτࢼߦࡨޡ ύλʔϯ shell scripts pattern ίϯςφ͸ͱʹ͔͘ىಈɾഁغ͕௒଎ɻDPNNJUͰঢ়ଶͷอଘ΍࠶։΋؆୯ɻ γΣϧεΫϦϓτΛτϥΠΞϯυΤϥʔͰࢼ͢؀ڥͱͯ͠࠷దʂ "OTJCMFͳͲߏ੒؅ཧεΫϦϓτΛ࡞ͬͨΓɺ%PDLFSpMFΛ࡞ͬͨΓɾɾ ZPVSDPNQVUFS DFOUPTDPOUBJOFS FH$FOU04 $ docker run -it centos:6 bash [root /]# yum install -y ruby [root /]# exit $ ID=`docker ps -alq` $ docker commit $ID mine/ruby $ docker run -it mine/ruby bash [root /]# ruby -v [root /]# .. NJOFSVCZDPOUBJOFS

Slide 43

Slide 43 text

docker patterns [ ಛघ ]

Slide 44

Slide 44 text

ωοτϫʔΫίϯςφʔ* networking containers ίϯςφͷ໾ׂΛ෼ྨ͢ΔͨΊͷศٓతͳ୯ޠͰ͢

Slide 45

Slide 45 text

ωοτϫʔΫ ίϯςφʔ networking containers ෳ਺ίϯςφͰωοτϫʔΫΠϯλʔϑΣΠεΛڞ༗͢ΔͨΊͷίϯςφɻ ωοτϫʔΫίϯςφʹܨ͕ͬͨίϯςφ͸͓ޓ͍MPDBMIPTUͰ௨৴͕Մೳɻ ϗετϚγϯͰϙʔτͷڝ߹͕ى͖ͳ͍ͷͰɺ։ൃத͸ศརͳ͜ͱ΋ɻ IPTUNBDIJOF OHJOY DPOUBJOFS OFUXPSLJOHDPOUBJOFS OHJOY DPOUBJOFS FH"QBDIF ZPVSDPNQVUFS #SPXTFS IUUQ IUUQ

Slide 46

Slide 46 text

EPDLFSฤ ͓ΘΓ

Slide 47

Slide 47 text

ͯ͞ɺ΍ͬͱ

Slide 48

Slide 48 text

docker-compose

Slide 49

Slide 49 text

docker-compose ?

Slide 50

Slide 50 text

খ͘͞෼ׂ͞ΕͨαʔϏεΛ·ͱΊͯ ΤϯυϢʔβʔʹҙຯͷ͋Δ୯ҐͰ αʔϏεΛఏڙ͢Δπʔϧ

Slide 51

Slide 51 text

খ͘͞෼ׂ͞ΕͨαʔϏεʁ

Slide 52

Slide 52 text

Modular Container Design

Slide 53

Slide 53 text

ɹେ͖ͳ՝୊Λখ͞ͳ՝୊ʹΘ͚͍ͯ͜͏ɻ ΑΓՄ༻ੑ͕ߴ͘εέʔϧ͢ΔΑ͏ʹ ؔ৺΋Ϧιʔε΋෼཭ͯ͠ ɹ֤ίϯςφʹಠཱͨ͠໌֬ͳڥքΛɻ ɹ࠷ऴతͳαʔϏε͸ͦΕΒΛ૊Έ߹Θͤͯʂ

Slide 54

Slide 54 text

ɹͲͪΒ͕ΑΓ๬·͍͠ઃܭʁ

Slide 55

Slide 55 text

$BTF" CJUOBNJXPSEQSFTT DPOUBJOFS $BTF# OHJOY DPOUBJOFS XPSEQSFTT DPOUBJOFS NBSJBEC DPOUBJOFS proxy: image: nginx ports: - "443:443" volumes: - “./nginx.conf:/etc/nginx/nginx.conf:ro“ links: - wp:upstream wp: image: wordpress links: - db:mysql db: image: mariadb:10.1 environment: MYSQL_ROOT_PASSWORD: foo wp: image: bitnami/wordpress ports: - "443:443"

Slide 56

Slide 56 text

$BTF" CJUOBNJXPSEQSFTT DPOUBJOFS ɾγϯϓϧͰ࢖͍΍ͦ͢͏ ɾ֤Ϟδϡʔϧ୯ҐͰ؅ཧ͠΍͍͢ ɾOHJOY͚ͩόʔδϣϯΞοϓʗઃఆมߋ ɾXPSEQSFTT͚ͩεέʔϧ ɾNBSJBECΛNZTRMʹஔ͖׵͑ ɾؔ৺͕෼཭͞Ε͍ͯΔ ɾIUUQ ੩తϑΝΠϧΩϟογϡOHJOY ɾCBDLVQSFTUPSFNBSJBEC ɾʢ͜ͷྫ͸ඍົ͚ͩͲʣՄ༻ੑΛߴΊΒΕΔ ɾ%#͕ࢮΜͰ΋ιʔϦʔϖʔδ͸ͩͤΔ $BTF# OHJOY DPOUBJOFS XPSEQSFTT DPOUBJOFS NBSJBEC DPOUBJOFS

Slide 57

Slide 57 text

ద੾ͳϞδϡʔϧʹ෼ׂ͞Ε͍ͯΕ͹ αʔϏεશମ͕҆ఆͯ͠εέʔϧ΋͢Δ

Slide 58

Slide 58 text

αʔϏεͷ෦෼తͳΞοϓσʔτ΋Ͱ͖Δ͠ όάϑΟοΫε͸ͦͷϞδϡʔϧΛ࢖͏ ͋ΒΏΔαʔϏεʹ͙͢ద༻Ͱ͖Δ ʮमਖ਼ͷԣల։ʯ͸ى͖ͳ͍

Slide 59

Slide 59 text

ʢϚΠΫϩαʔϏεಛ༗ͷɺ৽͍͠՝୊Λ ผ్ղܾ͢Δඞཁ͸͋Δ͚Ͳʣ

Slide 60

Slide 60 text

ʢಛʹ։ൃ؀ڥͳΒʣ EPDLFSDPNQPTFΛ࢖͑͹ Ϟδϡʔϧͳߏ੒΋؅ཧ͠΍͍͢Αʁ

Slide 61

Slide 61 text

docker-compose patterns [ جຊܗɾςϯϙϥϦܥ ]

Slide 62

Slide 62 text

EPDLFSฤʹ͋ΔEPDLFSDPNQPTFZNM ͦΕ͕͢΂ͯͳͷͰׂѪ͠·͢

Slide 63

Slide 63 text

docker-compose patterns [ Networking ]

Slide 64

Slide 64 text

Ұ൪ޠΓ͔ͨͬͨͷ͜͜ͳΜͰ͕͢ ർΕͨͷͰ·ͨͷػձʹৡΓ·͢

Slide 65

Slide 65 text

EPDLFSDPNQPTFQBUUFSO

Slide 66

Slide 66 text

Appendix

Slide 67

Slide 67 text

![FNCVUTV͞Μ

Slide 68

Slide 68 text

PS[ˡࢲʢલဠϑΝϯʣ

Slide 69

Slide 69 text

Θͨ͠ͷ-5ͷഒ༗ҙٛͳͷͰ ͜Ε͚ͩԱ͑ͯؼ͍ͬͯͩ͘͞

Slide 70

Slide 70 text

ίϯςφٕज़ͱීٴ͕γεςϜɾΠϯςάϨʔλʹ༩͑ΔӨڹz 1SFTFOUFECZ.BTBIJUP;FNCVUTV 5FDIOPMPHZ&WBOHFMJTU IUUQXXXTMJEFTIBSFOFU[FNCVUTVEPDLFSJNQBDUUPTZTUFNJOUFHSBUJPOT NEW!!