Slide 1

Slide 1 text

Docker Hands-on

Slide 2

Slide 2 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ

Slide 3

Slide 3 text

໨త Ͱ͖ΔΑ͏ʹͳΔ͜ͱ • ίϯςφΛԾ૝Ϛγϯʹ୅ΘΔखܰͳ։ൃ؀ڥͱͯ͠࢖͑ΔΑ͏ʹͳΔ • ෳ਺ͷίϯςφ͕ڠௐͯ͠ಈ࡞͢Δ؀ڥΛ্ཱͪ͛ΒΕΔΑ͏ʹͳΔ ѻΘͳ͍͜ͱ • Docker ͷ಺෦ͷ࢓૊Έ • Docker ͷຊ൪؀ڥͰͷར༻ ※Ұ෦આ໌Λলུɾ؆ུ͍ͯ͠Δͱ͜Ζ΋͋Δ

Slide 4

Slide 4 text

εϥΠυͷίϚϯυ ࣮ࡍʹೖྗͯ͠΋Β͏෦෼͸ $ ·ͨ͸ # ͔Β࢝·Δ $ ... // ϗετͰ࣮ߦ͢ΔίϚϯυ # ... // ίϯςφ಺෦Ͱ࣮ߦ͢ΔίϚϯυ ಛʹॏཁͳ෦෼͸ଠࣈʹ͍ͯ͠Δ $ ... # ...

Slide 5

Slide 5 text

Part 1. Docker ͷجૅ

Slide 6

Slide 6 text

Agenda • Part 1. Docker ͷجૅ • ίϯςφͷىಈɾఀࢭɾഁغ • ίϯςφͷ༷ʑͳىಈΦϓγϣϯ • ࣮ߦதͷίϯςφʹର͢Δૢ࡞ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ

Slide 7

Slide 7 text

༻ޠ • ίϯςφ • ϓϩηεͱͦͷ࣮ߦ؀ڥ ʢfilesystem, network, etc.ʣ ΛΧϓηϧԽͨ͠΋ͷ • ϝΠϯϓϩηε • ίϯςφͷத֩ͱͳΔ୯Ұͷϓϩηε • Πϝʔδ • ίϯςφΛΞʔΧΠϒ͠ɺσʔλͱͯ͠΍ΓͱΓͰ͖ΔΑ͏ʹͨ͠΋ͷ • ϗετ • ίϯςφΛಈ͔ͨ͢ΊͷϚγϯʢ֤ࣗͷ Mac ౳ʣ

Slide 8

Slide 8 text

Πϝʔδͷμ΢ϯϩʔυ ΠϝʔδΛऔಘ͢Δํ๏͸̎ͭ 1. Web͔Βμ΢ϯϩʔυ͢Δ ← ·ͣ͸ͪ͜Β͔Β 2. ࣗ෼Ͱ࡞Δ ← ͋ͱͰղઆ ҎԼͷίϚϯυͰUbuntuͷΠϝʔδΛμ΢ϯϩʔυͰ͖Δ $ docker image pull ubuntu ͜ͷ͋ͱ࢖͏ଞͷΠϝʔδ΋μ΢ϯϩʔυ͓ͯ͘͠ $ docker image pull nginx $ docker image pull python

Slide 9

Slide 9 text

ίϯςφͷىಈ ࣍ͷίϚϯυͰίϯςφΛىಈͰ͖Δ docker container run ઌఔ pull ͨ͠ ubuntu Πϝʔδ͔ΒίϯςφΛىಈͯ͠ΈΔ $ docker container run ubuntu echo hello command Ͱىಈͨ͠ϓϩηεʢ͜ͷ৔߹͸ echo hello ʣ͕ϝΠϯϓϩηε ϝΠϯϓϩηεͷੜࢮ = ίϯςφͷىಈɾఀࢭ ͜ͷ৔߹ echo hello ͸͙͢ऴྃ͢ΔͷͰɺίϯςφ͸͙͢ఀࢭ͢Δ

Slide 10

Slide 10 text

