Create a gist now

Instantly share code, notes, and snippets.

What would you like to do?

DockerでWebappを公開するまで

@ytnobody


一応、自己紹介。

--

ytnobody

  • @ytnobody [わいとんぼーい]
  • あずまさとし
  • 主催者です
  • Perlかいたりします
  • PAUSE:YTURTLE

今日はPerlの成分が少なめです。

--

でもPerlの質問はじゃんじゃんしてくださいね!


Dockerとは?

--

Docker

wikipediaによると・・・

Docker(ドッカー)はソフトウェアコンテナ内のアプリケーションのデプロイメントを自動化するオープンソースソフトウェアである。

--

「概ね当たってるじゃないか」

--

ざっくり言うと

Dockerにおいては、

  • アプリケーションを収めこむ環境としてコンテナというものがある

  • コンテナはLinuxが稼働する「一種の仮想環境」と言える

  • アプリケーションの動作に必要な諸々の設定等を自動化することができる

--

アプリケーション = webapp

でもOK


僕がなぜビギナーにDockerを

オススメするのか

--

  • 環境をぶっ壊してもいくらでも作り直せる
  • 既存の環境を汚さないし、コンテナ内ではroot
  • とにかくシンプルなので、よりアプリケーションに注力できる
  • 流行っている
  • 基本は意外と簡単
  • そんなに覚えること多くないよ!

Dockerを動作させるための

オススメOS

Ubuntu 14.04

但し64bit限定。(dockerは32bitOSでは動作しない)

--

何故?

A: 一番簡単だからです


Dockerを

インストールしてみよう

--

ここにも書いてます(英語ですが)

--

ざっくり言うと

(Ubuntuなら)以下のコマンドでインストール完了するよ!

$ curl -sSL https://get.docker.com/ubuntu/ | sudo sh

早速Dockerを試してみよう

--

perlの稼働するイメージを使ってみよう

$ sudo docker run --name app01 --rm -i -t ytnobody/debian-perl

なお、終了する場合はexitで。

--

DEMO

--

run サブコマンドのよく使うオプション

  • --name コンテナにつける名称を指定する
  • --rm コンテナが終了すると、自動的にコンテナを削除する
  • -i インタラクティブモード。
  • -t TTYを割り当てる。
  • -d コンテナをバックグラウンドで実行。
  • -e コンテナに渡す環境変数を指定する (-e PLACK_ENV=development など)

--

とりあえずコンテナをフォアグラウンドで実行するなら

--rm -i -t 

あたりはつけておこう。


自分のオリジナルな

dockerイメージを作ってみる

--

まずフォルダを作る

$ mkdir docker-myapp
$ cd docker-myapp

--

Dockerfileを書いてみる

$ vi Dockerfile

--

以下のような内容で。

FROM ytnobody/debian-perl
MAINTAINER yourname <yourname@yourdomain.yourmail>

RUN apt-get install git -y
RUN apt-get clean

--

docker buildコマンドでイメージを作る

$ sudo docker build -t yourname/myapp ./

--

出来上がり。

これでコンテナ内でgitコマンドが使えるようになってます!

--

DEMO

--

build サブコマンドの

よくある使い方

$ sudo docker build -t yourname/your-image-name /path/to/your-docker-image-dir

Dockerfileについて

--

Dockerfile = コンテナのレシピ

類似した概念として、ansible。

--

よく使うDockerfileのコマンド

これから列挙する7種類のコマンド以外、僕はあまりつかってないです。

--

FROM

ベースとなるdocker imageを指定する

FROM ytnobody/debian-perl

--

MAINTAINER

Dockerfileの著者とその連絡先を明記する

MAINTAINER ytnobody <ytnobody@gmail.com>

--

RUN

コンテナ内の環境構築を行うコマンドを指定する

RUN apt-get install git -y

--

ADD

コンテナ内に、コンテナ外からファイルやディレクトリを追加する

ADD oreore.pl /path/in/container/oreore.pl

--

WORKDIR

この行以降のコマンドを、指定したディレクトリで実行する。

WORKDIR /path/to/myapp

--

ENTRYPOINT

docker run した時に実行されるコマンドを指定する

ENTRYPOINT ["/bin/bash"]

--

EXPOSE

コンテナの外に公開するTCPポート番号を指定する

EXPOSE 80

--

Dockerfileの基本的な書き方

  • Dockerfileのコマンドは大文字で
  • 1行目はFROMで。
  • 2行目にはMAINTAINERを。

ここまで大まかに理解できたら きっとdockerを使えるはず


単純なwebappをつくって

dockerイメージに入れてみよう

--

今回dockerイメージに放り込むwebapp

app.psgi

use strict;
use warnings;
use Time::Piece;

sub {
    my $time = localtime->strftime('%Y-%m-%d %H:%M:%S'); 
    [
        200, 
        ['Content-Type' => 'text/html; charset=UTF-8'], 
        ['<html><body>TIME = '. $time .'</body></html>'] 
    ];
};

--

先ほどのDockerfileを改造してみる

Dockerfile

FROM ytnobody/debian-perl
MAINTAINER yourname <yourname@yourdomain.yourmail>

RUN cpanm Plack Time::Piece
RUN mkdir /app
ADD app.psgi /app/app.psgi

WORKDIR /app
EXPOSE 5000
ENTRYPOINT ["plackup"]

--

docker imageをbuildする

$ sudo docker build -t yourname/myapp ./

--

buildしたイメージを確認。

$ sudo docker images

--

バックグラウンドで実行する

$ sudo docker run --name myapp -p 5000:5000 -d yourname/myapp

--

実行できているか確認。

$ sudo docker ps

--

ブラウザで http://localhost:5000/ にアクセス

--

コンテナを終了させる

$ sudo docker stop myapp

--

終了したコンテナはきちんと削除しておく

$ sudo docker rm myapp

--

ここまでDEMO

--

このようにPerlで作ったWebappも

Dockerに簡単に載せることができます

--

githubからwebappを持ってくる場合

DockerfileにRUN git clone を書いておく

RUN git clone https://github.com/uzulla/yancha.git $YANCHA_ROOT

Docker imageをつくるまでの流れ

  1. Dockerfileを入れるフォルダを作る
  2. Dockerfileを書く
  3. docker buildしてみる
  4. うまくいかなければ2に戻る
  5. 完成!

Dockerべからず集+あるふぁ〜

--

なんでも1つのコンテナに詰め込むのはやめよう

RUN apt-get install mysql-server postfix memcached -y

役割は1つに!

--

コンテナの中に永続データを置くのはやめよう

RUN apt-get install mysql-server -y

データ消えるよ!

--

1つのホストに沢山のコンテナを同居させないようにしよう

  • アプリケーションコンテナは1ノードに2個程度までが望ましい

--

「コンテナ間通信」は、やめておこう

  • 無駄に複雑になる
  • コンテナのポータビリティが犠牲になる

超難しいよ!

--

うまくいかないなぁと思ったら、service docker statusしてみよう

  • Dockerはクライアント・サーバモデルを採用している

  • ダメな時はDockerサーバが寝てるかもしれない


Thank you.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment