Markdownでスライドを作れるMarpを使って、社内勉強会でDockerの話をしました

毎週末の社内勉強会、弊社は若手の子が思い思いの発表をすることが多いです。 それはそれで良いのですが、そもそも自分たちが開発に使っているものの理解を深めるのも良い機会かなと思い、話をすることにしました。

また弊社のサービスはマイクロサービス化の道半ばであるため、コンシューマサービスのみがECSを使ったモダンな環境。 それ故に同じ開発部のエンジニアであっても担当業務によってスキル差があることが気になっており、 とりわけDockerは“なんとなく”使っている人が多いと感じられたので、今回のテーマに選出しました。

当初は勉強会駆動で自分でも学習をして、k8sの話をしようと思っていたのですが、前述の理由から順番に攻めることにしたのです。

それともう1つ、今回はMarkdownでスライドを作成できるMarp を使って時短でスライドを作成しました。 これまではKeynoteを多用してきており、凝り性の性格と相まってスライドが綺麗と言って頂くことも多かったのですが、 綺麗でも中身が薄くなるよりは、確実に時間を割いて来てくれた人に価値を届けたいと思い、時間のかけ方を変えました。

f:id:suzusin:20181117200332p:plain

今回はみんなが“なんとなく”使っていることを課題として設定したので、 なぜ便利で使うのかを理解してもらうことと、 日頃の業務ではあまり触れる機会がない(が、今後マイクロサービス化が進むと触れなければならない人たちに)触れる機会を増やしてもらうことを目標にしました。

やはりハンズオンは楽しいという声があったので、swarm, docker-compose, k8sと連続モノとして続けていければ理解が深まるかなと思いました。

また、Markdownで書いたことで、こうしてこのままblogにも貼り付けることができるのでアウトプットにもしやすいので良かったです。

こわくない Docker

20181116
Created by suzushin54

なぜいまさら、Docker なのか

  • みなさんはDockerのことを理解して使っていますか?
  • そもそもなぜDockerを使っているのでしょうか?
  • Dockerを使うと何が嬉しいのでしょうか?

Docker

Dockerはコンテナ型の仮想化環境を提供するオープンソースソフトウェアである。VMware製品などの完全仮想化を行うハイパーバイザ型製品と比べて、ディスク使用量は少なく、仮想環境 (インスタンス) 作成や起動は速く、性能劣化がほとんどないという利点を持つ。 > https://ja.wikipedia.org/wiki/Docker >


仮想化とは

コンピュータをエミュレート(装置やソフトウェア、システムの挙動を別のソフトウェアなどによって模倣し、代替として動作させる)することで、1台のPC(ホスト)で、複数のOS(ゲスト)を動作させる


仮想化の歴史は古い

仮想化という用語の起源は古く、1960年代には既に広く使われていた。ネットワーク全体や個々の機能やコンポーネントなど、コンピューティングの様々な面に適用されてきた。仮想化技術に共通する目的は、カプセル化によって「技術的詳細を隠蔽する」ことである > https://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E5%8C%96 >

  • 仮想化自体は新しい技術ではありません🙄
  • Docker登場以前から、Linux Container(LXC)などが有名です

仮想化の種類

https://ferret-plus.com/8461


仮想化の種類

ホスト型

  • 仮想化してアプリケーションとして利用
  • PCは1台だけど、Linuxも使いたい
  • e.g. VMWare Player, VirtualBox

    ハイパーバイザー型

  • OSそのものに仮想化システム組込
  • 主にサーバ向け(複数サーバを集約)
  • e.g. Hyper-V, VMware ESXi, Xen, KVM

なぜ仮想化が必要なのか

  • カプセル化
  • セキュリティの都合
  • サーバの台数を減らせる
  • 管理の手間を減らせる
  • 物理サーバ調達の時間削減
  • 複数のOSが使える

セキュリティの都合とは

  • 1台の物理マシンで複数のアプリケーションが稼働している
    • OSのリソースを共有
    • 1つのアプリケーションが攻撃されただけで全てに影響
  • アプリケーションごとに仮想マシンを作り Isolationしていた

しかし、仮想であってもマシンが増えると管理が辛い😔


そこで、コンテナ型仮想化

130%

  • コンテナとはLinuxカーネルの技術(namespace、 cgroups)によってリソースが分離された空間のこと
  • ホストとカーネル部分を共有するため、高速に動作する