ىಈதίϯςφͷҰཡ ࠓ౓͸ sleep ίϚϯυΛϝΠϯϓϩηεͱͯ͠ίϯςφΛىಈͯ͠ΈΔ $ docker container run ubuntu sleep infinity ͜ͷϓϩηε͸ࣗಈͰ͸ऴྃ͠ͳ͍ ଞͷλʔϛφϧͰԼهΛ࣮ߦ͢Δͱɺίϯςφ͕࣮ߦதͰ͋Δ͜ͱ͕Θ͔Δ $ docker container list CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 944883bf35c7 ubuntu "sleep infinity" 3 seconds ago Up 8 seconds nervous_kowalevski

Slide 11

Slide 11 text

ίϯςφͷఀࢭ IDΛࢦఆͯ͠ઌఔىಈͨ͠ίϯςφΛఀࢭ͢Δ $ docker container stop ࠓ౓͸ҰཡʹԿ΋දࣔ͞Εͳͳ͍ $ docker container list ίϯςφ͸ఀࢭ͕ͨ͠ɺ·ͩഁغ͞Ε͍ͯͳ͍ͷͰ --all Λ͚ͭΔͱݟΕΔ $ docker container list --all STATUS ͕ Exited... ͱͳ͍ͬͯΔ͸ͣ

Slide 12

Slide 12 text

ίϯςφͷ࠶ىಈ IDΛࢦఆͯ͠ઌఔఀࢭͨ͠ίϯςφΛ࠶ىಈ͢Δ $ docker container start ίϯςφ͕࠶ىಈ͞Ε͍ͯΔ͜ͱΛ֬ೝ $ docker container list ※ϝΠϯϓϩηε͸࠷ॳʹࢦఆͨ͠΋ͷ͔Βม͑ΒΕͳ͍ ΋͏Ұ౓ίϯςφΛఀࢭ͓ͯ͘͠ $ docker container stop

Slide 13

Slide 13 text

ίϯςφͷഁغ IDΛࢦఆͯ͠ઌఔఀࢭͨ͠ίϯςφΛഁغ͢Δ $ docker container rm ഁغͨ͠ͷͰ --all Λ͚ͭͯ΋ίϯςφ͸ͳ͍ $ docker container list --all ࠶ىಈ΋Ͱ͖ͳ͍ $ docker start # Τϥʔ

Slide 14

Slide 14 text

͜͜·Ͱͷ͓͞Β͍ docker image pull ΠϝʔδΛμ΢ϯϩʔυ docker container run ίϯςφΛىಈ docker container stop|start|rm ίϯςφΛఀࢭ|࠶ىಈ|ഁغ docker container list ίϯςφͷҰཡΛදࣔ ※ࠓճ͸ϑϧίϚϯυΛ༻͍͕ͨɺී௨͸γϣʔτΧοτίϚϯυΛ༻͍Δ docker image pull => docker pull docker container run|stop|start|rm => docker run|stop|start|rm docker container list => docker ps // !!

Slide 15

Slide 15 text

Agenda • Part 1. Docker ͷجૅ • ίϯςφͷىಈɾఀࢭɾഁغ • ίϯςφͷ༷ʑͳىಈΦϓγϣϯ • ࣮ߦதͷίϯςφʹର͢Δૢ࡞ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ

Slide 16

Slide 16 text

--rm : ఀࢭ࣌ʹଈίϯςφΛഁغ ௨ৗ͸ίϯςφ͕ఀࢭͯ͠΋ഁغ͞ΕΔΘ͚Ͱ͸ͳ͍ $ docker run ubuntu echo hello $ docker ps --all // ఀࢭதͷίϯςφ͕ݟ͑Δ ࠶ར༻͠ͳ͍Α͏ͳίϯςφ͸ɺఀࢭޙଈഁغ͢Δ͜ͱ͕Ͱ͖Δ $ docker run --rm ubuntu echo hello $ docker ps --all // ίϯςφ͸ഁغ͞ΕͨͷͰଘࡏ͠ͳ͍

Slide 17

Slide 17 text

--detach : όοΫάϥ΢ϯυͰىಈ ҎԼͷΑ͏ʹىಈ͢Δͱ docker ίϚϯυࣗମ͸͙͢ऴྃ͢Δ $ docker run --detach ubuntu sleep infinity ͔͠͠ίϯςφ͸όοΫάϥ΢ϯυͰಈ͍͍ͯΔ $ docker ps // όοΫάϥ΢ϯυͰ࣮ߦதͷίϯςφ͕ݟ͑Δ όοΫάϥ΢ϯυ࣮ߦதͷίϯςφ͸ऴྃ͢ΔͷΛ๨Εͳ͍Α͏ʹ $ docker stop

