Slide 1

Slide 1 text

Docker入門 Github: @sor4chi 𝕏 Twitter: @monica18_pr

Slide 2

Slide 2 text

今日の目標 Dockerの基本を理解する Dockerを使えるようになる Docker-Composeを使えるようになる

Slide 3

Slide 3 text

A社ではこういう問題が起きているらしい... Aさん: 初めまして、新卒で入社したAです。よろしくお願いし ます。 Bさん: はじめまして、Bです。よろしくお願いします。 Bさん: それでは、システム開発の環境構築をするために、プロ グラムを git clone して、ビルドしてください。 Aさん: はい、わかりました。 ...数十分後...

Slide 4

Slide 4 text

Aさん: すみません、ビルドが失敗してしまいました。 Bさん: えっ、どうしてですか? Aさん: どうやら、私のPCにはJavaが入っていないようです。 Bさん: そうなんですか...。じゃあ、Javaをインストールしてく ださい。 Aさん: はい、わかりました。 ...数十分後...

Slide 5

Slide 5 text

Aさん: Javaのインストールが完了しました。もう一度ビルド してみます。 Aさん: すみません、ビルドが失敗してしまいました。 Architecture mismatch というエラーが出ています。 Bさん: えっ、使ってるPCはWindowsですよね? Aさん: え、Macなんですけど... Bさん: そうなんですか...。じゃあ、Windowsでビルドしてく ださい。 Aさん: いや、用意できないですよ...!!!

Slide 6

Slide 6 text

そんな時にDockerがあれば

Slide 7

Slide 7 text

いろいろなPC環境の開発者が同じ再現環境で開発できる 開発に必要なインストール作業を全てDocker内で完結できる 総じてキャッチアップコストを下げられる

Slide 8

Slide 8 text

Dockerとは

Slide 9

Slide 9 text

Docker(ドッカー)は、コンテナ仮想化を用いてアプリケ ーションを開発・配置・実行するためのオープンプラットフ ォームである。 https://ja.wikipedia.org/wiki/Docker

Slide 10

Slide 10 text

コンテナ仮想化とは

Slide 11

Slide 11 text

コンテナ仮想化(コンテナかそうか、英: OS-level virtualization)とは、オペレーティングシステムのカーネ ルを共有しながら、ユーザ空間を分離する仮想化の手法であ る。 https://ja.wikipedia.org/wiki/OSレベルの仮想化

Slide 12

Slide 12 text

つまり、PCの中に軽量なOSの箱のようなものを仮想的に作っ てその中で作業するようにすれば、そのOSさえ共有できればど こでも動かすことができるため、環境の違いによる問題を解決 できるということ。 この箱のことを コンテナ と呼ぶ。

Slide 13

Slide 13 text

Dockerのインストール

Slide 14

Slide 14 text

Docker Desltop という、Dockerをデスクトップアプリとし て管理できるソフトが便利なので、それをインストールしま す。 https://www.docker.com/get-started/#

Slide 15

Slide 15 text

Windowsの場合は、Docker Desktopの設定項目にWSL2を有 効にする項目があるので、それが有効になっていることを確認 してください。

Slide 16

Slide 16 text

Dockerの基本的な使い方

Slide 17

Slide 17 text

まずはとてもベーシックな使い方です

Slide 18

Slide 18 text

これを実行すると というようなメッセージが表示されます。

Slide 19

Slide 19 text

dockerでは、 docker run というコマンドでコンテナを実 行します。 コンテナ「 hello-world 」を実行したということです。 じゃあ、 hello-world コンテナはどこから来たのでしょう か?

Slide 20

Slide 20 text

コンテナはローカルを参照して、なければDocker Hubからダ ウンロードするようになっており、見てわかるように自分が作 ったコンテナをDocker Hubにアップロードして共有するなん てことができます。

Slide 21

Slide 21 text

Docker Hubは レジストリ と呼ばれるもので、コンテナのイメ ージを保存・共有するためのものです。 もちろん自分自身もレジストリに自作コンテナをアップロード することができます。

Slide 22

Slide 22 text

イメージ

Slide 23

Slide 23 text

コンテナは イメージ から作られます。 イメージは、コンテナの元となるファイルシステムのようなも のです。

Slide 24

Slide 24 text

コンテナは ビルド することができて、イメージからコンテナを 作ることができます。

Slide 25

Slide 25 text

つまり Bさん: コンテナを作る -> イメージをビルド -> イメージをレ ジストリ公開 Aさん: イメージをダウンロード -> コンテナを生成 ということができます。 これでお互いの環境を統一して開発することができますね。

Slide 26

Slide 26 text

イメージのダウンロード

Slide 27

Slide 27 text

Docker Hubにはさまざまな言語やフレームワークのイメージ が公開されています。 例えば、Pythonのイメージをダウンロードしてみましょう。 このイメージは誤解を恐れずにいうと、Pythonの3.9.6がイン ストールされたUbuntu20.04のイメージです。

Slide 28

Slide 28 text

docker pull コマンドでイメージをダウンロードすること ができます。 python:3.9.6 というのは、Pythonの3.9.6のイメージを ダウンロードするという意味です。

Slide 29

Slide 29 text

docker images コマンドで、イメージがダウンロードされ ていることを確認できます。

Slide 30

Slide 30 text

実際にコンテナを実行してみましょう。

Slide 31

Slide 31 text

-it オプションは、コンテナを対話的に実行するためのオプ ションです。 こうすることで、実際にコンテナの中に入って、実際にPython がインストールされているか確認できます。

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

すごくないですか?今までプログラミングをするために毎回手 こずっていた環境構築を、ただDocker Hubで探してきたイメ ージをダウンロードするだけで済ませることができました。

Slide 34

Slide 34 text

Dockerfile

Slide 35

