Dockerのことが多分わかるハンズオン

 Dockerのことが多分わかるハンズオン

6d64a4d4ab6201f2ce57e3befc687785?s=128

Yoshiki Kobayashi

June 13, 2020
Tweet

Transcript

  1. Dockerのことが 多分わかるハンズオン Yoshiki Kobayashi 2020/06/28

  2. Hello World!! 自称なんでも屋。好きなAWSのサービスはLambda。 好きな言語はJavaScriptとRuby。Nintendo Switch難民。 最近転職しました。 Name : Yoshiki Kobayashi

    @yoshi0202 @codeplumdev https://code-plum.dev
  3. モダンな技術って 憧れるよねぇ〜

  4. 溢れんばかりのモダンなロゴ

  5. そんな中でも今日は

  6. この人に 注目していきます

  7. Dockerのハンズオン やるよ!!!!!

  8. でもその前に、 Docker is 何

  9. Dockerとは Docker(ドッカー)は、コンテナ仮想化を用いてアプリケーションを開発・配 置・実行するためのオープンソースソフトウェアあるいはオープンプラット フォームである。 Dockerはコンテナ仮想化を用いたOSレベルの仮想化(英語版)によりアプ リケーションを開発・実行環境から隔離し、アプリケーションの素早い提供を 可能にする。かつその環境自体をアプリケーションと同じようにコード(イ メージ)として管理可能にする。Dockerを開発・テスト・デプロイに用いること で「コードを書く」と「コードが製品として実行される」間の時間的ギャップを大 きく短縮できる。

    by wikipedia
  10. は?

  11. 3行でいうと 差異ない環境が 誰でも作れて かつ早い ってこと

  12. 使うとわかる。 めっちゃ便利。

  13. 今までの環境構築 • サーバを起動する • 必要なミドルウェアをインストールする(これだけでハードル高い) • エラーが出る • ミドルウェアの設定をする(都度ググる) •

    エラーがでる • アプリケーションデプロイする(これもしんどい) • エラーがでる • 解決する、またエラーがでる
  14. めんどくさい & 失敗すると環境が 汚れる

  15. Dockerを使うと これだけで終わる docker-compose up ※誰かが頑張って初期設定しなきゃいけないよ

  16. みんなが幸せになれる ※誰かが頑張って初期設定しなきゃいけないよ

  17. それでは試しに dockerを使って、ローカル環境にNginxを起動してみよう! ターミナルでこれを実行! $ docker run -it --rm -p 80:80

    nginx:latest その後、ブラウザで「localhost:80」にアクセスしてみよう!
  18. こんな画面が出ましたか?

  19. Nginxが起動できた

  20. では次に ターミナルでCtrl + c を入力しコンテナを終了してみよう! コンテナ終了と共にブラウザからアクセスができなくなるはず。

  21. これで跡形もなく、 Nginxは消えた…

  22. ローカル環境が 汚くならない なぜならそもそもNginxを インストールしていないから

  23. では早速 Dockerの基本的な使い方 の前に、、、

  24. コンテナ is 何

  25. コンテナとは • Dockerエンジンの上に立つ一つの箱 • 箱の中には指定したもの(さっきの例だとNginx)が入ってる • コンテナに何を入れるか、を考える

  26. 簡単に言うと マシン内の入れ物に 任意の物を入れられる 便利な箱

  27. もちろん 箱をカスタマイズ することも可能

  28. それではやってみよう FROM ubuntu:latest CMD echo "Hello World!" 適当な場所でDockerfileという名前でファイルを作成し、下記内容を入力 $ docker

    build -t dockerhandson:latest ビルドコマンドを実行 $ docker run dockerhandson:latest Hello World! 起動コマンドを実行
  29. それぞれの説明 FROM ubuntu:latest # FROMでベースイメージを決める。今回だと ubuntuをベースイメージで利用。 # https://hub.docker.com/_/ubuntu # 他のOSとかも色々選べるのでdockerhubを漁ってみることをおすすめ

    CMD echo "Hello World!" # コンテナの一番最後で実行するコマンドを CMDで定義 # 今回だとechoコマンドを最後に実行するように定義してあげてる # なので、実行するとHello World!が出力されていた Dockerfile
  30. それぞれの説明 $ docker build -t dockerhandson:latest docker build でビルドコマンドが実行できる -t

    オプションでタグ付けが可能。 {コンテナ名}:{バージョン}って感じでタグ付けして管理する。 バージョン名は省略可能だけど、省略すると latestが自動的につけられる ビルドコマンド
  31. それぞれの説明 $ docker run dockerhandson:latest docker run で起動できる。 ここでも{コンテナ名}:{バージョン}でコンテナを指定して起動 Dockerfileの内容に基づいてビルドされているため、コンテナの最後で

    echoが実行される 起動コマンド
  32. 既存のベースイメージを利 用してカスタマイズが完了

  33. コンテナのベストプラクティス • 1コンテナ、1プロセス • Scrap & Build(作っては壊す) • 毎回ビルドしてあげることで常に最新の状態でメン バーに共有できる

  34. さてここでいくつかの 疑問

  35. 1コンテナ1プロセスっ てことは、 プロセス分docker run するんか?

  36. 1コンテナ1プロセス? FROM nginx:latest Nginx,MySQL,Node.jsを起動するとなると、こんな感じ? FROM mysql:latest FROM node:latest $ docker

    build -t dockerhandson_nginx:latest . $ docker build -t dockerhandson_mysql:latest . $ docker build -t dockerhandson_node:latest . $ docker run dockerhandson_nginx:latest $ docker run dockerhandson_mysql:latest $ docker run dockerhandson_node:latest
  37. いや、純粋にめんどく さいな?

  38. docker-compose を使おう

  39. Dockerfileとdocker-compose.yml ①Dockerfile 一つ一つのコンテナの詳細が書かれ たファイル ②docker-compose.yml 複数コンテナを管理するファイル

  40. やってみよう version: "3.7" # dcoker-compose.ymlのバージョンを指定 services: # サービス内にコンテナ別の項目を記載していく web: image:

    nginx:1.18 # nginxのイメージを指定、{ベースイメージ}:{バージョン}の形式 container_name: handson_web # ビルドされた時のコンテナ名を指定 ports: - 80:80 # ローカルの80ポートをコンテナ内にフォワーディング db: image: mysql:5.7 # mysqlのイメージを指定 container_name: handson_db # 上と同じくコンテナ名 environment: # コンテナ内に環境変数を渡す。本来はパスワードはあんまり ‍♂ MYSQL_ROOT_PASSWORD: pass Nginx,MySQLを起動するdocker-compose.ymlを書いてみる 記述が終わったらdocker-compose up で起動!
  41. docker-compose up だけで複数コンテナが 起動した 楽ちん

  42. これでDockerを使って いろんなことができ る!

  43. あれ、、、 でも、、、

  44. ソースコードってどう やってコンテナの中に 持っていけば良い の?

  45. 個人的によく使う パターンとしては二種 類あります

  46. コンテナ内へのソースコード移動 ①Dockerfileに書く →本番環境での運用時におすすめ ②コンテナ起動時にマウントする →開発時にオススメ簡単

  47. 今回は②のパターンを 試すよ!

  48. やってみよう① version: "3.7" # dcoker-compose.ymlのバージョンを指定 services: # サービス内にコンテナ別の項目を記載していく app: build:

    . container_name: handson_rails ports: - 3000:3000 volumes: - ./rails:/opt/rails tty: true stdin_open: true Dockerfileを書き換える(Rails6系はwebpackerがめんどくさいので5系で許して) FROM ruby:2.6 RUN apt update && apt install -y nodejs RUN gem install rails -v 5.2 WORKDIR /opt/rails docker-compose.ymlを書き換える
  49. やってみよう② $ pwd /opt/rails $ rails new handson コンテナビルドした後に、コンテナ内にログインする! $

    docker-compose build app $ docker-compose run app bash ここでrails new すると・・・
  50. ローカルにrails newし た時のファイルができ てる

  51. もうちょっと書き換える コンテナ実行時にいくつかやることがあるので、スクリプトが実行されるように修正する railsのプログラムディレクトリ (今回だとrails/handson 内)に[entrypoint.sh]を作成 #!/bin/bash rm -fr tmp/pids #Railsの嫌いポイント。

    rails s -b 0.0.0.0 Dockerfileもちょっと修正。コンテナビルド時に bundle installが実行されるようにする。 FROM ruby:2.6 RUN apt update && apt install -y nodejs RUN gem install rails -v '5.2' WORKDIR /opt/rails/handson COPY rails/handson/Gemfile ./Gemfile COPY rails/handson/Gemfile.lock ./Gemfile.lock RUN bundle install CMD sh entrypoint.sh
  52. いよいよ最後 もう一回ビルドして・・・ $ docker-compose build app 起動‍♀ $ docker-compose up

    ブラウザでlocalhost:3000にアクセスすると・・・
  53. やったー

  54. さっきまで何をしていたか詳細 1. rails new を実行するための仮コンテナを作って 2. そのコンテナを起動 3. rails newを実行すると

    4. ローカル内に雛形ファイルが作成される 5. Railsを起動するためのコンテナに作りかえて 6. 起動!!!!
  55. ①仮コンテナの作成 各種コンテナはそもそもアプリケーションを実行する環境 なので、最初の雛形ファイルを作る実行環境用意してあげる必要がある ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用のコンテナ それぞれが

    実行環境に なっているの で、プログラ ムがないと 実行できな い!
  56. ①仮コンテナの作成 Nginx、DBはすでに実行するアプリケーションが存在しているので、 Railsについては初期ファイル作成用の仮コンテナを用意してあげる (rails new 実行用) ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ

    DB用のコンテナ Rails用の 仮コンテナ (railsコマンドがイン ストールされている)
  57. ②仮コンテナを起動 Railsの雛形作成用の仮コンテナを起動。 起動するときに、ローカルのボリュームをコンテナにマウントする。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 仮コンテナ

    ローカルのPC ~/hogehoge/fuga Railsの仮コンテナ /opt/hogehoge
  58. ③rails new 実行 仮のコンテナ内で、ローカルPCのボリュームがマウントされている パス内でrails newを実行する。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ

    DB用のコンテナ Rails用の 仮コンテナ PC ⇆ コンテナで共 有しているパス内で rails new を実行!
  59. ④ローカルにファイルが作成 ローカルPC内とコンテナ内でデータが共有されているため、ローカルPC内に データが作られる。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 仮コンテナ

    Railsの雛形ファイル 各種 Controller Model View
  60. ⑤起動コンテナに作り替える ローカルに雛形ができ実行できる準備ができたので、プログラムが起動できるコ ンテナに作り替える。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 実行コンテナ

    Railsの雛形ファイル 各種 Controller Model View プログラムが 存在するの で実行する 準備が整っ た!
  61. ⑥起動! Railsが起動する ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 実行コンテナ Railsの雛形ファイル

    各種 Controller Model View
  62. 諸々のコマンドの説明 • docker-compose build [名前] ◦ docker-composeのservice別にコンテナをビルドする ◦ rails +

    nuxtみたいな環境で、railsだけビルドしたい時とかに便利 • docker-compose run コンテナ名 コマンド ◦ 起動中のコンテナにログインするコマンド ◦ コンテナ内で作業するときとかに使う • docker-compose up もしくは docker-compose down ◦ docker-compose.ymlの設定内容でコンテナを起動、停止 ◦ Ctrl + cでも終了はできる ◦ ゴミが残ってしまうのでdownで消した方が良い
  63. • コンテナ内でmigrate実行したい! ◦ docker-compose run app rails db:migrate • どんなコンテナが起動しているか確認したい!

    ◦ docker ps -a • コンテナ内で作業したい!(再掲、個人的にめっちゃ使う) ◦ docker-compose run app bash ユースケースごとのコマンド
  64. 本日のハンズオンはこ こまで!!!

  65. • コンテナの概念 • dockerの基礎的な使い方、コマンド • Dockerfile、docker-compose.ymlの基本的な書き方 • あとはこれを参考にいろんなコンテナを作ってみるべし! 今日覚えたこと

  66. • 聞く前と聞いた後で、理解度的にどうでしたか??? • よかったところ、逆に悪かったところガンガンフィードバックください! • わかりづらかったところは直接質問してもらってもOKです‍♂ • 定期的にこんな感じでやっていこうと考えてます • コミュニティでやりたいなぁと

    • ぜひ皆さんのスライドも見たい!!!!!! • アウトプット = 最強のインプットなので、ぜひチャレンジを!!! これ聞いてハンズオンやってみて
  67. 終わり!!!!! 最後に好きな絵文字 で締めます To be continued … ?