Slide 18

Slide 18 text

--interactive --tty : ΩʔϘʔυೖྗΛ༗ޮԽ ҎԼͷΑ͏ʹ͢Δͱɾɾɾ $ docker run --interactive --tty ubuntu bash ϓϩϯϓτ͕දࣔ͞ΕɺΩʔϘʔυೖྗΛड͚෇͚Δී௨ͷγΣϧͱͯ͠ಈ࡞ # echo hello // => hello exit ͢ΔͱγΣϧʢίϯςφͷϝΠϯϓϩηεʣ͕ऴྃͯ͠ίϯςφ΋ఀࢭ # exit

Slide 19

Slide 19 text

--interactive --tty : ΩʔϘʔυೖྗΛ༗ޮԽ ͜ΕΛԠ༻͢Ε͹PythonͳͲͷREPLΛίϯςφ಺Ͱىಈͨ͠Γ΋Ͱ͖Δ $ docker run --interactive --tty python python ͦΕͧΕͷΦϓγϣϯͷҙຯ • --interactive : ίϯςφͷඪ४ೖྗΛ։͍͓ͯ͘ • --tty : ίϯςφͷඪ४ೖྗʹλʔϛφϧʢΩʔϘʔυೖྗʣΛ઀ଓ͢Δ ͜ͷ̎ͭͷΦϓγϣϯΛলུͯ͠ -it ͱࢦఆ͢Δ͜ͱ͕ଟ͍ $ docker run -it ubuntu bash

Slide 20

Slide 20 text

--env : ؀ڥม਺Λઃఆ ίϯςφ಺Ͱࢀর͢Δ؀ڥม਺Λઃఆ $ docker run -it --env HOGE=fuga ubuntu bash # echo $HOGE // => fuga ϑΝΠϧ͔ΒಡΈࠐΉ͜ͱ΋Մೳ $ docker run -it --env-file vars.env ubuntu bash vars.env ͷྫ : HOGE=fuga PIYO=poyo

Slide 21

Slide 21 text

--volume : ϗετͱίϯςφͷσΟϨΫτϦΛಉظ ·ͣ͸ϗετʹద౰ͳσΟϨΫτϦͱϑΝΠϧΛ࡞੒ $ mkdir data && echo hello > data/hello.txt ࡞੒ͨ͠σΟϨΫτϦΛίϯςφ಺ͷσΟϨΫτϦͱಉظ͢Δ $ docker run -it --volume $PWD/data:/tmp/data ubuntu bash ίϯςφͷதͰಉظͨ͠ϑΝΠϧΛಡΈॻ͖Ͱ͖Δ # ls /tmp/data // => hello.txt ͕ݟ͑Δ # echo bye > /tmp/data/hello.txt // => hello.txt ʹॻ͖ࠐΊΓ

Slide 22

Slide 22 text

--publish : ϗετͷϙʔτΛίϯςφʹ઀ଓ ҎԼΛ࣮ߦͯ͠ϒϥ΢βͰ http://localhost:8080/ ʹΞΫηε͢Δͱɾɾɾ $ docker run --publish 8080:80 nginx nginx -g 'daemon off;' Welcome to nginx! λʔϛφϧʹ໭Δͱඪ४ग़ྗʹϩά͕ग़͍ͯΔ 172.17.0.1 - - [03/Apr/2018:11:23:37 +0000] "GET / ..." ... MySQL΍Rails΋ಉ͡Α͏ʹϙʔτΛ઀ଓͯ͠ىಈͰ͖Δ

Slide 23

Slide 23 text

σϑΥϧτίϚϯυΛ࣮ߦ ௨ৗ͸ docker run ͱͯ͠ίϚϯυΛ࣮ߦ͢Δ $ docker run -it python python ͜ͷ Λলུ͢ΔͱΠϝʔδͷσϑΥϧτίϚϯυ͕࣮ߦ͞ΕΔ $ docker run -it python // PythonͷREPL͕ىಈ Πϝʔδʹ͸͍͍ͨͯԿΒ͔ͷσϑΥϧτίϚϯυ͕ઃఆ͞Ε͍ͯΔ $ docker run -it ubuntu // => bash ͕ىಈ $ docker run --publish 8080:80 nginx // => nginx ͕ىಈ

