Slide 1

Slide 1 text

docker で開発環境を構築してみよう 1

Slide 2

Slide 2 text

自己紹介 木村 勇太 サー バー サイドエンジニア プログラミング言語 PHP, node, java , Ruby 主にAWS を使ったシステム構築してます。 最近はscala, spark いじり中 re:Invent 2017 行ってきました! 2

Slide 3

Slide 3 text

Agenda Docker とは docker での開発環境構築 開発環境docker 化の活用例 余談 3

Slide 4

Slide 4 text

docker とは コンテナ仮想化技術の一つ docker だけがコンテナ仮想化技術ではなく他にもある 最近だとbelena という省メモリなIoT 向けのコンテナが話題 4

Slide 5

Slide 5 text

Docker Architecture Docker の主要な要素はcontainer、image、daemon で構成されてい る container Docker でソフトウェアを動かす箱 Image container を作成する元、php やruby,node などたくさんのものがあ り、DockerHub(https://hub.docker.com/) などのRegistry を利用し てネット経由で取得することができる。 daemon コンテナの作成や管理などはDocker daemon( サー バ) に依頼して実 行されます。 docker daemon はAPI リクエストを受け付けて、 リクエストに合わ せcontainer やImage などの作成を実施します。 5

Slide 6

Slide 6 text

Docker Architecture 6

Slide 7

Slide 7 text

curl 例 $ c u r l - - u n i x - s o c k e t / v a r / r u n / d o c k e r . s o c k - H " C o n t e n t - T y p e : a p p l i c a t i o n / j s o n " \ - d ' { " I m a g e " : " a l p i n e " , " C m d " : [ " e c h o " , " h e l l o w o r l d " ] } ' \ - X P O S T h t t p : / v 1 . 2 4 / c o n t a i n e r s / c r e a t e { " I d " : " 1 c 6 5 9 4 f a f 5 " , " W a r n i n g s " : n u l l } $ c u r l - - u n i x - s o c k e t / v a r / r u n / d o c k e r . s o c k - X P O S T h t t p : / v 1 . 2 4 / c o n t a i n e r s / 1 c 6 5 9 4 f a f 5 / s t a r t $ c u r l - - u n i x - s o c k e t / v a r / r u n / d o c k e r . s o c k - X P O S T h t t p : / v 1 . 2 4 / c o n t a i n e r s / 1 c 6 5 9 4 f a f 5 / w a i t { " S t a t u s C o d e " : 0 } $ c u r l - - u n i x - s o c k e t / v a r / r u n / d o c k e r . s o c k " h t t p : / v 1 . 2 4 / c o n t a i n e r s / 1 c 6 5 9 4 f a f 5 / l o g s ? s t d o u t = 1 " h e l l o w o r l d 7

Slide 8

Slide 8 text

ただAPI に対してのRequest を自分で書くと大変 Docker CLI が用意されていて、API の利用をwrapper している。 d o c k e r b u i l d d o c k e r r u n d o c k e r p u l l etc・・・ 8

Slide 9

Slide 9 text

docker components 9

Slide 10

Slide 10 text

docker で開発環境構築をするメリット・ デメリット メリット Docker を利用出来る環境がセットアップされていれば、 すぐに同じ 環境構築が出来る host 側の環境を汚さずに環境構築が出来る。 すぐに消して同じものを作れる( 冪等性) 必要になる環境毎にcontainer を作ることができるので、 php,ruby,MySql など複数の環境が必要になる場合の依存性を 切り分け、 追加、 削除が行いやすい。 本番環境でdocker を利用する場合、 本番で実際に使うimage を開発 環境でも使えるため環境との差異を減らすことができる 10

Slide 11

Slide 11 text

デメリット Docker の知識が必要になる 公式でDocker for mac, Docker for windows など各種ツー ルが配布 されているが、 まだまだ環境差異がある( 特にMac のファイルシステ ム周り) メモリやデー タのサイズ 開発するにあたって必要な環境のimage やcontainer を作成する 分の容量が必要になるので、 結構サイズを取る場合が多い。 11

Slide 12

Slide 12 text

docker での開発環境構築 12

Slide 13

Slide 13 text

Docker CLI docker API をコマンドラインから実行するためのツー ル。 基本的にこのツー ルを利用してdocker のimage,container を作成し ていく。 13

Slide 14

Slide 14 text

docker command の一部 d o c k e r r u n [ O P T I O N S ] I M A G E [ C O M M A N D ] [ A R G . . . ] 指定したimage のコマンドを実行する d o c k e r b u i l d [ O P T I O N S ] P A T H | U R L | - docker image のbuild を行う d o c k e r p s [ O P T I O N S ] 起動しているcontainer 一覧を表示する d o c k e r e x e c [ O P T I O N S ] C O N T A I N E R C O M M A N D [ A R G . . . ] 指定したcontainer 内でコマンドを実行する d o c k e r i m a g e l s [ O P T I O N S ] 現在取得しているimage の一覧の表示する d o c k e r r m [ O P T I O N S ] C O N T A I N E R [ C O N T A I N E R . . . ] 指定したcontainer の削除を行う d o c k e r r m i [ O P T I O N S ] I M A G E [ I M A G E . . . ] 指定したimage の削除を行う 14

Slide 15

Slide 15 text

開発環境構築手順を考える 15

Slide 16

Slide 16 text

開発開始、 新規メンバー がassign された時に時間がかかりがちにな ってしまうのは開発環境構築 開発環境の高速化はプロジェクトの工数削減に非常に有用 16

Slide 17

Slide 17 text

開発環境に必要なもの 冪等性 何度環境構築をやり直しても同じものを作成することが出来 る、 誰がやっても同じものを作成することが出来る様にする。 社内の開発マシンを考慮した構築手順 使いやすさ 使いにくい手順はやがて使われなくなっていく、 出来るだけ手 順の複雑性は取り除きたい Document 新規メンバー が入ってきても同じ様に構築が出来るドキュメン トを作成する 17

Slide 18

Slide 18 text

docker 開発環境構築手順 1. 各環境の構成 2. image の選定 3. 各コンテナ環境に必要なmodule、 初回処理を考える( 環境定義の書 き換え、DB migration など) 4. ( 必要なものは)Dockerfile を記述し必要なmodule を入れる 5. docker‑compose.yml を作成する 6. 環境構築のために必要なコマンドをまとめたdocument を作成す る。 18

Slide 19

Slide 19 text

各環境の構成を考える 19

Slide 20

Slide 20 text

最初にアプリケー ションを動かすために必要な環境を考えます。 今回のdocker 環境化するアプリケー ション https://github.com/yutachaos/symfony‑form‑sample 20

Slide 21

Slide 21 text

今回必要な環境 symfony2 を利用したアプリケー ション。 PHP を利用するコンテナ DB コンテナ MySQL を利用するコンテナ 確認するべき情報 PHP のversion,module, 設定 PHP version 7.0 DB のversion, 設定 MySQL 5.7 21

Slide 22

Slide 22 text

構成 22

Slide 23

Slide 23 text

image の選定 23

Slide 24

Slide 24 text

最初は各言語に大体公式のimage が配布されているので、 通常は公 式image を利用する 本番でもコンテナを運用を想定する場合はalpine 系がお勧め( 非常に サイズが小さい) AmazonLinux の公式もある https://hub.docker.com/_/amazonlinux/ 24

Slide 25

Slide 25 text

利用するimage PHP コンテナ amazon linux の公式を利用 php 単体の環境が欲しいだけの場合はphp 公式を利用した方が 良いが、 今回は開発環境はdocker、 本番環境はEC2 を想定して いるためamazon linux の公式を利用 https://hub.docker.com/_/amazonlinux/ DB コンテナ MySQL の公式を利用 https://hub.docker.com/_/mysql/ 25

Slide 26

Slide 26 text

各コンテナ環境に必要なmodule、 初回処理を 考える 26

Slide 27

Slide 27 text

PHP コンテナ amazon linux php のインストー ル php の設定 apache の設定 apache の起動 DB コンテナ MySQL DB のユー ザー 作成、 設定 DB migration 27

Slide 28

Slide 28 text

Dockerfile を記述し必要なmodule を入れる 28

Slide 29

Slide 29 text

Dockerfile Docker を利用して環境構築を行う場合、docker hub などのある image そのままでは必要なmodule や設定が足りない場合がある。 Dockerfile を利用して、image に新たな設定を追加した別のimage を 作成することができる。 29

Slide 30

Slide 30 text

例 # f r o m a m a z o n l i n u x I m a g e F R O M a m a z o n l i n u x : 2 0 1 7 . 0 9 # P H P 7 . 0 , A p a c h e , g i t R U N y u m - y i n s t a l l h t t p d 2 4 p h p 7 0 p h p 7 0 - o p c a c h e p h p 7 0 - d e v e l p h p 7 0 - m b s t r i n g p h p 7 0 - m c r y p t p h p 7 0 - m y s q l n d p h p 7 0 - p e c l - x d e b u g p h p 7 0 - p e c l - x h p r o f z i p u n z i p g i t g c c & & \ s e d - i - e " s / ; d a t e . t i m e z o n e * = . * $ / d a t e . t i m e z o n e = U T C / " / e t c / p h p . i n i & & \ s e d - i - e " s / A l l o w O v e r r i d e N o n e / A l l o w O v e r r i d e A l l / " / e t c / h t t p d / c o n f / h t t p d . c o n f & & \ s e d - i - e " s / O p t i o n s I n d e x e s F o l l o w S y m L i n k s / O p t i o n s - I n d e x e s + F o l l o w S y m L i n k s / " / e t c / h t t p d / c o n f / h t t p d . c o n f R U N r m - r f / v a r / w w w / h t m l & & \ m k d i r - p / v a r / w w w / s r c / w e b & & \ l n - s n f / v a r / w w w / s r c / w e b / v a r / w w w / h t m l W O R K D I R / v a r / w w w / s r c E N T R Y P O I N T / u s r / s b i n / h t t p d - D F O R E G R O U N D 30

Slide 31

Slide 31 text

Dockerfile 解説 FROM 利用するimage の名前を指定し、registry からDL する RUN コマンドを実行する WORKDIR image の実行のルー トディレクトリを変更する ENTRYPOINT container 起動時に実行されるコマンド 31

Slide 32

Slide 32 text

Dockerfile 作成 1. docker run ‑it {/bin/bash or /bin/ash} でコンテナ内で作業を行う i.e d o c k e r r u n - i t a m a z o n l i n u x : 2 0 1 7 . 0 9 / b i n / b a s h 2. うまくいったコマンドをメモしていく 3. 失敗したら、exit して再度docker run で実行していく。 4. 全部うまくいったらDockerfile に記載する 32

Slide 33

Slide 33 text

docker‑compose.yml を作成する 33

Slide 34

Slide 34 text

docker‑compose とは docker command だけでは複雑になりがちな複数コンテナの依存 性、 設定などをyaml 形式で記述し、 複数コンテナを同時に起動する こともできる。 https://docs.docker.com/compose/overview/ 34

Slide 35

Slide 35 text

環境のイメー ジ 35

Slide 36

Slide 36 text

例 v e r s i o n : ' 3 ' s e r v i c e s : # m y s q l m y s q l : i m a g e : m y s q l : 5 . 7 p o r t s : - " 3 3 0 6 : 3 3 0 6 " e n v i r o n m e n t : M Y S Q L _ A L L O W _ E M P T Y _ P A S S W O R D : ' t r u e ' v o l u m e s : - m y s q l d a t a : / v a r / l i b / m y s q l - . / d o c k e r / d b _ i n i t : / d o c k e r - e n t r y p o i n t - i n i t d b . d # a p a c h e , p h p s e r v e r : b u i l d : c o n t e x t : . d o c k e r f i l e : d o c k e r / s e r v e r / D o c k e r f i l e v o l u m e s : - . : / v a r / w w w / s r c : c a c h e d p o r t s : - " 8 0 : 8 0 " v o l u m e s : m y s q l d a t a : 36

Slide 37

Slide 37 text

docker‑compose.yml 解説 version docker‑compose ファイル自体のversion services image そのservice( コンテナ) で利用するimage 名 ports そのコンテナから公開されるport を指定する ホスト: コンテナ , " 3 3 0 6 : 3 3 0 6 " の場合はコンテナの 3 3 0 6 ポー トがホストの localhost の 3 3 0 6 に公開される様になる 37

Slide 38

Slide 38 text

environment コンテナ内に設定する環境変数を設定する volumes コンテナ内のvolume をmount の設定 ホスト: コンテナ の形式 となる。 コンテナ側の設定は絶対パスである必要がある。 named volume m y s q l d a t a : / v a r / l i b / m y s q l ホスト側に名前だけで指 定する docker が管理するvolume を作成することが出来、 コンテナが削除された時もvolume が永続化できる。 https://docs.docker.com/engine/admin/volumes/volume s/ 38

Slide 39

Slide 39 text

build Dockerfile を利用して作成したimage を利用する場合に利用 context Dockerfile を実行するdirectory dockerfile ‑ build に利用するdockerfile の場所指定 volumes docker named volume の指定 39

Slide 40

Slide 40 text

例のdocker‑compose.yml の解説 docker‑compose のversion は3 sercives( コンテナの数) はmysql とserver の二つ m y s q l d a t a という名前のdocker named volume を一つ作成する docker の名前解決について docker‑compose version 2 以降を使っている場合は s e r v i c e s 以 下に記載されている s e r v i c e 名で各々 のコンテナは名前解決する ことができます。 40

Slide 41

Slide 41 text

mysql コンテナ service の名前は m y s q l image は m y s q l 5 . 7 を利用 コンテナの3306 ポー トをホストのlocalhost の3306 ポー トに ポー トフォワー ディングを行っている 環境変数に M Y S Q L _ A L L O W _ E M P T Y _ P A S S W O R D を設定し、root ユ ー ザー のpassword を無効化している。 コンテナ側のmysql のディレクトリ(/var/lib/mysql) にdocker named volume の m y s q l d a t a をmount している コンテナのディレクトリ / d o c k e r - e n t r y p o i n t - i n i t d b . d に ホストの . / d o c k e r / d b _ i n i t をmount / d o c k e r - e n t r y p o i n t - i n i t d b . d にsql ファイルを設置 するとcontainer 作成時に実行される 41

Slide 42

Slide 42 text

php コンテナ service の名前は s e r v e r Dockerfile は d o c k e r / s e r v e r / D o c k e r f i l e を利用してimage を作成する Dockerfile の実行ディレクトリはdocker‑compose を実行した current directory current directory をコンテナ内の / v a r / w w w / s r c にmount す る コンテナの80 ポー トをホストのlocalhost の80 ポー トにポー ト フォワー ディングを行っている 42

Slide 43

Slide 43 text

docker‑compose でのコンテナの起動方法 d o c k e r - c o m p o s e u p - d で各コンテナの起動ができます。 u p が C r e a t e a n d s t a r t c o n t a i n e r s コンテナの作成と起動の 実行 - d が option で D e t a c h e d m o d e : R u n c o n t a i n e r s i n t h e b a c k g r o u n d , p r i n t n e w c o n t a i n e r n a m e s I n c o m p a t i b l e w i t h - - a b o r t - o n - c o n t a i n e r - e x i t . Detached mode で起動、 - - a b o r t - o n - c o n t a i n e r - e x i t が有効かつバックグラウンドで container が起動します。 docker‑compose ps 各contaier の起動状況の確認 ブラウザからlocalhost にアクセスして起動を確認する 43

Slide 44

Slide 44 text

パッケー ジ管理ツー ル 44

Slide 45

Slide 45 text

パッケー ジ管理システム 最近のフレー ムワー ク、 もしくは開発の場合外部からmodule を利用 する場合はパッケー ジ管理システムを利用することが普通になって いるので、docker 環境にmodule をinstall の考慮も開発環境の構築に は必須です。 有名なパッケー ジ管理ツー ル php composer node npm, yarn ruby gem python pip 45

Slide 46

Slide 46 text

install 方法 今回の場合はphp コンテナに対して、 実行する必要があるので d o c k e r - c o m p o s e e x e c s e r v e r p h p c o m p o s e r . p h a r i n s t a l l と実行する。 e x e c E x e c u t e a c o m m a n d i n a r u n n i n g c o n t a i n e r でコン テナの中に対してコマンドを実行します。 s e r v e r がdocker‑compose.yml で記載したservice 名の指定になり ます。 p h p c o m p o s e r . p h a r i n s t a l l がcontainer の中で実行されるコマ ンドです 例えば、 コンテナの中でbash を実行したい場合は d o c k e r - c o m p o s e e x e c s e r v e r / b i n / b a s h と実行します。 46

Slide 47

Slide 47 text

活用例 47

Slide 48

Slide 48 text

テストコー ド CI 環境 circleCI CI の実行環境にdocker を利用することができるので、 開発環境 用に用意したDocker やdocker‑compose ファイルをテスト実行 に利用することができる 実際のDB に接続する部分をdocker を利用し、 結合テストを実施 48

Slide 49

Slide 49 text

外部環境のmock 化 dockerhub などでAWS の機能などを再現(fake) するsoftware が入っ たイメー ジがあるので、 アプリケー ションコー ドが入ったコンテナ と連携することで実際のAWS サー ビスと連携せずにテストすること ができる localstack https://hub.docker.com/r/localstack/localstack/ docker の本番環境利用 docker のimage を本番で利用する場合は開発環境用に構築した Dockerfile を本番で実行する環境としても利用することができる。 49

Slide 50

Slide 50 text

余談 50

Slide 51

Slide 51 text

最近のDocker 社の動向 MTA,Docker Enterprise Edition https://www.xlsoft.com/jp/blog/blog/2017/05/03/post‑937/ https://www.docker.com/enterprise‑edition Moby Project の発足 https://knowledge.sakura.ad.jp/11068/ AWS EKS, Fargate の発表 https://aws.amazon.com/jp/eks/?nc2=h_m1 https://aws.amazon.com/jp/fargate/?nc2=h_mo 51

Slide 52

Slide 52 text

参考資料 https://docs.docker.com/engine/docker‑overview/ 52

Slide 53

Slide 53 text

ありがとうございました 53