Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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環境情報

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

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

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019 Toranoana Inc. All Right Reserved. docker-composeの概念図 16

Slide 17

Slide 17 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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

Slide 18

Slide 18 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019 Toranoana Inc. All Right Reserved. 21

Slide 22

Slide 22 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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 # 初期設定用のスクリプト

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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

Slide 25

Slide 25 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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 原因

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019 Toranoana Inc. All Right Reserved. 最終的に作った開発環境イメージ 27 Before... After...

Slide 28

Slide 28 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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

Slide 29

Slide 29 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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 # 初期設定用のスクリプト

Slide 30

Slide 30 text

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

Slide 31

Slide 31 text

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

Slide 32

Slide 32 text

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

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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 ...(省略)... 解決策

Slide 37

Slide 37 text

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

Slide 38

Slide 38 text

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

Slide 39

Slide 39 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 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」に設定を追加する ことで解決

Slide 40

Slide 40 text

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

Slide 41

Slide 41 text

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

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

虎の穴 虎の穴 虎の穴 虎の穴 虎 の穴 虎の穴 Copyright (C) 2019 Toranoana Inc. All Right Reserved. ありがとうござい ました 43