Slide 24

Slide 24 text

͜͜·Ͱͷ͓͞Β͍ • docker run ͷΦϓγϣϯͰίϯςφͷىಈํ๏Λม͑ΒΕΔ • docker run ͰσϑΥϧτίϚϯυΛ࣮ߦͰ͖Δ ओཁͳΦϓγϣϯʹ͸লུܗ͕༻ҙ͞Ε͍ͯΔ ( docker run --help Ͱ֬ೝͰ͖Δ) --detach => -d --env => -e --interactive => -i --volume => -v --tty => -t --publish => -p

Slide 25

Slide 25 text

Agenda • Part 1. Docker ͷجૅ • ίϯςφͷىಈɾఀࢭɾഁغ • ίϯςφͷ༷ʑͳىಈΦϓγϣϯ • ࣮ߦதͷίϯςφʹର͢Δૢ࡞ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ

Slide 26

Slide 26 text

࣮ߦதͷίϯςφ಺ͰผͷίϚϯυΛ࣮ߦ ίϯςφΛόοΫάϥ΢ϯυͰىಈ $ docker run -d ubuntu sleep infinity ϗετ͔Β͜ͷίϯςφͷதʹ৽͘͠ผͷίϚϯυΛ࣮ߦͰ͖Δ $ docker container exec ps PID TTY TIME CMD 1 ? 00:00:00 sleep 5 ? 00:00:00 ps

Slide 27

Slide 27 text

ϗετͱίϯςφͷؒͰϑΝΠϧΛίϐʔ ίϯςφΛىಈ $ docker run -it ubuntu ϗετͰద౰ʹϑΝΠϧΛ࡞੒͠ɺίϯςφͷதʹίϐʔ $ echo hello > test.txt $ docker container cp test.txt :/tmp ίϯςφͷதͰϑΝΠϧΛ֬ೝͯ͠ΈΔ # ls /tmp // => test.txt ͕͋Δ͸ͣ

Slide 28

Slide 28 text

ϝΠϯϓϩηεͷग़ྗΛऔಘ ίϯςφΛόοΫάϥ΢ϯυͰىಈ $ docker run -d -p 8080:80 nginx ϒϥ΢βͰ http://localhost:8080/ ʹΞΫηεͯ͠ϩάΛ࢒͢ ίϯςφͷඪ४ग़ྗɾඪ४Τϥʔग़ྗʹه࿥͞ΕͨϩάΛ֬ೝ $ docker container logs 172.17.0.1 - - [03/Apr/2018:11:23:37 +0000] "GET / ..." ...

Slide 29

Slide 29 text

͓͞Β͍ docker container exec ίϯςφ಺ͰผίϚϯυΛ࣮ߦ docker container cp ίϯςφͱϗετͷؒͰϑΝΠϧΛίϐʔ docker container logs ϝΠϯϓϩηεͷग़ྗΛऔಘ ΋ͪΖΜγϣʔτΧοτίϚϯυ΋࢖͑Δ docker container exec => docker exec docker container cp => docker cp docker container logs => docker logs

Slide 30

Slide 30 text

Part 1. ͸͜͜·Ͱ ىಈͨ͠··ͷίϯςφ͕͋Δͱࢥ͏ͷͰࣗ෼Ͱఀࢭ͍ͯͩ͘͠͞ ํ๏͸͜Ε·ͰͷεϥΠυΛࢀߟʹɾɾɾ Ұ௨Γఀࢭͨ͠ΒԼهίϚϯυͰఀࢭࡁΈίϯςφΛҰׅഁغͰ͖·͢ $ docker container prune

Slide 31

Slide 31 text

Part 2. Dockerfile ͷجૅ

Slide 32

Slide 32 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • ΠϝʔδͷϏϧυ • ओͳ໋ྩ • Dockerfile ͷϙΠϯτ • Part 3. Docker Compose ͷجૅ

Slide 33

Slide 33 text