Docker

  • コンテナ型仮想化技術を使用
  • 1コンテナ1プロセスの考え方により前述の問題を解消
  • IaCによりどこでも誰でも同じ環境を作れる
    • 作成した環境を配布しやすい ...etc

Docker > VM ?

  • 注意したいのは、VMを置き換えるものではないということ
    • VMの不便な点を解消する役目はあるが、代替技術ではない
    • 例えばモノリスなシステムであればVMの方が便利な場合も
  • Microservicesとは相性が良いです

概要は以上

  • Dockerが優れている理由や使われている理由はたくさんあります
  • 昨今のInfrastructures as Codeやimmutable infrastructureの文脈についても理解しておくと尚良いです
  • あとは適宜ぐぐってください

agenda

  • とにかくDockerにたくさん触ってみよう
  • 公開されているdocker imageを使ってみよう
  • ローカルのファイルを同期しよう

余裕があったら(資料はない)

  • imageをbuildしよう
  • オリジナルのimageをECRに登録しよう

NoSQLの redisをインストール

  • brew install redis

アンインストール

  • brew uninstall redis

公開されているイメージを使ってみよう

  • Docker Hubに登録されているイメージを検索

    docker search redis

  • バックグラウンドで実行

    docker run -d redis

  • コンテナの確認

    docker ps

  • 停止しているコンテナも確認するには?


コンテナについて知ろう

  • IPアドレス確認しよう

    docker inspect

  • stdout, stderrを確認しよう

    docker logs


redisにデータを登録しよう

  • ローカルのデフォルトポートのredisへ接続

    redis-cli


あれ、繋がりませんか?

Could not connect to Redis at 127.0.0.1:6379: Connection refused

  • 理由は、container が sandbox化されているため

Portをマッピングしよう

  • redis default port : 6379

  • ホストからアクセスできるようにPortマッピング

docker run -d --name redisHostPort -p 6379:6379 redis:latest

まずは停止 docker stop 停止しているコンテナも含めて全て確認 docker ps -a コンテナを再開 dcoker start

redis-cli * 今度はつながりましたね?


redis を触ってみる

127.0.0.1:6379> keys *
(empty list or set)
127.0.0.1:6379> set coolguy brison
OK
127.0.0.1:6379> keys *
1) “coolguy"
127.0.0.1:6379> get coolguy
“brison"
127.0.0.1:6379> save
OK
127.0.0.1:6379> exit

標準のRedisでは、データセットをDiskにバイナリでdump.rdbに保存します(初期設定の場合)。データセットに対して、60秒で100回変更が有った時、もしくは1000秒で1回変更があった時にファイルに保存します、この設定は変更することも出来ます。 http://redis.shibu.jp/admin/append_only_file.html#append-only-file


コンテナを再起動しよう

  • まずは停止

    docker stop

  • 停止しているコンテナも含めて全て確認

    docker ps -a

  • コンテナを再開

    docker start


ところで冗長化したいですよね

  • redis default port : 6379

  • ホストからアクセスできるようにPortマッピング

docker run -d --name redisHostPort -p 6379:6379 redis:latest

  • 2台以上起動したくなったら…?

いったんコンテナを削除

  • まずは停止

    docker stop

  • コンテナを削除

    docker rm


冗長化のために複数台立ち上げる場合は?

  • 今回

    docker run -d --name redisDynamic -p 6379 redis:latest

  • さっき

    docker run -d --name redisHostPort -p 6379:6379 redis:latest

  • どのポートがアサインされたかの確認

    docker port redisDynamic 6379 docker ps


再び redis を触ってみる

$ redis-cli
Could not connect to Redis at 127.0.0.1:6379: 
Connection refused

$ redis-cli -p 32770

127.0.0.1:32770> keys *
(empty list or set)

あれ、データが消えましたね。。。


コンテナのデータを永続化しよう

  • ホストのディレクトリとコンテナ内のドライブをマッピング

    docker run -d --name redisMappedAndDynamic -p 6379 -v $PWD/data:/data redis * $PWD はカレントフォルダを表す


強制的にコンテナを削除

docker rm -f redisMappedAndDynamic

  • 再びredisMappedAndDynamicを作成して、データを再び取得できることを確認しよう

以下、もくもく会

  • わからないこと、気になることがあったら質問しましょう
  • 成果があったら共有しましょう