Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

モダンな技術って 憧れるよねぇ〜

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

そんな中でも今日は

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

でもその前に、 Docker is 何

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

は?

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

今までの環境構築 ● サーバを起動する ● 必要なミドルウェアをインストールする(これだけでハードル高い) ● エラーが出る ● ミドルウェアの設定をする(都度ググる) ● エラーがでる ● アプリケーションデプロイする(これもしんどい) ● エラーがでる ● 解決する、またエラーがでる

Slide 14

Slide 14 text

めんどくさい & 失敗すると環境が 汚れる

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

それでは試しに dockerを使って、ローカル環境にNginxを起動してみよう! ターミナルでこれを実行! $ docker run -it --rm -p 80:80 nginx:latest その後、ブラウザで「localhost:80」にアクセスしてみよう!

Slide 18

Slide 18 text

こんな画面が出ましたか?

Slide 19

Slide 19 text

Nginxが起動できた

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

コンテナ is 何

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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

Slide 27

Slide 27 text

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

Slide 28

Slide 28 text

それではやってみよう FROM ubuntu:latest CMD echo "Hello World!" 適当な場所でDockerfileという名前でファイルを作成し、下記内容を入力 $ docker build -t dockerhandson:latest ビルドコマンドを実行 $ docker run dockerhandson:latest Hello World! 起動コマンドを実行

Slide 29

Slide 29 text

それぞれの説明 FROM ubuntu:latest # FROMでベースイメージを決める。今回だと ubuntuをベースイメージで利用。 # https://hub.docker.com/_/ubuntu # 他のOSとかも色々選べるのでdockerhubを漁ってみることをおすすめ CMD echo "Hello World!" # コンテナの一番最後で実行するコマンドを CMDで定義 # 今回だとechoコマンドを最後に実行するように定義してあげてる # なので、実行するとHello World!が出力されていた Dockerfile

Slide 30

Slide 30 text

それぞれの説明 $ docker build -t dockerhandson:latest docker build でビルドコマンドが実行できる -t オプションでタグ付けが可能。 {コンテナ名}:{バージョン}って感じでタグ付けして管理する。 バージョン名は省略可能だけど、省略すると latestが自動的につけられる ビルドコマンド

Slide 31

Slide 31 text

それぞれの説明 $ docker run dockerhandson:latest docker run で起動できる。 ここでも{コンテナ名}:{バージョン}でコンテナを指定して起動 Dockerfileの内容に基づいてビルドされているため、コンテナの最後で echoが実行される 起動コマンド

Slide 32

Slide 32 text

既存のベースイメージを利 用してカスタマイズが完了

Slide 33

Slide 33 text

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

Slide 34

Slide 34 text

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

Slide 35

Slide 35 text

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

Slide 36

Slide 36 text

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

Slide 37

Slide 37 text

いや、純粋にめんどく さいな?

Slide 38

Slide 38 text

docker-compose を使おう

Slide 39

Slide 39 text

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

Slide 40

Slide 40 text

やってみよう 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 で起動!

Slide 41

Slide 41 text

docker-compose up だけで複数コンテナが 起動した 楽ちん

Slide 42

Slide 42 text

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

Slide 43

Slide 43 text

あれ、、、 でも、、、

Slide 44

Slide 44 text

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

Slide 45

Slide 45 text

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

Slide 46

Slide 46 text

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

Slide 47

Slide 47 text

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

Slide 48

Slide 48 text

やってみよう① 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を書き換える

Slide 49

Slide 49 text

やってみよう② $ pwd /opt/rails $ rails new handson コンテナビルドした後に、コンテナ内にログインする! $ docker-compose build app $ docker-compose run app bash ここでrails new すると・・・

Slide 50

Slide 50 text

ローカルにrails newし た時のファイルができ てる

Slide 51

Slide 51 text

もうちょっと書き換える コンテナ実行時にいくつかやることがあるので、スクリプトが実行されるように修正する 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

Slide 52

Slide 52 text

いよいよ最後 もう一回ビルドして・・・ $ docker-compose build app 起動‍♀ $ docker-compose up ブラウザでlocalhost:3000にアクセスすると・・・

Slide 53

Slide 53 text

やったー

Slide 54

Slide 54 text

さっきまで何をしていたか詳細 1. rails new を実行するための仮コンテナを作って 2. そのコンテナを起動 3. rails newを実行すると 4. ローカル内に雛形ファイルが作成される 5. Railsを起動するためのコンテナに作りかえて 6. 起動!!!!

Slide 55

Slide 55 text

①仮コンテナの作成 各種コンテナはそもそもアプリケーションを実行する環境 なので、最初の雛形ファイルを作る実行環境用意してあげる必要がある ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用のコンテナ それぞれが 実行環境に なっているの で、プログラ ムがないと 実行できな い!

Slide 56

Slide 56 text

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

Slide 57

Slide 57 text

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

Slide 58

Slide 58 text

③rails new 実行 仮のコンテナ内で、ローカルPCのボリュームがマウントされている パス内でrails newを実行する。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 仮コンテナ PC ⇆ コンテナで共 有しているパス内で rails new を実行!

Slide 59

Slide 59 text

④ローカルにファイルが作成 ローカルPC内とコンテナ内でデータが共有されているため、ローカルPC内に データが作られる。 ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 仮コンテナ Railsの雛形ファイル 各種 Controller Model View

Slide 60

Slide 60 text

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

Slide 61

Slide 61 text

⑥起動! Railsが起動する ローカルのPC(railsコマンドがインストールされていないと仮定 ) ローカルのDocker Nginx用のコンテナ DB用のコンテナ Rails用の 実行コンテナ Railsの雛形ファイル 各種 Controller Model View

Slide 62

Slide 62 text

諸々のコマンドの説明 ● docker-compose build [名前] ○ docker-composeのservice別にコンテナをビルドする ○ rails + nuxtみたいな環境で、railsだけビルドしたい時とかに便利 ● docker-compose run コンテナ名 コマンド ○ 起動中のコンテナにログインするコマンド ○ コンテナ内で作業するときとかに使う ● docker-compose up もしくは docker-compose down ○ docker-compose.ymlの設定内容でコンテナを起動、停止 ○ Ctrl + cでも終了はできる ○ ゴミが残ってしまうのでdownで消した方が良い

Slide 63

Slide 63 text

● コンテナ内でmigrate実行したい! ○ docker-compose run app rails db:migrate ● どんなコンテナが起動しているか確認したい! ○ docker ps -a ● コンテナ内で作業したい!(再掲、個人的にめっちゃ使う) ○ docker-compose run app bash ユースケースごとのコマンド

Slide 64

Slide 64 text

本日のハンズオンはこ こまで!!!

Slide 65

Slide 65 text

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

Slide 66

Slide 66 text

● 聞く前と聞いた後で、理解度的にどうでしたか??? ● よかったところ、逆に悪かったところガンガンフィードバックください! ● わかりづらかったところは直接質問してもらってもOKです‍♂ ● 定期的にこんな感じでやっていこうと考えてます ● コミュニティでやりたいなぁと ● ぜひ皆さんのスライドも見たい!!!!!! ● アウトプット = 最強のインプットなので、ぜひチャレンジを!!! これ聞いてハンズオンやってみて

Slide 67

Slide 67 text

終わり!!!!! 最後に好きな絵文字 で締めます To be continued … ?