༻ޠ • Ϗϧυίϯςφ • ϏϧυதʹҰ࣌తʹ࡞੒͞ΕΔίϯςφ • ϏϧυσΟϨΫτϦ • ϗετͰΠϝʔδͷϏϧυ࡞ۀΛߦ͏σΟϨΫτϦ (Dockerfile ͳͲΛஔ͘) • ϫʔΩϯάσΟϨΫτϦ • Ϗϧυίϯςφ಺ͷΧϨϯτσΟϨΫτϦ • ϏϧυΩϟογϡ • Ϗϧυ్தͰΠϝʔδͷ಺༰ΛΩϟογϡͨ͠΋ͷ

Slide 34

Slide 34 text

Πϝʔδͷऔಘํ๏ ΠϝʔδΛऔಘ͢Δํ๏͸̎ͭ 1. Web͔Βμ΢ϯϩʔυ͢Δ ← Part 1. Ͱ঺հ 2. ࣗ෼Ͱ࡞Δ ← ࠓ౓͸ͪ͜Β ࣗ෼Ͱ࡞Δ৔߹Ͱ΋ɺී௨͸طଘͷΠϝʔδΛϕʔεʹΧελϚΠζ͢Δ ͜Ε͔Β࢖͏αϯϓϧΛμ΢ϯϩʔυ͓ͯ͘͠ $ git clone [email protected]:yubessy/docker-handson-example.git $ cd docker-handson-example

Slide 35

Slide 35 text

Dockerfile Πϝʔδͷ࡞੒खॱΛهड़͢ΔϑΝΠϧʢݟͨ͜ͱ͕͋Δ͸ͣʣ FROM python:3.6 RUN groupadd appgroup && \ useradd --system --group appgroup appuser && \ mkdir /opt/myapp && \ chgrp -R appgroup /opt/myapp && \ chown -R appuser /opt/myapp && \ pip install flask COPY --chown=appuser:appgroup main.py /opt/myapp/main.py USER appuser WORKDIR /opt/myapp CMD ["python", "main.py"]

Slide 36

Slide 36 text

ΠϝʔδͷϏϧυ ҎԼͷίϚϯυͰ Dockerfile ͔ΒΠϝʔδΛϏϧυͰ͖Δ $ docker image build --tag myapp:v0.0.1 . --tag :: Ϗϧυͨ͠Πϝʔδʹ໊લͱλάΛ෇༩] .: ϏϧυσΟϨΫτϦͷύε ίϚϯυͱΦϓγϣϯ͸লུՄೳ $ docker build -t myapp:v0.0.1 .

Slide 37

Slide 37 text

Ϗϧυͨ͠Πϝʔδͷར༻ Ϗϧυͨ͠Πϝʔδ͸ී௨ͷΠϝʔδͱಉ͡Α͏ʹ࢖͑Δ $ docker run -p 8080:8080 myapp:v0.0.1 ϒϥ΢βͰ http://localhost:8080/ ʹΞΫηεͯ͠ΈΔ main.py ͷίʔυ΋ݟ͓ͯ͘͜ͱ

Slide 38

Slide 38 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • ΠϝʔδͷϏϧυ • Dockerfile ͷओͳ໋ྩ • Dockerfile ͷϙΠϯτ • Part 3. Docker Compose ͷجૅ

Slide 39

Slide 39 text

FROM : ϕʔεΠϝʔδΛࢦఆ ϕʔεʹ͢ΔΠϝʔδΛࢦఆ ྫ: Python 3.6 ੡ΞϓϦέʔγϣϯͳΒ FROM python3.6 ݪଇͱͯ͠ Dockerfile ͸ FROM Ͱॻ͖࢝Ίͳ͚Ε͹ͳΒͳ͍

Slide 40

Slide 40 text

RUN : ίϚϯυΛ࣮ߦ ͜ΕΛ࢖ͬͯϕʔεΠϝʔδΛΧελϚΠζ͍ͯ͘͠ && ΍ || ͳͲɺγΣϧεΫϦϓτͱಉ͡ه๏͕࢖͑Δ ྫ: apt-get Ͱ mysqlclient ΛΠϯετʔϧ RUN apt-get update && \ apt-get install -y mysqlclient ໋ྩ్தͷվߦ͸ \ Ͱ

Slide 41

Slide 41 text

COPY : ϑΝΠϧΛΠϝʔδʹؚΊΔ ϏϧυσΟϨΫτϦҎԼͷ೚ҙͷϑΝΠϧΛΠϝʔδʹؚΊΔ COPY example.txt /tmp/example.txt . ΍ * ͷΑ͏ͳύλʔϯ΋࢖͑Δ COPY . . --chown ͰϑΝΠϧͷΦʔφʔΛมߋ͢Δ͜ͱ΋Ͱ͖Δ COPY --chown=appuser:appgroup main.py /opt/myapp/main.py

