Markdownでスライドを作れるMarpを使って、社内勉強会でDockerの話をしました
毎週末の社内勉強会、弊社は若手の子が思い思いの発表をすることが多いです。 それはそれで良いのですが、そもそも自分たちが開発に使っているものの理解を深めるのも良い機会かなと思い、話をすることにしました。
また弊社のサービスはマイクロサービス化の道半ばであるため、コンシューマサービスのみがECSを使ったモダンな環境。 それ故に同じ開発部のエンジニアであっても担当業務によってスキル差があることが気になっており、 とりわけDockerは“なんとなく”使っている人が多いと感じられたので、今回のテーマに選出しました。
当初は勉強会駆動で自分でも学習をして、k8sの話をしようと思っていたのですが、前述の理由から順番に攻めることにしたのです。
それともう1つ、今回はMarkdownでスライドを作成できるMarp を使って時短でスライドを作成しました。 これまではKeynoteを多用してきており、凝り性の性格と相まってスライドが綺麗と言って頂くことも多かったのですが、 綺麗でも中身が薄くなるよりは、確実に時間を割いて来てくれた人に価値を届けたいと思い、時間のかけ方を変えました。
今回はみんなが“なんとなく”使っていることを課題として設定したので、 なぜ便利で使うのかを理解してもらうことと、 日頃の業務ではあまり触れる機会がない(が、今後マイクロサービス化が進むと触れなければならない人たちに)触れる機会を増やしてもらうことを目標にしました。
やはりハンズオンは楽しいという声があったので、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)などが有名です
仮想化の種類
仮想化の種類
ホスト型
- 仮想化してアプリケーションとして利用
- PCは1台だけど、Linuxも使いたい
- e.g. VMWare Player, VirtualBox
ハイパーバイザー型
- OSそのものに仮想化システム組込
- 主にサーバ向け(複数サーバを集約)
- e.g. Hyper-V, VMware ESXi, Xen, KVM
なぜ仮想化が必要なのか
- カプセル化
- セキュリティの都合
- サーバの台数を減らせる
- 管理の手間を減らせる
- 物理サーバ調達の時間削減
- 複数のOSが使える
セキュリティの都合とは
- 1台の物理マシンで複数のアプリケーションが稼働している
- OSのリソースを共有
- 1つのアプリケーションが攻撃されただけで全てに影響
- アプリケーションごとに仮想マシンを作り Isolationしていた
しかし、仮想であってもマシンが増えると管理が辛い😔
そこで、コンテナ型仮想化
Docker
- コンテナ型仮想化技術を使用
- 1コンテナ1プロセスの考え方により前述の問題を解消
- IaCによりどこでも誰でも同じ環境を作れる
- 作成した環境を配布しやすい ...etc
Docker > 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
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を作成して、データを再び取得できることを確認しよう
以下、もくもく会
- わからないこと、気になることがあったら質問しましょう
- 成果があったら共有しましょう