Slide 35 text

イメージをビルドするためには、 Dockerfile というファイル を作成する必要があります。 Dockerfileは、イメージをビルドするための設定ファイルで す。

Slide 36

Slide 36 text

例えば、以下のようなDockerfileを作成します。

Slide 37

Slide 37 text

このDockerfileは、Ubuntu20.04のイメージをベースに、git, vim, curl, wgetをインストールするというものです。

Slide 38

Slide 38 text

このDockerfileをビルドするには、以下のコマンドを実行しま す。

Slide 39

Slide 39 text

-t オプションは、イメージに名前をつけるためのオプション です。 my-ubuntu:20.04 という名前のイメージを作成します。

Slide 40

Slide 40 text

docker images コマンドで、イメージが作成されているこ とを確認できます。

Slide 41

Slide 41 text

コンテナの実行

Slide 42

Slide 42 text

イメージができたので、コンテナを実行してみましょう。

Slide 43

Slide 43 text

もちろん Dockerfile でインストールしたgit, vim, curl, wgetも使えます。 試してみましょう

Slide 44

Slide 44 text

コンテナの停止

Slide 45

Slide 45 text

コンテナを停止するには、 docker stop コマンドを使いま す。

Slide 46

Slide 46 text

もしコンテナIDがわからない場合は、 docker ps コマンド で確認できます。

Slide 47

Slide 47 text

ボリューム

Slide 48

Slide 48 text

コンテナは、コンテナ内で作成したファイルはコンテナが削除 されると一緒に削除されてしまいます。

Slide 49

Slide 49 text

そこで、コンテナの中にファイルを作成しても、ホスト側にも 同じファイルを作成するようにするために、 ボリューム という ものを使います。 ボリュームは、コンテナの中のファイルをホスト側にマウント するためのものです。

Slide 50

Slide 50 text

ボリュームを使うには、 -v オプションを使います。

Slide 51

Slide 51 text

こうすることで、ローカル(ホスト)の設定したディレクトリに あるファイルをコンテナ側にマウントすることができます。 ちなみにマウントは、外部記憶装置などをOSに認識させる状態 のことをい い、今回の場合はホスト側のディレクトリをコンテナ側に外部 記憶装置として認識させているということです。

Slide 52

Slide 52 text

Docker Hubに自作コンテナをアップロード する

Slide 53

Slide 53 text

自作コンテナをDocker Hubにアップロードするには、 docker push コマンドを使います。 アカウント登録など諸々必要になってしまい面倒なのでやりま せん。

Slide 54

Slide 54 text

Docker-Compose

Slide 55

Slide 55 text

Docker-Composeは、複数のコンテナを一括で管理するため のツールです。 例えば、フロントエンドを React 、バックエンドを Go 、 データベースとして MySQL を使う場合など、複数の言語やフ レームワークを同時に使って開発する場合に便利なツールで す。

Slide 56

Slide 56 text

フォーマット

Slide 57

Slide 57 text

Docker-Composeは、 docker-compose.yml というファ イルに設定を記述します。

Slide 58

Slide 58 text

例: React/Go/MySQL

Slide 59

Slide 59 text

設定:build buildはDockerfileがあるディレクトリを指定します。 もし設定しない場合はDocker Composeに記述されたイメージ を参照し、あればそれを使います。

Slide 60

Slide 60 text

設定:ports portsは、ホスト側のポートとコンテナ側のポートを紐づける 設定です。 < ホスト側のポート>:< コンテナ側のポート> という形式で記 述します。 これを ポートフォワーディング と呼びます。 例えば、 80:3000 という設定は、ホスト側の80番ポートを コンテナ側の3000番ポートに紐づけるということです。 つまり、 localhost:80 にアクセスすると、コンテナ側の

Slide 61

Slide 61 text

設定:volumes volumesは、ホスト側のディレクトリとコンテナ側のディレク トリを紐づける設定です。 < ホスト側のディレクトリ>:< コンテナ側のディレクトリ> と いう形式で記述します。

Slide 62

Slide 62 text

設定:depends_on depends_onは、コンテナの依存関係を設定するための設定で す。 例えば、 backend コンテナは db コンテナが立たないと実 際に動かせないので、 db コンテナが立つまで backend コ ンテナを立てないというようなことができます。

Slide 63

Slide 63 text

設定:image imageは、イメージを指定するための設定です。 < ユーザ名>/< イメージ名>:< タグ> という形式で記述しま す。 もちろん、これは Dockerfile + build設定で記述すること もできるので、楽な方を選びましょう。

Slide 64

Slide 64 text

最近のコンテナ仮想化技術

Slide 65

Slide 65 text

k8s

Slide 66

Slide 66 text

k8sは、コンテナのオーケストレーションを行うためのツール です。 ビルドされたイメージを複数のコンテナに分散させて、負荷分 散や冗長化を行うことができます。

Slide 67

Slide 67 text

クラウドとDocker

Slide 68

Slide 68 text

クラウドサービスでは、Dockerを使ってサービスを提供してい ることが多いです。 例えば、AWSのECSやEKS、GCPのGKEなどがあります。

Slide 69

Slide 69 text

コンテナ単位でサービスをデプロイすることができれば、バー ジョン管理や負荷分散などが簡単にでき、さらにサービス同士 が疎結合になるため、サービスの拡張性が高まります。

Slide 70

Slide 70 text

まとめ

Slide 71

Slide 71 text

Dockerはコンテナ仮想化を用いてアプリケーションを開発・ 配置・実行するためのオープンプラットフォーム Docker Hubはコンテナのイメージを保存・共有するための もの Docker-Composeは複数のコンテナを一括で管理するため のツール

Slide 72

Slide 72 text

ご清聴ありがとうございました 質問などあれば気軽にどうぞ!