Slide 42

Slide 42 text

USER , WORKDIR : Ϣʔβ΍σΟϨΫτϦΛ੾Γସ͑ ίϯςφ಺ͷ࣮ߦϢʔβ΍ϫʔΩϯάσΟϨΫτϦΛ੾Γସ͑Δ RUN echo `whoami`:`pwd` # root:/ USER appuser WORKDIR /tmp RUN echo `whoami`:`pwd` # appuser:/tmp RUN ͚ͩͰͳ͘ COPY ΍ CMD ͷ࣮ߦϢʔβ΋มΘΔ Ϗϧυதʹ RUN Ͱ cd ΍ su ͸࢖͑ͳ͍͜ͱʹ஫ҙʂ

Slide 43

Slide 43 text

CMD : σϑΥϧτίϚϯυΛઃఆ docker run Ͱ࣮ߦ͞ΕΔίϚϯυΛࢦఆ ["cmd", "arg1", "arg2"] ͷΑ͏ͳه๏Λਪ঑ FROM ubuntu:latest # ௨ৗ͸ bash ͕ىಈ͢Δ͕ɺͦΕΛ্ॻ͖Ͱ͖Δ CMD ["echo", "hello"]

Slide 44

Slide 44 text

ͦͷଞ ্ʹڍ͛ͨ΋ͷ͸Α͘࢖͏Ұ෦ͷ໋ྩͷΈͰɺଞʹ΋༷ʑͳ໋ྩ͕͋Δ • ARG • ENTRYPOINT ৄ͘͠͸ެࣜυΩϡϝϯτΛࢀর

Slide 45

Slide 45 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • ΠϝʔδͷϏϧυ • Dockerfile ͷओͳ໋ྩ • Dockerfile ͷϙΠϯτ • Part 3. Docker Compose ͷجૅ

Slide 46

Slide 46 text

։ൃதʹมߋ͞Ε΍໋͍͢ྩΛޙʹॻ͘ ໋ྩΛ࣮̍ͭߦ͢ΔຖʹϏϧυΩϟογϡ͕ੜ੒͞Ε͍ͯΔ ͜ΕʹΑΓ໋ྩͷ࣮ߦ݁Ռ͕มΘΒͳ͍৔߹ʹ̎ճ໨Ҏ߱ͷϏϧυ͕଎͘ͳΔ → ։ൃதʹมߋ͞Ε΍໋͍͢ྩ΄Ͳޙʹॻ͍ͨ΄͏͕Ϗϧυ͕଎͘ͳΔ # main.py Λฤू͢Δͱͯ͠Ωϟογϡ1͔ΒϏϧυ͞ΕΔ FROM python:3.6 RUN pip install # => Ωϟογϡ1 COPY main.py /opt/myapp/main.py # => Ωϟογϡ2

Slide 47

Slide 47 text

ͻͱͭͷ RUN ΍ COPY ʹෳ਺ίϚϯυΛ·ͱΊΔ ໋ྩΛ࣮̍ͭߦ͢ΔຖʹϏϧυΩϟογϡ͕ੜ੒͞Ε͍ͯΔ → ໋ྩΛࡉ͔͘෼͚ΔͱແବʹϏϧυΩϟογϡ͕ੜ੒͞ΕΔ → Ϗϧυ͕஗͘ͳΔɾσΟεΫΛѹഭ͢Δ # ྑ͘ͳ͍ྫ RUN groupadd appgroup RUN useradd --system --group appgroup appuser RUN mkdir /opt/myapp RUN chgrp -R appgroup /opt/myapp RUN chown -R appuser /opt/myapp

Slide 48

Slide 48 text

ඞཁͳϑΝΠϧ͚ͩΛ COPY ͢Δ COPY . . ͳͲͰෳ਺ͷϑΝΠϧΛ·ͱΊͯίϐʔ͢Δͱ͖͸ ҎԼͷΑ͏ͳίϐʔ͢Δͱ໰୊͕͋ΔϑΝΠϧʹؾΛ͚ͭΔ • log/ : ։ൃதʹੜ੒͞Εͨͨ͘͞Μͷϩά • .env : DBύεϫʔυͳͲ͕ॻ͔Εͨ؀ڥઃఆ ͜ΕΒΛΠϝʔδʹؚΊͳ͍Α͏ .dockerignore Λॻ͍͓ͯ͘ log/ .env

