本記事ã®å†…容ã¯WEB+DB Vol.88 Perl Hackers Hub 第34回 ã«ã€ŒDockerã«ã‚ˆã‚‹Perlã®Webアプリケーション開発ã€ã¨ã„ã†è¨˜äº‹ã«ã¾ã¨ã‚ãªãŠã—ã¦ã„ã¾ã™ã®ã§ãã¡ã‚‰ã‚’ã”覧ãã ã•ã„。
「Perl Hackers Hubã€ã§ã¯ã€ã€ŒDockerã«ã‚ˆã‚‹Perlã®Webアプリケーション開発ã€ã¨é¡Œã—ã¦@y_uuk1ã•ã‚“ã«ã”執ç†ã„ãŸã ãã¾ã—ãŸï¼Dockerã®åŸºæœ¬çš„ãªè€ƒãˆæ–¹ã‹ã‚‰Perlã®Webアプリå‘ã‘ã®Dockerfileã®æ›¸ãæ–¹ã¾ã§ã€å®Ÿè·µçš„ãªå†…容ã§ã™ï¼ #wdpress
— WEB+DB PRESS編集部 (@wdpress) 2015, 8月 22
ã“ã®è¨˜äº‹ã¯ Perl Advent Calendar 2014 ã®19日目ã®è¨˜äº‹ã§ã™ã€‚ Plack/Carton ã§æ§‹ç¯‰ã—ãŸãƒ¢ãƒ€ãƒ³ãª Perl ã® Web アプリケーションã®é–‹ç™ºç’°å¢ƒã‚’ Docker 化ã™ã‚‹ãŸã‚ã®è©¦è¡ŒéŒ¯èª¤ã‚’紹介ã—ã¾ã™ã€‚
普段ã¯ã€Plack, Router::Simple, Text::Xslate, DBIx::Sunnyãªã©ã‚’組ã¿åˆã‚ã›ãŸãƒ•ãƒ¬ãƒ¼ãƒ ワークã§ã‚¢ãƒ—リケーションを書ã/é‹ç”¨ã™ã‚‹ã“ã¨ãŒå¤šã„ã§ã™ãŒã€ä»Šå›žã¯ã‚µãƒ³ãƒ—ルã¨ã—㦠Amon2 を使ã„ã¾ã—ãŸã€‚ サンプル㯠GitHub ã«ç½®ã„ã¦ã„ã¾ã™ã€‚
Perl アプリケーションを Docker 化ã™ã‚‹ãƒ¡ãƒªãƒƒãƒˆ
ã¾ãšã€ãªãœ Docker 化ã™ã‚‹ã‹ã«ã¤ã„ã¦ã§ã™ãŒã€Perl ã«ã‹ãŽã‚‰ãšã‚¢ãƒ—リケーションãŒå·¨å¤§ã§ã‚ã‚Œã°ã‚ã‚‹ã»ã©ç’°å¢ƒæ§‹ç¯‰ã¨ç’°å¢ƒé‹ç”¨ãŒã©ã‚“ã©ã‚“ã‚ã‚“ã©ã†ã«ãªã£ã¦ã„ãã‹ã‚‰ã§ã™ã€‚ ã ã„ãŸã„ã„ã¤ã‚‚å›°ã£ã¦ã„る例ã¨ã—ã¦ä»¥ä¸‹ã®æ§˜ãªã‚‚ã®ãŒã‚ã‚Šã¾ã™ã€‚
- 開発環境ã§ã¯ã‚¹ãƒ¼ãƒ‘ーãƒã‚¤ã‚¶ãªã©ã§ãƒ‡ãƒ¼ãƒ¢ãƒ³åŒ–ã›ãšã«ã€ãƒ•ã‚©ã‚¢ã‚°ãƒ©ãƒ³ãƒ‰ã§èµ·å‹•ã—ã¦ã„ã‚‹ãŒã€æœ¬ç•ªç’°å¢ƒã§ã¯ daemontools 用ã®ã‚¹ã‚¯ãƒªãƒ—トã§èµ·å‹•ã—ã¦ã„る。
- å„環境ã§ä½•ã‹ã®ãƒãƒ¼ã‚¸ãƒ§ãƒ³ãŒé•ã†ã€‚
- 開発環境ã§ã¯
carton install
ã§ãã‚‹ã‘ã©ã€CI 環境ã§ã¯å¤±æ•—ã™ã‚‹ã€‚ - 開発環境ã§ã¯ãƒ†ã‚¹ãƒˆé€šã‚‹ã‘ã©ã€CI 環境ã§ã¯ãƒ†ã‚¹ãƒˆãŒè½ã¡ã‚‹ã€‚
- ImageMagick ã‚„ RRDtool ã¿ãŸã„ãªãã‚‚ãもビルドãŒé¢å€’ãªã‚½ãƒ•ãƒˆã‚¦ã‚§ã‚¢ã«ä¾å˜ã—ã¦ã„る。 Dockerでffmpegもimagemagickも怖くないという話 - クックパッド開発者ブログ
- 開発環境ã§ã¯ã€
carton exec
を使ã£ã¦ã‚‹ã‘ã©ã€æœ¬ç•ªç’°å¢ƒã§ã¯carton exec
を使ã£ã¦ã„ãªã„。 cpanfile.snapthot
ãŒæ°—ã¥ã„ãŸã‚‰å£Šã‚Œã¦ã„る(carton install --deployment
ãŒå¤±æ•—ã™ã‚‹)。- マイクãƒã‚µãƒ¼ãƒ“スã®ãƒãƒ¼ã‚«ãƒ«ç’°å¢ƒæ§‹ç¯‰ãŒé¢å€’。
ã“ã‚Œã«ã¤ã„ã¦ã€Docker 化ã™ã‚‹ã“ã¨ã«ã‚ˆã‚Šã€æ¬¡ã®ã‚ˆã†ãªãƒ¡ãƒªãƒƒãƒˆãŒã‚ã‚Šã¾ã™ã€‚
- å„環境ã§ãƒãƒ¼ã‚¸ãƒ§ãƒ³ã®çµ±ä¸€ãŒç°¡å˜ï¼ˆãƒãƒ¼ã‚¸ãƒ§ãƒ³ã¨ã„ã†ã‹å®Ÿè¡Œç’°å¢ƒãã®ã‚‚ã®ã‚’統一)
- å„環境ã®æ§‹ç¯‰ã‚’
docker pull
ã—ã¦ãã‚‹ã ã‘ã§çµ‚ã‚らã›ã‚‰ã‚Œã‚‹ã€‚ - CI 環境や本番環境を手元ã§ç°¡å˜ã«å†ç¾ã§ãる。
一方ã§ã€ãƒ‡ãƒ¡ãƒªãƒƒãƒˆã‚‚当然ã‚ã‚Šã¾ã™ã€‚
- Docker デーモン自体ã®é‹ç”¨ã‚’ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„
- docker コマンドã«ã‚ˆã‚‹ã‚ªãƒšãƒ¬ãƒ¼ã‚·ãƒ§ãƒ³ã€ãƒãƒƒãƒ‰ãƒŽã‚¦ãƒã‚¦ã‚’覚ãˆãªã‘ã‚Œã°ãªã‚‰ãªã„
- デãƒãƒƒã‚°ãŒé¢å€’ã«ãªã‚‹ã“ã¨ã‚‚ã‚ã‚‹ (環境ã®å·®ç•°ã«ã‚ˆã‚‹ãƒã‚°ã®ãƒ‡ãƒãƒƒã‚°ã¯é€†ã«ã‚„ã‚Šã‚„ã™ã„ã‹ã‚‚ã—ã‚Œãªã„
ä»–ã«ã‚‚ã€ä¾‹ãˆã° Docker ã¯æ‰‹å…ƒã¨ãƒªãƒ¢ãƒ¼ãƒˆç’°å¢ƒã§ Dockerfile ã®ãƒ“ルドã®æˆå¦ãŒå¤‰ã‚ã£ãŸã‚Šã¯ã—ã¾ã™ã€‚ ã“ã‚Œã¯ã€ä¸€åº¦ä½œæˆã—㟠Docker image ã®å‹•ä½œã®ãƒãƒ¼ã‚¿ãƒ“リティã¯ã‚る程度ä¿è¨¼ã•ã‚Œã¦ã„ã‚‹ãŒã€Docker image ã®ä½œæˆè‡ªä½“ã®ãƒãƒ¼ã‚¿ãƒ“リティã¯ä¸€åˆ‡ä¿è¨¼ã•ã‚Œã¦ã„ãªã„ãŸã‚ã§ã™ã€‚ ビルド環境ãŒã‚¤ãƒ³ã‚¿ãƒ¼ãƒãƒƒãƒˆã«å‡ºã‚‰ã‚Œã‚‹ç’°å¢ƒã§ãªã‘ã‚Œã°ã€apt-get ãªã‚“ã¦å½“然絶対失敗ã—ã¾ã™ã‚ˆã。 ã—ãŸãŒã£ã¦ã€Dockerfile ã§ã¯ãªãã€Docker image ã‚’ãªã‚‹ã¹ã使ã„ã¾ã‚ã—ã¦ã„ãã“ã¨ãŒå¿…è¦ã§ã™ã€‚
Dockerã€æ°—ã¥ã„ãŸã‚‰ãƒ‡ãƒ¡ãƒªãƒƒãƒˆãŒãƒ¡ãƒªãƒƒãƒˆã‚’上回ã£ã¦ã„ã‚‹ãªã‚“ã¦ã“ã¨ã‚‚ã‚ã‚‹ã¨æ€ã†ã®ã§ã†ã¾ãメリットãŒã§ã‚‹ç”¨é€”や手法を確立ã—ã¦ã„ããŸã„ã§ã™ã。
Perl アプリケーション㮠Docker 化パターン
1å¹´ãらㄠDocker ã‚’ã‚„ã‚Šã¤ã¥ã‘ãŸçŸ¥è¦‹ã‚’書ãã¾ã™ã€‚è¦ç‚¹ã‚’以下ã«åˆ—挙ã—ã¾ã™ã€‚
- Perl, cpanm, Carton ãŒå…¥ã£ãŸãƒ™ãƒ¼ã‚¹ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’作る。DockerHub やプライベート Docker registry ã«ã‚¢ãƒƒãƒ—ã—ã¦ãŠã„ã¦ã€ãれをベースã«ã™ã‚‹ã€‚
- cpanfile ã¯å…ˆã« ADD(COPY) ã—ã¦ãŠã。
carton install
ã®çµæžœã‚’ãªã‚‹ã¹ãã‚ャッシュã§ãる。 - fig を使ã†ã€‚アプリケーションã€MySQLã€memcached ãªã©å®Ÿè¡Œãƒ—ãƒã‚»ã‚¹å˜ä½ã§ã€ã‚³ãƒ³ãƒ†ãƒŠã‚’分ã‘る。
- 複数ã®å®Ÿè¡Œã‚³ãƒžãƒ³ãƒ‰ãŒã‚ã‚‹å ´åˆã¯ã‚¹ã‚¯ãƒªãƒ—ト化ã™ã‚‹ã€‚ãƒãƒ¼ã‚«ãƒ«èµ·å‹•ã€ãƒ—ãƒãƒ€ã‚¯ã‚·ãƒ§ãƒ³èµ·å‹•ã€ãƒ†ã‚¹ãƒˆå®Ÿè¡Œãªã©ã€ãã‚Œãžã‚Œã«ã¤ã„ã¦ã‚¹ã‚¯ãƒªãƒ—トを用æ„ã—ã¦ãŠã。
- CI ã‚‚ fig ã§å®Ÿè¡Œã™ã‚‹ã€‚
- CI ã§ã¯ãƒ†ã‚¹ãƒˆæˆå¦ã ã‘ã§ãªãã€ãƒ“ルドã—㟠Docker image ã‚’
docker push
ã™ã‚‹ã€‚
Perl, cpanm, Carton ãŒå…¥ã£ãŸãƒ™ãƒ¼ã‚¹ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’作る
ã‚ã¡ã“ã¡ã§ä½¿ã„ã¾ã‚ã™ã®ã§ã€ä½œã£ã¦ãŠãã¨æ¥½ã§ã™ã€‚ ã‚ã¾ã‚Šã€ONBUILD ã‚„ ENTRYPOINT を使ã£ã¦ãƒ•ãƒƒã‚¯ã‚’作らãªã„ã»ã†ãŒã€ç¶™æ‰¿å…ˆã®ã‚¤ãƒ¡ãƒ¼ã‚¸ãƒ“ルドã§ãƒãƒžã‚‰ãªã„ã‹ã‚‚ã—ã‚Œã¾ã›ã‚“。 ベストプラクティスãŒãŸãã•ã‚“ã‚ã‚‹ã®ã§ã€é©å½“ã«å¾“ã„ã¾ã—ょã†ã€‚
- Best practices for writing Dockerfiles
- Dockerfile Best Practices
- 最速Docker研究会(DockerのTipsを20個上げていくぜ編) - Happy New World
例ãˆã°ã€è‡ªåˆ†ã®å ´åˆã¯ã€ä¸‹è¨˜ã®ã‚ˆã†ãª Dockerfile を書ã„ã¦ã€DockerHub ã« Automate Build ã•ã›ã¦ã©ã“ã§ã‚‚シュッã¨ä½¿ãˆã‚‹ã‚ˆã†ã«ã—ã¦ã„ã¾ã™ã€‚ サイズã®å°ã•ã‚㪠debian イメージをベースã«ã™ã‚‹ã€ãƒ‘ッケージã®ãƒŸãƒ©ãƒ¼ã‚’CDNã®ã‚‚ã®ã«æŒ‡å®šã™ã‚‹ã€ãƒ‘ッケージã®ã‚ャッシュã¯æ¶ˆã—ã¦ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚µã‚¤ã‚ºã‚’抑ãˆã‚‹ãªã©ã®å·¥å¤«ãªã©ãŒã‚ã‚Šã¾ã™ã€‚
https://github.com/y-uuki/dockerfiles/blob/master/perl/5.20.1/Dockerfile https://registry.hub.docker.com/u/yuuk1/perl/
FROM debian:wheezy MAINTAINER y_uuki ENV DEBIAN_FRONTEND noninteractive RUN echo "deb http://cdn.debian.net/debian/ wheezy main contrib non-free" > /etc/apt/sources.list.d/mirror.jp.list RUN echo "deb http://cdn.debian.net/debian/ wheezy-updates main contrib" >> /etc/apt/sources.list.d/mirror.jp.list RUN rm /etc/apt/sources.list RUN apt-get update && \ apt-get install -yq --no-install-recommends build-essential curl ca-certificates tar bzip2 patch && \ apt-get clean && \ rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* ENV PERL_VERSION 5.20.1 ENV PATH /opt/perl-$PERL_VERSION/bin:$PATH ENV CPAN_INSTALL_PATH /cpan # Perl RUN curl -sL https://raw.githubusercontent.com/tokuhirom/Perl-Build/master/perl-build > /usr/bin/perl-build RUN perl -pi -e 's%^#!/usr/bin/env perl%#!/usr/bin/perl%g' /usr/bin/perl-build RUN chmod +x /usr/bin/perl-build RUN perl-build $PERL_VERSION /opt/perl-$PERL_VERSION RUN curl -sL http://cpanmin.us/ | /opt/perl-$PERL_VERSION/bin/perl - --notest App::cpanminus Carton
ã‚‚ã¡ã‚ã‚“ã€å…¬å¼ã®è¨€èªžã‚¹ã‚¿ãƒƒã‚¯ を使ã£ã¦ã‚‚よã„ã§ã™ãŒã€Carton ãŒå…¥ã£ã¦ã„ãªã‹ã£ãŸã‚Šã€WORKDIR
ã‚„ONBUILD
ã€ENTRYPOINT
ãªã©ãŒå‹æ‰‹ã«è¨å®šã•ã‚Œã¦ã„ãŸã‚Šã—ã¦ã€ãƒãƒžã‚Šãƒã‚¤ãƒ³ãƒˆã«ãªã‚‹ã‹ã‚‚ã—ã‚Œãªã„ã®ã§ã€è‡ªåˆ†ã§ä½œã£ãŸç´ ç›´ãªãƒ™ãƒ¼ã‚¹ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’使ã†ã“ã¨ã‚’推奨ã—ã¾ã™ã€‚
cpanfile ã¯å…ˆã« ADD(COPY) ã—ã¦ãŠã。
Ruby ã® Bundler ã®å ´åˆã®æ–¹æ³•ãã®ã¾ã¾ã§ã™ã€‚How to Skip Bundle Install When Deploying a Rails App to Docker if the Gemfile Hasn’t Changed | I Like Stuff
COPY ./ $APPROOT
ã—ã¦ã‹ã‚‰ RUN carton install
ã™ã‚‹ã¨ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ•ã‚¡ã‚¤ãƒ«ã‚’ã©ã‚Œã‹å¤‰æ›´ã™ã‚‹ã ã‘ã§ã€COPY ./ $APPROOT
ã®è¡Œã®ã‚ャッシュãŒåˆ‡ã‚Œã¦ã—ã¾ã„ã€ãれ以é™ã® cpanfile ã«å¤‰æ›´ãŒãªãã¦ã‚‚ carton install
ã®ãƒ•ãƒ«ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ãŒèµ°ã£ã¦ã—ã¾ã„ã¾ã™ã€‚
ãã“ã§ã€cpanfile を先㫠COPY ã—ã¦ãŠãã“ã¨ã§ã€cpanfile ã«å¤‰æ›´ãŒãªã„å ´åˆã¯ã€ãã®è¡Œã¯ã‚ャッシュã•ã‚Œã¾ã™ã€‚
FROM yuuk1/perl:5.20.1 RUN apt-get update && \ apt-get install -yqq --no-install-recommends mysql-client-5.5 libmysqlclient-dev libssl-dev && \ apt-get clean && \ rm -rf /var/cache/apt/archives/* /var/lib/apt/lists/* ENV APPROOT /src/app RUN mkdir -p $APPROOT WORKDIR /src/app COPY cpanfile $APPROOT/cpanfile RUN carton install COPY ./ $APPROOT EXPOSE 5000 CMD ["script/app"]
cpanfile.snapshot ã‚’ã©ã†ã™ã‚‹ã‹ã¨ã„ã†å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚ Docker ã¯ã€cpanfile.snapshot ã® CPAN モジュールãƒãƒ¼ã‚¸ãƒ§ãƒ³å›ºå®šã®ä¸–ç•Œã‹ã‚‰ Linux ã®ãƒ¦ãƒ¼ã‚¶ãƒ©ãƒ³ãƒ‰ã®å›ºå®šã®ä¸–ç•Œã«æ‹¡å¼µã—ãŸã‚‚ã®ã¨æ‰ãˆã‚‹ã“ã¨ãŒã§ãã‚‹ã®ã§ã€Git管ç†ã›ãšã« CI ã§ãƒ“ルドã—ãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’ãã®ã¾ã¾æœ¬ç•ªã«ãƒ‡ãƒ—ãƒã‚¤ã™ã‚Œã°ã‚ã‚“ã¾ã‚Šæ„è˜ã—ãªãã¦ã„ã„ã‹ãªã¨ã„ã†æ°—ãŒã—ã¦ã„ã¾ã™ã€‚
ã‚‚ã¡ã‚ã‚“ã€æœ¬ç•ªã¯ Docker 化ã—ã¦ãªã„ã“ã¨ã‚‚ã‚ã‚‹ã¨æ€ã†ã®ã§ã€CI ã§ãƒ“ルドã—ãŸã‚¤ãƒ¡ãƒ¼ã‚¸ã‹ã‚‰ cpanfile.snapshot ã‚’ docker cp
ã§æŒã£ã¦ãã¦ã€Git ã®ãƒªãƒã‚¸ãƒˆãƒªã«è‡ªå‹•ã§å«ã‚るよã†ã«ã™ã‚‹ãªã©ã®å·¥å¤«ã‚’ã™ã‚Œã°è‰¯ã„æ°—ãŒã—ã¦ã„ã¾ã™ã€‚
å‚考: Carton考2014 | おそらくはそれさえも平凡な日々
Fig を使ã†
MySQL ã‚„ memcached ãªã©ã®ãƒŸãƒ‰ãƒ«ã‚¦ã‚§ã‚¢ã‚’アプリケーションã¨åŒã˜ã‚³ãƒ³ãƒ†ãƒŠã«å…¥ã‚Œã‚‹ã®ã‹åˆ¥ã€…ã®ã‚³ãƒ³ãƒ†ãƒŠã«ã„れるã®ãŒã„ã„ã‹ã‚’以å‰ã€id:papix ã•ã‚“ã«èžã‹ã‚ŒãŸã“ã¨ãŒã‚ã‚Šã¾ã—ãŸã€‚ Docker ã¯è¤‡æ•°ã®ãƒ‡ãƒ¼ãƒ¢ãƒ³ã‚’ç«‹ã¡ä¸Šã’る綺麗ãªæ–¹æ³•ã‚’基本的ã«ã‚µãƒãƒ¼ãƒˆã—ã¦ã„ãªã„ã®ã§ã€1デーモン1コンテナãªä¸–ç•Œã ã¨æ€ã£ã¦ã„ã¾ã™ã€‚(supervisor を使ã†ãªã©ã®æ–¹æ³•ã¯ä¸€å¿œã‚る。https://docs.docker.com/articles/using_supervisord/ )
ãã‚‚ãも全部入り㮠Docker image を本番ã§ä½¿ã†ã“ã¨ã¯ã¾ãšãªã„ã¨æ€ã†ã®ã§ã€é–‹ç™ºç’°å¢ƒã¨ãã®ä»–ã®ç’°å¢ƒã§ Dockerfile を分ã‘ã‚‹ã“ã¨ã«ãªã‚Šã€äºŒé‡ç®¡ç†ã™ã‚‹ãƒãƒ¡ã«ãªã‚Šãã†ã§ã™ã€‚ ãŸã ã€ã‚ãã¾ã§è¤‡æ•°ãƒ›ã‚¹ãƒˆæ§‹æˆãŒå½“ãŸã‚Šå‰ãªWebアプリケーションをå‰æã—ã¦ã„ã‚‹ã®ã§ã€å€‹äººã§ä½œã£ãŸã¡ã‚‡ã£ã¨ã—ãŸã‚¢ãƒ—リケーションã§ã‚ã‚Œã°ã€å…¨éƒ¨å…¥ã‚Šã®ã»ã†ãŒã‚„ã‚Šã‚„ã™ã‘ã‚Œã°ãã‚Œã§ã‚‚よã„よã†ãªæ°—ã¯ã—ã¦ã„ã¾ã™ã€‚
ãŸã ã€ãƒ‡ãƒ¼ãƒ¢ãƒ³å˜ä½ã§ã‚³ãƒ³ãƒ†ãƒŠã‚’ã‚ã‘ã‚‹ã¨ã€ã‚³ãƒ³ãƒ†ãƒŠã®ç®¡ç†ãŒé¢å€’ã§ã¯ã‚ã‚Šã¾ã™ã€‚ ãã“ã§ã€Fig を使ã„ã¾ã™ã€‚ Fig 㯠Docker 社ãŒé–‹ç™ºã—ã¦ã„ã‚‹ Docker 版㮠Foremanã€Proclet ã¿ãŸã„ãªã‚‚ã®ã ã¨å‹æ‰‹ã«æ€ã£ã¦ã„ã¾ã™ã€‚ è¦ã¯ã€è¤‡æ•°ã‚³ãƒ³ãƒ†ãƒŠã®ç«‹ã¡ä¸Šã’ã‚„åœæ¢ã®ç®¡ç†ã‚’サãƒãƒ¼ãƒˆã—ã¦ãれるã„ã„ã‚„ã¤ã§ã™ã€‚
Fig ã§é–‹ç™ºç’°å¢ƒã‚’作る方法㯠Fig ã®ãƒãƒ¥ãƒ¼ãƒˆãƒªã‚¢ãƒ«ãŒã‚ã‹ã‚Šã‚„ã™ã„ã§ã™ã€‚
Getting started with Fig and Rails
今回ã¯ã€Perl アプリケーションã®ä¾‹ã‚’紹介ã—ã¾ã™ã€‚
Fig を使ã†ã«ã¯ã¾ãšã€fig.yml
を作る必è¦ãŒã‚ã‚Šã¾ã™ã€‚
db, web ãªã©ã®ãƒãƒ¼ãƒ«åã«å¯¾ã—ã¦ã€docker コマンドã®ã‚ªãƒ—ションを定義ã—ã¦ã„ãã‚„ã‚Šæ–¹ã§ã™ï¼ˆsetup ã¯ã‚¹ã‚ーマをæµã™ãŸã‚ã®ã‚³ãƒžãƒ³ãƒ‰ã‚³ãƒ³ãƒ†ãƒŠã§ã™ï¼‰ã€‚
互ã„ã®ãƒãƒ¼ãƒ«ã®å‚ç…§ã«ã¯ã€Docker ã®ã‚³ãƒ³ãƒ†ãƒŠãƒªãƒ³ã‚¯ を使ã„ã¾ã™ã€‚ コンテナリンクを使ã†ã¨ã€ãƒªãƒ³ã‚¯å…ˆã®ãƒ›ã‚¹ãƒˆåã¨å…¬é–‹ãƒãƒ¼ãƒˆãªã©ãŒãƒªãƒ³ã‚¯å…ƒã§ã¯ç’°å¢ƒå¤‰æ•°ã¨ã—ã¦å‚ç…§ã§ãã¾ã™ (https://github.com/y-uuki/dockerized-perl-app/blob/master/config/development.pl#L5-6 ) 。 本æ¥ã¯ã€links ã«ã¯ã‚³ãƒ³ãƒ†ãƒŠåを指定ã—ãªã‘ã‚Œã°ãªã‚‰ãªã„ã®ã§ã™ãŒã€Fig ãªã‚‰ãƒãƒ¼ãƒ«åã¨ã„ã†æŠ½è±¡çš„ãªå称ã§æŒ‡å®šã§ãã‚‹ã®ã§ã€åå‰æŒ‡å®šã®ç…©ã‚ã—ã•ãŒãªããªã£ã¦ã„ã¾ã™ã€‚
db: image: mysql:5.5.40 environment: - MYSQL_USER=nobody - MYSQL_PASSWORD=nobody - MYSQL_ROOT_PASSWORD=root - MYSQL_DATABASE=mydocker ports: - "3306" setup: build: . command: script/db links: - db web: build: . command: carton exec perl script/my-docker-server ports: - "5000:5000" volumes: - ./:/src/app links: - db
イメージã®ãƒ“ルドã¯
$ fig build
ã™ã‚‹ã ã‘ã§ã™ã€‚コンテナã®èµ·å‹•æ–¹æ³•ã¯ã„ãã¤ã‹ã‚ã‚Šã¾ã™ãŒã€å…¨ã‚³ãƒ³ãƒ†ãƒŠã‚’ã¾ã¨ã‚ã¦èµ·å‹•ã™ã‚‹ãªã‚‰
$ fig up
ã™ã‚Œã°ã‚ˆã„ã ã‘ã§ã™ã€‚
コンテナを一ã¤ã¥ã¤èµ·å‹•ã—ãŸã„å ´åˆã¯ã€fig run
を使ã„ã¾ã™ã€‚
$ fig run -d mysql $ fig run setup $ fig run web
複数ã®å®Ÿè¡Œã‚³ãƒžãƒ³ãƒ‰ãŒã‚ã‚‹å ´åˆã¯ã‚¹ã‚¯ãƒªãƒ—ト化ã™ã‚‹
実行環境㯠web
(linked with db
) を使ã„ãŸã„ãŒã€Webサーãƒã®èµ·å‹•ä»¥å¤–ã®ã“ã¨ã‚’ã—ãŸã„ã¨ãã¯ã‚ˆãã‚ã‚Šã¾ã™ã€‚
ã“ã®ã‚ˆã†ãªã¨ãã«ã¯ã€å„コマンドをスクリプト化ã—ã¦ãŠãã¨ä¾¿åˆ©ã§ã™ã€‚
例ãˆã°ãƒ†ã‚¹ãƒˆå®Ÿè¡Œã¯
$ fig run web script/test
ã®ã‚ˆã†ã«ã§ãã‚‹ã¨æ‰‹è»½ã§ã™ã€‚ ä»–ã«ã‚‚ã€ã‚¹ã‚ーマã®æµã—ã“ã¿ã‚’
$ fig run web script/db # (fig up 時ã«ã‚‚ã‚„ã£ã¦ã»ã—ã„ã®ã§ã€fig run setup ã§å®Ÿè¡Œã§ãるよã†ã«ã—ã¦ã¯ã„ã‚‹)
ã§ã§ããŸã‚Šã™ã‚‹ã¨ç°¡å˜ã§ã™ã€‚
script/test ã¯ä»¥ä¸‹ã®ã‚ˆã†ãªç°¡å˜ãªã‚¹ã‚¯ãƒªãƒ—トã§ã™ãŒã€ã“れをé€ä¸€å®Ÿè¡Œã™ã‚‹ã®ã¯é¢å€’ã§ã™ã€‚
#!/bin/bash DIR=$(dirname $0) APPDIR=$DIR/../ carton exec -- prove -I$APPDIR/lib $APPDIR/t
CircleCI
Jenkins ã¾ãŸã¯ Docker ãŒä½¿ãˆã‚‹ CircleCI を使ã†ã®ãŒä»Šã®ã¨ã“ã‚ã® CI サーãƒã®é¸æŠžè‚¢ã‹ãªã¨æ€ã£ã¦ã„ã¾ã™ã€‚ CircleCI ã®ç’°å¢ƒã§ã¯ã€Docker 1.2.0 ãŒå‹•ã„ã¦ã„ã¦ã€å¤ã„ã®ã§ã„ãã¤ã‹ã®ãƒã‚°ã‚„サãƒãƒ¼ãƒˆã—ã¦ã„ãªã„機能ãŒã‚ã£ã¦çœŸé¢ç›®ã«ã‚„ã£ã¦ã„ã¾ã›ã‚“。 雰囲気ã¯ã ã„ãŸã„以下ã®æ§˜ãªæ„Ÿã˜ã§ã™ã€‚ deployment セクション㧠DockerHub ã‹ DockerRegistry ã«ã‚¢ãƒƒãƒ—ãƒãƒ¼ãƒ‰ã§ãã‚Œã°å®Œç’§ã€‚
machine: services: - docker timezone: Asia/Tokyo dependencies: cache_directories: - "~/docker" override: - mkdir -p ~/docker - sudo sh -c "curl -L https://github.com/docker/fig/releases/download/1.0.1/fig-Linux-x86_64 > /usr/local/bin/fig"; sudo chmod +x /usr/local/bin/fig - script/ci/load_images ~/docker; fig build; script/ci/save_images ~/docker test: override: - fig run -d db - fig run --rm setup - fig run web script/test
ボツã«ã—ãŸã‚„ã¤
ssh
supervisor 㧠sshd ã‚‚èµ·å‹•ã™ã‚‹ã‚ˆã†ã«ã™ã‚‹ã¨ã„ã†æ–¹æ³•ã€‚èµ·å‹•ä¸ã®ã‚³ãƒ³ãƒ†ãƒŠã®ä¸ã«å…¥ã‚‹æ‰‹æ®µã¯ Docker 1.3 ã‹ã‚‰å…¥ã£ãŸ docker exec -it <container> /bin/bash
ã§ç¢ºç«‹ã•ã‚ŒãŸã¨ã„ãˆã‚‹ã®ã§ã€ç„¡ç†ã—ã¦ã‚„ã‚‹å¿…è¦ã¯ãªã•ãã†ã§ã™ã€‚
何よりéµã®ç®¡ç†ã¨ã‹ãŒé¢å€’ã™ãŽã‚‹ã€‚
差分ビルド
cpanfile を先㫠ADD ã™ã‚‹ã¨ã„ã†ç™ºæƒ³ãŒãªã‹ã£ãŸãŸã‚ã€cron ã‹ãªã«ã‹ã§å®šæœŸçš„ã« docker build ã—ã¦ãã®ã‚¤ãƒ¡ãƒ¼ã‚¸ã‚’使ã†ã¨ã„ã†é¢å€’ãªã“ã¨ã‚’ã‚„ã‚ã†ã¨ã—ã¦ã„ãŸæ™‚期もã‚ã‚Šã¾ã—ãŸã€‚
Data-only Container and Runtime Container Pattern)
ãªã‚‹ã¹ã carton install
ã®ã‚ャッシュを効ã‹ã›ã‚‹ãŸã‚ã«ã€Docker ã® Volume 機能 を使ã†ã“ã¨ã‚’考ãˆã¾ã—ãŸã€‚
具体的ã«ã¯ã€æ°¸ç¶šåŒ–ã—ãŸã„データ(carton install
ã—ãŸãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«)ã‚’ Data Volume Container ã¨ã„ã†å°‚用ã®ã‚³ãƒ³ãƒ†ãƒŠã«ç½®ãã€ãれを Perl ã‚„ Carton ãªã©ã®å®Ÿè¡Œç’°å¢ƒã‚’ç©ã‚“ã コンテナ(Runtime Container)ã‹ã‚‰ãƒžã‚¦ãƒ³ãƒˆã™ã‚‹ã¨ã„ã†æ–¹æ³•ã§ã™ã€‚
Data Volume Container ã¯ãƒªãƒã‚¸ãƒˆãƒªã®ãƒ•ã‚¡ã‚¤ãƒ«ç¾¤ã‚’ ADD ã—ã¦ã€ãã®ãƒ‡ã‚£ãƒ¬ã‚¯ãƒˆãƒªã‚’ VOLUME ã¨ã—ã¦å…¬é–‹ã™ã‚‹ã ã‘ã§ã€carton install
ã‚„ carton exec
㯠Runtime Container ã‹ã‚‰å®Ÿè¡Œã™ã‚‹ã€‚
ãã‚Œãªã‚Šã«ã„ã„アイデアã ã¨æ€ã£ãŸã‚‚ã®ã®ã€å¸¸ã«ã‚¢ãƒ—リケーションã«ã¤ã 2種類㮠Docker image ã¨ã‚³ãƒ³ãƒ†ãƒŠã‚’管ç†ã™ã‚‹ã“ã¨ã«ãªã‚Šã€ä»•çµ„ã¿ãŒç…©é›‘ã«ãªã‚Šã¾ã™ã€‚ã•ã‚‰ã«ã€Data Volume Container ã«çŠ¶æ…‹ã‚’æŒãŸã›ã‚‹ã“ã¨ã«ãªã‚‹ã®ã§ã€ã‚¯ãƒªãƒ¼ãƒ³ãªç’°å¢ƒã‚’作りやã™ã„ Docker を使ã£ã¦ã„るメリットãŒè–„ããªã£ã¦ã—ã¾ã†ã¨ã„ã†å•é¡ŒãŒã‚ã‚Šã¾ã™ã€‚
cpanfile.snapshot ãŒå£Šã‚ŒãŸã‚Šã™ã‚‹ã“ã¨ã‚’考ãˆã‚‹ã¨ã€cpanfile ã«ãƒ¢ã‚¸ãƒ¥ãƒ¼ãƒ«ã‚’è¿½åŠ ã—ãŸã¨ããらã„ã¯æœ€åˆã‹ã‚‰ carton install
ã—ã¦ä½œã‚ŠãªãŠã—ã¦ã‚‚悪ããªã„ã¨æ€ã„ã¾ã™ã€‚
課題
ã¾ã ã‚„ã£ã¦ãªã„ã“ã¨ã§ã™ã€‚
Git ã®ãƒ–ランãƒã”ã¨ã®ã‚¤ãƒ¡ãƒ¼ã‚¸ç®¡ç†
CI 環境ã§ãƒ“ルドã—ãŸå¾Œã«ã€DockerHub ã‚„ Registry ã«ãƒ–ランãƒåã‚„SHA1ã‚’ã‚¿ã‚°ã¨ã—㦠push ã™ã‚Œã°ã‚ˆã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ ブランãƒãŒå‰Šé™¤ã•ã‚ŒãŸã‚‰ Registry ã‹ã‚‰å‰Šé™¤ã™ã‚‹ãªã©ã®ä»•çµ„ã¿ã®æ•´ç†ã¯çµæ§‹é¢å€’。
ホットデプãƒã‚¤
Perl ã®ä¸–ç•Œã§ã¯ Server::Starter を使ã£ãŸç„¡åœæ¢ãƒ‡ãƒ—ãƒã‚¤ãŒæœ‰åã§ã™ãŒã€Server::Starter 㨠Docker 化ã—ãŸã‚¢ãƒ—リケーションã¯ç›¸æ€§ãŒæ‚ªã„ã¨æ€ã£ã¦ã„ã¾ã™ã€‚ 例ãˆã°ã€ã‚¢ãƒ—リコンテナã®èµ·å‹•æ™‚ã«ã‚³ãƒ³ãƒ†ãƒŠã®ä¸ã§ Server::Starter ã‚’èµ·å‹•ã™ã‚‹ã‚ˆã†ã«ã—ãŸã¨ã—ã¦ã‚‚ã€ãƒ‡ãƒ—ãƒã‚¤å‰å¾Œã§åŒã˜ã‚³ãƒ³ãƒ†ãƒŠã‚’使ã†ã“ã¨ã«ãªã‚Šã€ã›ã£ã‹ãクリーンãªã‚³ãƒ³ãƒ†ãƒŠã‚’使ã£ã¦ã„るメリットãŒã‚ã¾ã‚Šã‚ã‚Šã¾ã›ã‚“。 Blue Green Deployment ã®ã‚ˆã†ãª Docker コンテナã”ã¨å…¥ã‚Œæ›¿ãˆã‚‹é‹ç”¨ãŒæŽ¨å¥¨ã•ã‚Œã¦ã„ã‚‹ã¨æ€ã†ã®ã§ã€ãƒãƒ¼ãƒ‰ãƒãƒ©ãƒ³ã‚µã®è¨å®šã‚’å‹•çš„ã«æ›¸ãæ›ãˆã‚‹ãªã©ã®é‹ç”¨æ–¹æ³•ã®ç¢ºç«‹ãŒå¿…é ˆã¨ãªã‚Šãã†ã§ã™ã€‚
ä»–ã«ã‚‚ãªã‚“ã‹ã„ã‚ã„ã‚ã‚る。
å‚考
- PSGI/Plackアプリケーションの起動方法いろいろと本番環境アレコレ - blog.nomadscafe.jp
- Herokuとwerckerによる継続的インテグレーション・自動デプロイでperlのwebアプリケーションを開発する - 平常運転
- 東京はもう古い、これからは京都 - ゆううきブログ
ã©ã†ã§ã‚‚ã„ã„ã‘ã©ã€ã‚¯ã‚¸ãƒ©ã®ç¥–å…ˆãŒãƒ©ã‚¯ãƒ€ã§ã‚ã‚‹ã¨ã‹ã„ã†ã‚ã¡ã‚ƒãã¡ã‚ƒé›‘ãªæƒ…å ±ã‚’ã‚²ãƒƒãƒˆã—ã¾ã—ãŸã€‚
明日㯠id:ar_tama ã•ã‚“ã§ã™ã€‚よã‚ã—ããŠé¡˜ã„ã—ã¾ã™ï¼
ã¯ã¦ãªã§ã¯æ–°ãƒ—ãƒãƒ€ã‚¯ãƒˆã§ Scala, Go ãªã©ãŒæŽ¡ç”¨ã•ã‚Œã¦ã„ã¾ã™ãŒã€ã¾ã ã¾ã Perl ã‚‚ç¾å½¹ãªã®ã§ã€Perl エンジニアもã¨ã«ã‹ã募集ã—ã¦ãŠã‚Šã¾ã™ã€‚
æŽ¡ç”¨æƒ…å ± - æ ªå¼ä¼šç¤¾ã¯ã¦ãª