Dockerで始める開発環境構築

 Dockerで始める開発環境構築

【とらのあな主催】オタクが最新技術を追うライトニングトークイベント6回目で発表した資料になります。

Transcript

  1. 1.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Dockerで始める 開発環境構築 〜Fantia編〜 ΦλΫ͕࠷৽ٕज़Λ௥͏ϥΠτχϯάτʔΫΠϕϯτճ໨ 虎の穴ラボ 三井 明楽
  2. 2.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 三井 明楽 • 2018年10月 虎の穴入社 • Fantiaの開発/運用 • 今期のアニメ • 群青のマグメル • 異世界かるてっと • 鬼滅の刃 etc… 2 自己紹介
  3. 3.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. イラストレーター、コスプレイヤー、YouTuberなど 様々なジャンルのクリエイターにご利用いただいている 「月額支援型」クラウドファウンディングサービス。 • クリエイター ◦ 自身のファンクラブを開設 ◦ 月額プランと毎月の特典を自由決められる • ファン ◦ 支援額に応じた「ファン限定特典」が得られる URL:https://fantia.jp/ 3 Fantia(ファンティア)とは
  4. 4.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 4 Fantiaの構成
  5. 5.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 5 Fantiaの開発環境 毎回1つずつ起動とか… (ノ゚д゚)ノ 彡┻━┻ ヤッテラレルカ !!
  6. 6.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. そうだ、Docker化しよう 6
  7. 7.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 主にDocker入門者がハマりそうなポ イントを抜粋してご紹介 7 今回は 時間も限られているので...
  8. 8.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • Fantiaとは • Let's Docker化 ◦ Dockerとは ◦ Docker環境情報 ◦ Docker用語 ◦ Docker化する範囲(Fantia開発環境) ◦ ハマりポイント x 4 ◦ まとめ • 今後の予定 8 もくじ
  9. 9.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • Docker 社が開発しているコンテナ型の仮 想環境を作成・配布・実行するためのオ ープンソー スのプラットフォーム • 従来の仮想マシンに比べて軽量で動作が 高 速(Linux のコンテナ技術を利用) 9 Dockerとは
  10. 10.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • ホストOS : macOS Mojave 10.14.3 • Docker環境 : Docker Desktop for Mac ◦ Docker version 18.09.2 ◦ docker-compose version 1.23.2 ◦ Compose file format version 3 10 Docker環境情報
  11. 11.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • Dockerイメージ • Dockerコンテナ • Dockerレジストリ • Docker Hub • Dockerfile • docker-compose.yml 11 Docker用語
  12. 12.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • Dockerイメージ Dockerコンテナを作成するためのベース となる設計図のようなもの • Dockerコンテナ アプリケーションとその実行環境がまと まった箱のようなもの 12 Docker用語解説1
  13. 13.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • Dockerレジストリ Dockerイメージを保存して配布する場所 • Docker Hub Docker公式のDockerレジストリ 13 Docker用語解説2
  14. 14.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Dockerの概念図 14
  15. 15.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. • Dockerfile 自前でDocker イメージを作成するための 設定ファイル • docker-compose.yml 複数のコンテナを管理するための設定フ ァイル 15 Docker用語解説3
  16. 16.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. docker-composeの概念図 16
  17. 17.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Dockerfileの例 FROM ruby:2.5.1 RUN apt-get update && ¥ apt-get install -y mysql-client --no-install-recommends && ¥ rm -rf /var/lib/apt/lists/* RUN mkdir /api ENV APP_ROOT /api ENV RUBYOPT -EUTF-8 WORKDIR $APP_ROOT ADD ./src $APP_ROOT RUN gem install bundler && bundle install 17
  18. 18.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Dockerfileの例 version: "3" # versionによって文法が違うので注意 services: api: tty: true container_name: api build: context: ./api dockerfile: Dockerfile-Api # 自前で作成したイメージを指定 (...省略...) redis: image: redis:3.2.11 # 公式リポジトリのイメージを指定 ports: - "6379:6379" 18
  19. 19.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Let's Docker化 19
  20. 20.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 20 Fantiaの開発環境
  21. 22.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 全体のディレクトリ構成 22 fantia_dev/ ├── api # 決済API用ディレクトリ │ ├── Dockerfile-Api # APIサーバの設定ファイル │ └── src # 決済APIのソースコード(Gitリポジトリからチェックアウト) ├── docker-compose.yml # 各コンテナとその構成を管理する設定ファイル ├── fantia # Fantia用ディレクトリ │ ├── Dockerfile-Fantia # FantiaのAPサーバの設定ファイル │ ├── db │ │ ├── Dockerfile-FantiaDB # FantiaのDBサーバの設定ファイル │ │ └── my.cnf # MySQLの設定ファイル │ └── src # Fantiaのソースコード(Gitリポジトリからチェックアウト) └── setup.sh # 初期設定用のスクリプト
  22. 23.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. コンテナ内のディレクトリを ホス ト側にマウントする方法がなかった 23 ハマりポイントその1
  23. 24.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 最初に作ろうとした 開発環境イメージ 24 FROM ruby:2.5.1 ...(省略)... RUN git clone https://github.com/hogehogexyz/api.git ENV APP_ROOT /api ...(省略)... ▼Dockerfile-Api
  24. 25.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. よくよく調べてみると公式ドキュメントにも書い てあった。 https:// docs.docker.com/engine/reference/builder/#volume > you can’t mount a host directory from within the Dockerfile. <理由> イメージを配布した際にユーザ ーが同じディレクトリ構成を強要され てしまい、Docker を 使用する利点である移植性が損なわれるため 25 原因
  25. 26.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 解決策 26 ...(省略)... RUN mkdir /api # マウント先となるディレクトリを作成 ENV APP_ROOT /api ADD ./src $APP_ROOT # ホスト側のソースコードをマウント ...(省略)... ▼変更後のDockerfile-Api 最終的に作った開発環境イメージ
  26. 27.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 最終的に作った開発環境イメージ 27 Before... After...
  27. 28.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 28 初期設定用のシェルスクリプ トも作った ...(省略)... API_SRC_PATH=./api/src # ソースコードがない場合はリポジトリから取得 if [ ! -e $API_SRC_PATH ]; then echo “[Checkout API src]" # Gitリポジトリから決済APIのソースコードをチェックアウト git clone https://github.com/hogehogexyz/api.git $API_SRC_PATH else echo "[Skip checkout API src]" fi ...(省略)... echo "[Build images]" docker-compose build echo "[Setup API Database]" docker-compose run api bundle exec rake db:create db:migrate db:seed ...(省略)... echo "[Start Services]" docker-compose up -d
  28. 29.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 全体のディレクトリ構成 29 fantia_dev/ ├── api # 決済API用ディレクトリ │ ├── Dockerfile-Api # APIサーバの設定ファイル │ └── src # 決済APIのソースコード(Gitリポジトリからチェックアウト) ├── docker-compose.yml # 各コンテナとその構成を管理する設定ファイル ├── fantia # Fantia用ディレクトリ │ ├── Dockerfile-Fantia # FantiaのAPサーバの設定ファイル │ ├── db │ │ ├── Dockerfile-FantiaDB # FantiaのDBサーバの設定ファイル │ │ └── my.cnf # MySQLの設定ファイル │ └── src # Fantiaのソースコード(Gitリポジトリからチェックアウト) └── setup.sh # 初期設定用のスクリプト
  29. 30.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. DockerfileのRUNコマンドを複数書 いたら意図した動作にならなかった 30 ハマりポイントその2
  30. 31.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 以下のようにbundlerをインストールした後、 bundle installを実行するようにコマンドを書い たところ、bundle install実行時にbundlerが存在 しないと怒られた。 31 ...(省略)... RUN gem install bundler RUN bundle install 問題
  31. 32.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Dockerの仕様で、以下の概念図のように一命令ごとにレイ ヤーを作成しているのが原因 32 原因
  32. 33.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. なので、以下のように命令を一行にまとめる ことで解決 33 ...(省略)... RUN gem install bundler && bundle install # 命令を一行にまとめる 解決策
  33. 34.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 試しに決済APIを叩いたらエラー 「Invalid byte sequence in US-ASCII」 34 ArgumentError: invalid byte sequence in US-ASCII /usr/local/bundle/gems/rack-2.0.6/lib/rack/utils.rb:170:in `gsub' ...(省略)... ハマりポイントその3
  34. 35.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Docker Hubの公式イメージのRubyのデ フォルトエンコーディングがUS-ASCII になっているのが原因 35 原因
  35. 36.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. なので、Dockerfileに以下のようにエン コーディングをUTF-8に変更する設定を 追加することで解決 36 ...(省略)... ENV APP_ROOT /api ENV RUBYOPT -EUTF-8 # RubyのエンコーディングをUTF-8に変更 ADD ./src $APP_ROOT ...(省略)... 解決策
  36. 37.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. タイムゾーンが日本時間じゃなかった 37 ハマりポイントその4
  37. 38.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Docker Hubの公式イメージを使用して いる場合、デフォルトのタイムゾーンは UTC(協定世界時)になっている 38 原因
  38. 39.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 39 解決策 ...(省略)... api_db: image: mysql:5.7 # 公式レジストリのイメージを指定 hostname: "api_db" # 決済APIのDBサーバのホスト名 environment: MYSQL_ALLOW_EMPTY_PASSWORD: "yes" # rootパスワードなしを許可 TZ: "Asia/Tokyo" # タイムゾーンを東京に設定 <-今回追記 ...(省略)... 今回は「docker-compose.yml」に設定を追加する ことで解決
  39. 40.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. まとめ • ソースコードはホスト側からマウントしよう • 依存関係のあるコマンドは一行にまとめよう • 公式のDockerイメージを使用する際の注意事項 – RubyのデフォルトエンコーディングはUS-ASCII – デフォルトタイムゾーンはUTC 40
  40. 41.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 実際にDockerで環境を 起動してみる 41
  41. 42.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 今後の予定 • ユーザー管理システムであるユメノソラIDも Docker化する 42 これ
  42. 43.

    虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. ありがとうござい ました 43