Slide 49

Slide 49 text

ΞϓϦέʔγϣϯ࣮ߦ༻ͷϢʔβΛ༻ҙ͢Δ ྫͰ͸ΞϓϦέʔγϣϯ࣮ߦઐ༻ͷϢʔβΛΘ͟Θ͟࡞͍ͬͯͨ FROM python:3.6 RUN groupadd appgroup && \ useradd --system --group appgroup appuser # ... USER appuser ͜Ε͕ͳ͍ͱ root Ͱϓϩηε͕࣮ߦ͞Ε༧ظͤ͵໰୊͕ൃੜ͢Δ͜ͱ΋

Slide 50

Slide 50 text

Part 2. ͸͜͜·Ͱ ਎ۙͳ Dockerfile ΛಡΜͰɺதͰͲΜͳॲཧΛߦ͍ͬͯΔ͔ݟͯΈ͍ͯͩ͘͞

Slide 51

Slide 51 text

Part 3. Docker Compose ͷجૅ

Slide 52

Slide 52 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ • Docker Compose ͱ͸ • αʔϏεͱωοτϫʔΫ • Docker Compose ͷϕετϓϥΫςΟε

Slide 53

Slide 53 text

Docker Compose ͱ͸ લճ·Ͱ: • Part 1: ୯Ұͷίϯςφͷૢ࡞ • Part 2: Πϝʔδͷ࡞੒ ࠓճ: • Part 3: ෳ਺ͷίϯςφͷૢ࡞

Slide 54

Slide 54 text

ෳ਺ͷίϯςφΛѻ͏ཧ༝ ෳ਺ͷίϯςφΛૢ࡞Ͱ͖ΔͱԿ͕خ͍͠ 1. ͻͱͭͣͭ docker run ͱ͔ͤͣʹҰ౓ʹىಈͰ͖Δ • ྫ: APίϯςͱDBίϯςφΛҰ౓ʹىಈ 2. ίϯςφಉ͕࢜ωοτϫʔΫΛհͯ͠௨৴Ͱ͖Δ • ྫ: APίϯςφ͕DBίϯςφʹΫΤϦΛൃߦ

Slide 55

Slide 55 text

docker-compose.yml ͷجຊ docker-compose.yml ʹෳ਺ͷίϯςφΛ·ͱΊͯఆٛ͢Δ version: '3' # ϑΝΠϧϑΥʔϚοτͷόʔδϣϯ services: app: build: ./app ports: - 3000:3000 depends_on: - db # ίϯςφͷىಈॱΛDBίϯςφΑΓޙʹ͢Δ db: image: mysql environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'yes'

Slide 56

Slide 56 text

docker-compose ίϚϯυͷجຊ docker-compose.yml ͷఆٛΛݩʹίϯςφ΍ΠϝʔδΛૢ࡞͢Δ • docker-compose up: ίϯςφΛ·ͱΊͯىಈ • docker-compose down: ίϯςφΛ·ͱΊͯऴྃɾ࡟আ • docker-compose run: ಛఆͷίϯςφΛ୯ҰͰىಈ • docker-compose exec: ىಈதͷίϯςφ಺ͰίϚϯυΛ࣮ߦ • docker-compose pull: ΠϝʔδΛ·ͱΊͯऔಘ • docker-compose build: ΠϝʔδΛ·ͱΊͯϏϧυ ଞʹ΋ͨ͘͞Μ͋ΔͷͰ docker-compose --help Ͱ֬ೝ͓ͯ͘͠

Slide 57

Slide 57 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ • Docker Compose ͱ͸ • αʔϏεͱωοτϫʔΫ • Docker Compose ͷϕετϓϥΫςΟε

Slide 58

Slide 58 text

αʔϏεͱ͸ docker-compose.yml ͷ service = ಉҰͷઃఆ͔Β࡞੒͞ΕΔ̍ͭҎ্ͷίϯςφͷू߹ ※։ൃ؀ڥͰ࢖͏৔߹͸͍͍ͨͯ̍αʔϏε̍ίϯςφ version: '3' # όʔδϣϯ services: app: # αʔϏε໊ # ҎԼΠϝʔδɾίϯςφͷઃఆ build: ./app ports: ...

