Upgrade to Pro — share decks privately, control downloads, hide ads and more …

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

yutachaos
December 22, 2017

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

「2017/12/21【サポーターズ勉強会】Dockerで開発環境構築してみよう」で発表したスライド

https://supporterzcolab.com/event/244

yutachaos

December 22, 2017
Tweet

More Decks by yutachaos

Other Decks in Programming

Transcript

  1. 自己紹介 木村 勇太 サー バー サイドエンジニア プログラミング言語 PHP, node, java

    , Ruby 主にAWS を使ったシステム構築してます。 最近はscala, spark いじり中 re:Invent 2017 行ってきました! 2
  2. 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
  3. 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
  4. docker で開発環境構築をするメリット・ デメリット メリット Docker を利用出来る環境がセットアップされていれば、 すぐに同じ 環境構築が出来る host 側の環境を汚さずに環境構築が出来る。

    すぐに消して同じものを作れる( 冪等性) 必要になる環境毎にcontainer を作ることができるので、 php,ruby,MySql など複数の環境が必要になる場合の依存性を 切り分け、 追加、 削除が行いやすい。 本番環境でdocker を利用する場合、 本番で実際に使うimage を開発 環境でも使えるため環境との差異を減らすことができる 10
  5. デメリット Docker の知識が必要になる 公式でDocker for mac, Docker for windows など各種ツー

    ルが配布 されているが、 まだまだ環境差異がある( 特にMac のファイルシステ ム周り) メモリやデー タのサイズ 開発するにあたって必要な環境のimage やcontainer を作成する 分の容量が必要になるので、 結構サイズを取る場合が多い。 11
  6. 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
  7. docker 開発環境構築手順 1. 各環境の構成 2. image の選定 3. 各コンテナ環境に必要なmodule、 初回処理を考える(

    環境定義の書 き換え、DB migration など) 4. ( 必要なものは)Dockerfile を記述し必要なmodule を入れる 5. docker‑compose.yml を作成する 6. 環境構築のために必要なコマンドをまとめたdocument を作成す る。 18
  8. 今回必要な環境 symfony2 を利用したアプリケー ション。 PHP を利用するコンテナ DB コンテナ MySQL を利用するコンテナ

    確認するべき情報 PHP のversion,module, 設定 PHP version 7.0 DB のversion, 設定 MySQL 5.7 21
  9. 利用するimage PHP コンテナ amazon linux の公式を利用 php 単体の環境が欲しいだけの場合はphp 公式を利用した方が 良いが、

    今回は開発環境はdocker、 本番環境はEC2 を想定して いるためamazon linux の公式を利用 https://hub.docker.com/_/amazonlinux/ DB コンテナ MySQL の公式を利用 https://hub.docker.com/_/mysql/ 25
  10. PHP コンテナ amazon linux php のインストー ル php の設定 apache

    の設定 apache の起動 DB コンテナ MySQL DB のユー ザー 作成、 設定 DB migration 27
  11. 例 # 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
  12. Dockerfile 解説 FROM 利用するimage の名前を指定し、registry からDL する RUN コマンドを実行する WORKDIR

    image の実行のルー トディレクトリを変更する ENTRYPOINT container 起動時に実行されるコマンド 31
  13. 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
  14. 例 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
  15. 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
  16. 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
  17. 例の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
  18. 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
  19. 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
  20. 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
  21. パッケー ジ管理システム 最近のフレー ムワー ク、 もしくは開発の場合外部からmodule を利用 する場合はパッケー ジ管理システムを利用することが普通になって いるので、docker

    環境にmodule をinstall の考慮も開発環境の構築に は必須です。 有名なパッケー ジ管理ツー ル php composer node npm, yarn ruby gem python pip 45
  22. 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
  23. テストコー ド CI 環境 circleCI CI の実行環境にdocker を利用することができるので、 開発環境 用に用意したDocker

    やdocker‑compose ファイルをテスト実行 に利用することができる 実際のDB に接続する部分をdocker を利用し、 結合テストを実施 48
  24. 外部環境のmock 化 dockerhub などでAWS の機能などを再現(fake) するsoftware が入っ たイメー ジがあるので、 アプリケー

    ションコー ドが入ったコンテナ と連携することで実際のAWS サー ビスと連携せずにテストすること ができる localstack https://hub.docker.com/r/localstack/localstack/ docker の本番環境利用 docker のimage を本番で利用する場合は開発環境用に構築した Dockerfile を本番で実行する環境としても利用することができる。 49
  25. 最近の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