৬ͷDockerϏϧυΛվળͨ͠1
View Slide
ࣗݾհ໊લ: ү ݡେ(@go_vargo)ॴଐ: גࣜձࣾίϩϓϥɹɹ Πϯϑϥάϧʔϓ ୈ2νʔϜझຯ: ΫϥυωΠςΟϒܥͷMeetupͷࢀՃ࠷ۙͷΈɺίϯςφϫʔΫϩʔυͷҋͷཱ͔͍ͪํ2
ࠓͷςʔϚ৬ͷDockerΠϝʔδɾϏϧυΛվળͨ͠γνϡΤʔγϣϯ:ɾνʔϜʹ͢ͰʹDockerfile͕͋Δ(ڥຖʹDockerfile͕ଘࡏ͢Δ)ɾΠϝʔδαΠζνϡʔχϯάͷ༨ͳ͠ɾݴޠPHP(Laravel)ɾCI/CDΛͬͯϏϧυˠσϓϩΠ͍ͯ͠ΔɾϩʔΧϧ։ൃDocker ComposeϦϞʔτKubernetes(GKE)3
ςʔϚʹࢸͬͨϞνϕʔγϣϯ࠷ߴͷDockerfileΛ࡞Γ͍ͨ…ɾDockerfileͷϕετϓϥΫςΟεɾΞϯνύλʔϯݻ·Γͭͭ͋Δ…͕࣍ͷهࣄΛಡΜͰɺࠓΑΓͬͱDockerϏϧυΛվળͰ͖ͦ͏ͩͱࢥͬͨʮDockerfileΛվળ͢ΔͨΊͷBest Practice 2019൛ʯhttps://www.slideshare.net/zembutsu/dockerfile-bestpractices-19-and-adviceɾڥ͝ͱʹෳ͋ΔDockerfileʹΑͬͯInfrastructure as Codeͱͯ͠ͷՄಡੑ͕མ͍ͪͯͨɻूͯ͠ɺগ͠ͰίϯςφͷҋΛΒ͍ͨ͠4
5ڥུ֓3FHJTUSZ ,VCFSOFUFT4QJOOBLFS(JU-BC3VOOFS*NBHF#VJME1VTI*NBHF#BLF%FQMPZ
6ࠓ͢ͱ͜Ζ3FHJTUSZ ,VCFSOFUFT4QJOOBLFS(JU-BC3VOOFS*NBHF#VJME1VTI*NBHF#BLF%FQMPZ
ᶃ BuildKitΛ༗ޮԽᶄ ڥ(ϩʔΧϧ, ։ൃڥ,etc…)͝ͱͷDockerfileΛҰͭͷDockerfileʹ·ͱΊͯɺεςʔδͰڥ͝ͱͷࠩΛఆٛᶅ ηΩϡϦςΟੑͷ্ͱͯ͠ɺίϯςφ͔ΒෆཁͳSecretϑΝΠϧͷআڈ(ࠓճলུ)7վળͨ͜͠ͱ
ͷલʹɺڥมΛ༗ޮԽ͢Δ͚ͩ8ᶃ BuildKitͷ༗ޮԽdocker buildDOCKER_BUILDKIT=1 docker build …
9ᶄ ڥࠩΛεςʔδԽमਖ਼લ मਖ਼ޙDockerfile.localDebuggerGitVim…Dockerfile.k8sFROM image AS local….FROM image AS local debug….FROM image AS k8s….FROM image AS k8s-XXXX….ҰͭͷϑΝΠϧʹू͢Δ͜ͱͰɺίʔυͷڞ௨ԽͱՄಡੑΛߴΊΔDockerfile.xxxx…
ޮೳᶃ:༨ܭͳϨΠϠʔΛؚΊͳ͍ͨΊΠϝʔδαΠζݮগ‑※ BuildKitҎલ͔Βͷޮೳޮೳᶄ:Ϗϧυ࣌ؒͷॖ10Ϛϧνεςʔδ × BuildKitDockerfile ্͔ΒԼʹϏϧυ DockerfileStage1Stage2ฒྻϏϧυBuildKitͳ͠ BuildKit͋Γ
11मਖ਼લFROM php:7.2.18-alpineCOPY docker/files /COPY composer.json composer.lock /app/RUN cd /app \&& apk add --no-cache --virtual .build-deps zip unzip git \&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer \&& composer global require hirak/prestissimo \&& composer install --prefer-dist --no-interaction --no-scripts --no-autoloader --no-dev \&& chown -R www-data:www-data vendor \&& find vendor/ -type d -name ‘.git’ -print0 | xargs -0 rm -rf \&& apk del .build-deps \&& composer global remove hirak/prestissimo \&& rm -rf /root/.composer/COPY --chown=www-data:www-data . /appWORKDIR /appCMD [“run”]ᶄ ڥࠩΛεςʔδԽىಈεΫϦϓτΛίϐʔύοέʔδཧͷϑΝΠϧΛίϐʔϥΠϒϥϦύοέʔδཧπʔϧΛΠϯετʔϧιʔείʔυΛίϐʔ
12##### ComposerΠϯετʔϧ༻ #####FROM php:7.2.18-alpine AS builderCOPY composer.json composer.lock /app/WORKDIR /appRUN cd /app \&& apk add --no-cache --virtual .build-deps zip unzip git \&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer \&& composer global require hirak/prestissimo \&& composer install --prefer-dist --no-interaction --no-scripts --no-autoloader —no-dev##### Kubernetes༻Πϝʔδ #####FROM php:7.2.18-alpine AS k8sCOPY docker/files /WORKDIR /appCOPY --chown=www-data:www-data . /app/COPY --from= builder /usr/local/bin/composer /usr/local/bin/composerRUN apk add —no-cache zip unzipCOPY --from=builder --chown=www-data:www-data /app/vendor /app/vendorCMD [“run”]मਖ਼ޙ - v1ىಈεΫϦϓτΛίϐʔύοέʔδཧͷϑΝΠϧΛίϐʔύοέʔδΛΠϯετʔϧՌΛίϐʔύοέʔδϚωʔδϟΛίϐʔ
13##### ComposerΠϯετʔϧ༻ #####FROM php:7.2.18-alpine AS builderCOPY composer.json composer.lock /app/WORKDIR /appRUN cd /app \&& apk add --no-cache --virtual .build-deps zip unzip git \&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer \&& composer global require hirak/prestissimo \&& composer install --prefer-dist --no-interaction --no-scripts --no-autoloader —no-dev##### Kubernetes༻Πϝʔδ #####FROM php:7.2.18-alpine AS k8sCOPY docker/files /WORKDIR /appCOPY --chown=www-data:www-data . /app/COPY --from= builder /usr/local/bin/composer /usr/local/bin/composerRUN apk add —no-cache zip unzipCOPY --from=builder --chown=www-data:www-data /app/vendor /app/vendorCMD [“run”]मਖ਼ޙ - v1‑ύοέʔδϚωʔδϟͷΠϯετʔϧຖճ࣮ߦ͢Δඞཁͳ͠
14##### ComposerΠϯετʔϧ༻ #####FROM composer:1.8.6 AS builderCOPY composer.json composer.lock /app/WORKDIR /appRUN composer global require hirak/prestissimo \&& curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin/ --filename=composer \&& composer install --prefer-dist --no-interaction --no-scripts --no-autoloader --no-dev \&& chown -R www-data:www-data vendor \&& find vendor/ -type d -name ‘.git’ -print0 | xargs -0 rm -rf##### Kubernetes༻Πϝʔδ #####FROM php:7.2.18-alpine AS k8sCOPY docker/files /WORKDIR /appCOPY --chown=www-data:www-data . /app/COPY --from=builder /usr/local/bin/composer /usr/local/bin/composerRUN apk add —no-cache zip unzipCOPY --from=builder --chown=www-data:www-data /app/vendor /app/vendorCMD [“run”]मਖ਼ޙ - v2ผͷΠϝʔδͱͯ͠Γग़͢Πϯετʔϧ෦আ
15##### ComposerΠϯετʔϧ༻ #####FROM composer:1.8.6 AS builderCOPY composer.json composer.lock /app/WORKDIR /appRUN composer global require hirak/prestissimo \&& composer install --prefer-dist --no-interaction --no-scripts --no-autoloader --no-dev \&& chown -R www-data:www-data vendor \&& find vendor/ -type d -name ‘.git’ -print0 | xargs -0 rm -rf##### Kubernetes༻Πϝʔδ #####FROM php:7.2.18-alpine AS k8sCOPY docker/files /WORKDIR /appCOPY --chown=www-data:www-data . /app/COPY --from=builder /usr/local/bin/composer /usr/local/bin/composerRUN apk add —no-cache zip unzipCOPY --from=builder --chown=www-data:www-data /app/vendor /app/vendorCMD [“run”]मਖ਼ޙ - v2builderͷͪ߹Θ͕ͤൃੜ
16##### Composerίϐʔ༻ #####FROM composer:1.8.6 AS copy##### ComposerΠϯετʔϧ༻ #####FROM composer:1.8.6 AS builderCOPY composer.json composer.lock /app/WORKDIR /appRUN composer global require hirak/prestissimo \&& composer install --prefer-dist --no-interaction --no-scripts --no-autoloader --no-dev \&& chown -R www-data:www-data vendor \&& find vendor/ -type d -name ‘.git’ -print0 | xargs -0 rm -rf##### Kubernetes༻Πϝʔδ #####FROM php:7.2.18-alpine AS k8sCOPY docker/files /WORKDIR /appCOPY --chown=www-data:www-data . /app/COPY --from=copy /usr/local/bin/composer /usr/local/bin/composerRUN apk add —no-cache zip unzipCOPY --from=builder --chown=www-data:www-data /app/vendor /app/vendorमਖ਼ޙ - v3ͪ߹ΘͤΛճආͪ͜͜߹Θͤ
17BuildKitʹΑΔฒྻϏϧυ0 123Stage0, 1ฒྻ࣮ߦStage20,1ͷྃͪStage32ͷྃͪ
18BuildKitʹΑΔฒྻϏϧυ0 1 2 3εςʔδؒͷґଘ͕ؔͳ͍࣮ߦ࣌ؒΛॖ͢Δʹ…ཧ0 1 23εςʔδؒͷґଘ͕ؔগͳ͍࣍ળ
19BuildKitʹΑΔฒྻϏϧυ͍͔ʹαΠζΛখ͘͢͞Δ͔…͍͔ʹϨΠϠʔΛগͳ͘͢Δ͔…BuildKitΛಋೖ͢ΔͱΈมԽ͢Δ͍͔ʹґଘ͕ؔͳ͍ΠϝʔδΛઃܭ͢Δ͔…ಋೖޙಋೖલ͍͔ʹεςʔδΛׂ͢Δ͔…
20վળ݁ՌϩʔΧϧ༻Πϝʔδ मਖ਼લ मਖ਼ޙαΠζ 357MB 355MBϏϧυ࣌ؒ(1ճ) 88s 41sϏϧυ࣌ؒ(2ճҎ߱) 12s 2sK8s༻Πϝʔδ मਖ਼લ मਖ਼ޙαΠζ 209MB 209MBϏϧυ࣌ؒ(1ճ) 78s 41sϏϧυ࣌ؒ(2ճҎ߱) 16s 2s
21• BuildKit × ϚϧνεςʔδͰDockerfileڥΛඋͰ͖ͨ• BuildKitΛ͏͜ͱͷϝϦοτΛײ͡Δ͕ɺσϝϦοτײ͡ͳ͍(͋͘·Ͱݸਓతʹ)• ڧ͍ͯݴ͑ɺͨͩͰ͑͞৬ਓܳʹ͍ۙDockerϏϧυ͕ɹΑΓ͘͠ͳ͍ͬͯΔ(ܳʹͳ͍ͬͯΔ)͔͠Εͳ͍• ࠷ߴͷDockerfileΛٻΊΔཱྀଓ͘…·ͱΊ