Slide 59

Slide 59 text

αʔϏεͷओͳઃఆ docker build|run|pull ͳͲͷίϚϯυͷҾ਺ͱରԠ͢Δ΋ͷ build: # docker build <- path image: # docker pull|run <- image command: # docker run <- command environment: # docker run --env env_file: # docker run --env-file ports: # docker run --publish volumes: # docker run --volume stdin_open: # docker run --interactive tty: # docker run --tty

Slide 60

Slide 60 text

Docker Compose ͷωοτϫʔΫ docker-compose up Ͱىಈ͞ΕΔαʔϏε͸σϑΥϧτͰ͸ಉҰͷωοτϫʔΫ಺ʹଘࡏ͢Δ αʔϏε໊͕ͦͷ··ϗετ໊ʹͳ͍ͬͯΔͷͰଞͷίϯςφ͔Β௨৴Ͱ͖Δ version: '3' services: web-server: image: nginx:latest web-client: image: ubuntu:latest command: bash -c 'sleep 5; wget http://web-server/' depends_on: - web-server

Slide 61

Slide 61 text

ߴ౓ͳωοτϫʔΫͷઃఆ αʔϏεΛෳ਺ͷωοτϫʔΫʹ഑ஔ͢Δ͜ͱ΋Մೳ (։ൃ؀ڥ༻్Ͱ͸΄΅࢖༻͠ͳ͍) version: "3" services: proxy: build: ./proxy networks: [frontend] app: build: ./app networks: [frontend, backend] db: image: mysql networks: [backend] networks: frontend: {} backend: {}

Slide 62

Slide 62 text

Agenda • Part 1. Docker ͷجૅ • Part 2. Dockerfile ͷجૅ • Part 3. Docker Compose ͷجૅ • Docker Compose ͱ͸ • αʔϏεͱωοτϫʔΫ • Docker Compose ͷϕετϓϥΫςΟε

Slide 63

Slide 63 text

Git Submodule ͱ૊Έ߹ΘͤΔ ෳ਺ϨϙδτϦߏ੒ͷ؀ڥΛ up ҰൃͰ্ཱͪ͛ΒΕΔΑ͏ʹ . !"" docker-compose.yml !"" db # DBॳظԽॲཧͳͲ !"" frontend # ϑϩϯτ (Node.js) ͷ git repo !"" webapp # WebΞϓϦ (Rails) ͷ git repo #"" batchjob # όονॲཧ (Python) ͷ git repo

Slide 64

Slide 64 text

ެࣜΠϝʔδͷػೳΛ׆༻͢Δ MySQLͳͲͷެࣜΠϝʔδʹ͸༷ʑͳػೳ͕͋Δ db: image: mysql:5.7 volumes: - ./db:/docker-entrypoint-initdb.d # DBॳظԽ༻SQLΛࣗಈ࣮ߦ environment: MYSQL_ALLOW_EMPTY_PASSWORD: 'yes' # root ͷύεϫʔυΛۭʹ ࢀߟ: https://hub.docker.com/_/mysql/

Slide 65

Slide 65 text

YAML ͷΞϯΧʔɾΤΠϦΞεΛར༻͢Δ docker-compose.yml ͷ x- ͔Β࢝·Δ߲໨͸ࣗ༝ʹར༻Ͱ͖Δ ͜ΕͱYAMLͷΞϯΧʔ/ΤΠϦΞεΛ૊Έ߹ΘͤΔͱศར version: '3.4' x-db-env-files: &db-env-files # ΤΠϦΞε - ./env/db.env - ./env/db.secret services: webapp: ... env_file: *db-env-files # ΞϯΧʔ batchjob: ... env_file: *db-env-files # ΞϯΧʔ

Slide 66

Slide 66 text

Part 3. ͸͜͜·Ͱ Part 1, 2, 3 ͰҰ௨Γͷ͜ͱ͸Ͱ͖ΔΑ͏ʹͳͬͨ͸ͣ ࠓޙ͸ެࣜυΩϡϝϯτ΍ຊͰษڧ͍ͯͩ͘͠͞