$30 off During Our Annual Pro Sale. View Details »

Dockerで始める開発環境構築

 Dockerで始める開発環境構築

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

More Decks by 虎の穴ラボ株式会社

Other Decks in Technology

Transcript

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

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

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

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

    Toranoana Inc. All Right Reserved. 4 Fantiaの構成
  5. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

    Toranoana Inc. All Right Reserved. そうだ、Docker化しよう 6
  7. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

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

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

    Toranoana Inc. All Right Reserved. • Dockerイメージ • Dockerコンテナ • Dockerレジストリ • Docker Hub • Dockerfile • docker-compose.yml 11 Docker用語
  12. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

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

    Toranoana Inc. All Right Reserved. Dockerの概念図 14
  15. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

    Toranoana Inc. All Right Reserved. docker-composeの概念図 16
  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. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Let's Docker化 19
  20. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 20 Fantiaの開発環境
  21. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. 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 # 初期設定用のスクリプト
  23. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. コンテナ内のディレクトリを ホス ト側にマウントする方法がなかった 23 ハマりポイントその1
  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
  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 原因
  26. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

    Toranoana Inc. All Right Reserved. 最終的に作った開発環境イメージ 27 Before... After...
  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
  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 # 初期設定用のスクリプト
  30. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

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

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

    Toranoana Inc. All Right Reserved. なので、以下のように命令を一行にまとめる ことで解決 33 ...(省略)... RUN gem install bundler && bundle install # 命令を一行にまとめる 解決策
  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
  35. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

    Toranoana Inc. All Right Reserved. Docker Hubの公式イメージのRubyのデ フォルトエンコーディングがUS-ASCII になっているのが原因 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 ...(省略)... 解決策
  37. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

    Toranoana Inc. All Right Reserved. Docker Hubの公式イメージを使用して いる場合、デフォルトのタイムゾーンは UTC(協定世界時)になっている 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」に設定を追加する ことで解決
  40. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

    Toranoana Inc. All Right Reserved. 実際にDockerで環境を 起動してみる 41
  42. 虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019

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

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