- 近藤うちお
- 著書に、以下があります
コンテナ/仮想化/サーバー/インフラについて、知っている単語を集めて見ましょう
- Docker
- VM
- VirtualBox
- VMWare
- KVM
- Xen
- jail
- Dockerfile
- Docker Compose
- カーネル
- cgroup
- Namespace
- chroot
- AWS
- GCP
- GKE
- ECS
- Azure
- Amazon Lambda
- Heroku
- Kubernetes
- マイクロサービス
- ...
- 仮想化技術
- コンテナのための周辺ツールや技術
- コンテナのプラットフォーム
- Linuxでコンテナを実現するための機能
(ジャンルがジャンルなので、本家RailsGirlsのBentoboxのようにうまくできないところもあるでしょう...)
- 皆さん、コンピューターは使っていますか?
- 最近のコンピューター(OS)は、複数人で同時に使えるようにできています。(家族で、きょうだいで、お子様に、会社で...)
- 複数人で使うと、どういう困ったことがあるでしょう?
- 一人がメモリをたくさん使ってしまうと、他の人は困ってしまいますね
- でも、一人一人にコンピューターを買うことができない時もあります。特に、何百人、何千人と使う場合。
- なので、いろいろな方法で安全に資源(リソース)を分け合う
- 完全仮想化・準仮想化
- ハイパーバイザ型仮想化・ソフトウェア型仮想化
- コンテナ型仮想化
- 決定的な違い
- CPUやメモリなど仮想ハードウェアがない。ただのプロセス
- コンテナについて深掘りしたい方は、 https://speakerdeck.com/udzura/ こちらへ...(難易度は、中級者以上から上級者ぐらいまで)
- 図のいくつかは https://speakerdeck.com/udzura/inside-out-container-and-its-security からです。
- 比較的リソースを使いません
- 起動などが高速です
- 環境(イメージ)が比較的小さく収まり、ポータブルです
- いわゆるVMと、VirtualHostのようなものの間の性質がある。
- サンプルプロジェクト: https://github.com/udzura/yawaraka-docker
- Sinatra で
# Gemfile
gem "sinatra"
# app.rb
require "sinatra"
get "/" do
"Hello, from Docker. My Ruby version is: #{RUBY_VERSION}"
end
これを立ち上げて「手元で」確認する
$ bundle install --path vendor/bundle
$ bundle exec ruby app.rb
# Dockerfile.step1
FROM ruby:2.5.1
CMD ["ruby", "--version"]
$ docker build -t fjord-bootcamp:sample1 -f Dockerfile.step1 .
$ docker run -t fjord-bootcamp:sample1
ruby 2.5.1p57 (2018-03-29 revision 63029) [x86_64-linux]
$ docker run -ti fjord-bootcamp:sample1 irb
irb(main):001:0> system 'pwd'
/
=> true
irb(main):002:0> exit
- 何が起こっているか?
# Dockerfile.step2
FROM ruby:2.5.1
EXPOSE 8080
CMD ["ruby", "-run", "-e", "httpd"]
$ docker build -t fjord-bootcamp:sample2 -f Dockerfile.step2 .
$ docker run -d -p8080:8080 fjord-bootcamp:sample2
28db047f8dc29979b1d8876211fb9e2db841f1c211e73e4fdbad8ce011e0eaff
## ブラウザで localhost:8080 にアクセスする
## マシンには、「Rubyのプロセスがいない」ことも確認してみる
$ docker logs 28db047
[2018-12-02 12:15:30] INFO WEBrick 1.4.2
[2018-12-02 12:15:30] INFO ruby 2.5.1 (2018-03-29) [x86_64-linux]
[2018-12-02 12:15:30] INFO WEBrick::HTTPServer#start: pid=1 port=8080
172.17.0.1 - - [02/Dec/2018:12:15:37 UTC] "GET / HTTP/1.1" 200 3269
- -> /
[2018-12-02 12:15:37] ERROR `/favicon.ico' not found.
172.17.0.1 - - [02/Dec/2018:12:15:37 UTC] "GET /favicon.ico HTTP/1.1" 404 281
- -> /favicon.ico
172.17.0.1 - - [02/Dec/2018:12:15:46 UTC] "GET / HTTP/1.1" 200 3269
- -> /
[2018-12-02 12:15:46] ERROR `/favicon.ico' not found.
172.17.0.1 - - [02/Dec/2018:12:15:46 UTC] "GET /favicon.ico HTTP/1.1" 404 281
http://localhost:8080/ -> /favicon.ico
## 止めるには
$ docker stop 28db047
$ docker rm 28db047
- 何が起こっているか?
Tips: .dockerignore というファイルで、イメージに送らないパスを指定できる。キャッシュのようなものは除外するのが吉
Dockerfile*
vendor/*
# Dockerfile.step3
FROM ruby:2.5.1
RUN mkdir /app
ADD . /app
WORKDIR /app
RUN gem install bundler
RUN bundle install --deployment --path vender/bundle
EXPOSE 4567
# "-o0.0.0.0" の謎については発展課題で...
CMD ["bundle", "exec", "ruby", "app.rb", "-o0.0.0.0"]
$ docker build -t fjord-bootcamp:sample3 -f Dockerfile.step3 .
$ docker run -d -p4567:4567 fjord-bootcamp:sample3
fc37f85c62e4ba9c61d9b710ea8694830aca51c0e0fe2046e02c6b9f0480b15e
## ブラウザで localhost:4567 にアクセスしよう
## アクセスログを確認
$ docker logs fc37f85
[2018-12-02 12:27:44] INFO WEBrick 1.4.2
[2018-12-02 12:27:44] INFO ruby 2.5.1 (2018-03-29) [x86_64-linux]
== Sinatra (v2.0.4) has taken the stage on 4567 for development with backup from WEBrick
[2018-12-02 12:27:44] INFO WEBrick::HTTPServer#start: pid=1 port=4567
172.17.0.1 - - [02/Dec/2018:12:27:47 +0000] "GET / HTTP/1.1" 200 45 0.0045
172.17.0.1 - - [02/Dec/2018:12:27:47 UTC] "GET / HTTP/1.1" 200 45
- -> /
172.17.0.1 - - [02/Dec/2018:12:27:47 +0000] "GET /favicon.ico HTTP/1.1" 404 469 0.0017
172.17.0.1 - - [02/Dec/2018:12:27:47 UTC] "GET /favicon.ico HTTP/1.1" 404 469
- -> /favicon.ico
- 何が起こっているか?
- アプリの内容を変えて、再度イメージを作ってみよう
require "sinatra"
get "/" do
"Hello, from Docker. My Ruby version is: #{RUBY_VERSION}"
end
get "/hello" do
"This is a new contents."
end
$ docker build -t fjord-bootcamp:sample3 -f Dockerfile.step3 .
...
- 「コンテナはプロセス」を見てみましょう
- アプリが立ち上がった状態で:
brew install screen
screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty
ps auxf
(CTRL-A + CTRL-\ to quit)
- VirtualBoxの人は素直に
ps auxf
- Rubyアプリに使うRubyのバージョンを変えてみよう (★☆☆)
- 最新の 2.5.3 にするには?
- SQliteをインストールし、データを永続化してみよう (★★☆)
- ruby:2.5.1 image のベースはDebianというLinuxディストロを使っています。 つまり、
apt-get
でOSライブラリを入れる - https://hub.docker.com/_/ruby/
- ruby:2.5.1 image のベースはDebianというLinuxディストロを使っています。 つまり、
- この環境をインターネットに公開しよう (★★★)
- Heroku - Deploying with Docker: https://devcenter.heroku.com/categories/deploying-with-docker
- Lita という Slack にも使えるボットフレームワークで、fjord slackのボットを作ってみよう
- Lita用の設定(bot用のトークン)は、駒形さんが用意してくれるはずw
- Litaは、 Redisが必ず必要になる フレームワークです。これをDockerで手軽に開発するには?
- 複数のコンテナを組み合わせるには docker-compose がお手軽です。
- VirtualBox の人は追加作業が必要です; https://docs.docker.com/compose/install/
docker-compose.yml
の例を示します。
web:
build: lita
command: bundle exec lita
ports:
- 80:10080
links:
- redis
environment:
- REDIS_HOST=redis
- REDIS_PORT=6379
redis:
image: redis:5.0.2
- Litaができれば、MySQLなどを同時に立ち上げてみなさんのRailsアプリケーションもDocker化できるはず...!!