Skip to content

Instantly share code, notes, and snippets.

@udzura
Last active June 16, 2022 23:34
Show Gist options
  • Save udzura/fd1d6f4e27571b1b553f16eca4597b05 to your computer and use it in GitHub Desktop.
Save udzura/fd1d6f4e27571b1b553f16eca4597b05 to your computer and use it in GitHub Desktop.
やわらかDocker

やわらかDocker

2018-12-02 15 03 34

コーチについて

アイスブレーク: Docker BentoBox

コンテナ/仮想化/サーバー/インフラについて、知っている単語を集めて見ましょう

  • Docker
  • VM
  • VirtualBox
  • VMWare
  • KVM
  • Xen
  • jail
  • Dockerfile
  • Docker Compose
  • カーネル
  • cgroup
  • Namespace
  • chroot
  • AWS
  • GCP
  • GKE
  • ECS
  • Azure
  • Amazon Lambda
  • Heroku
  • Kubernetes
  • マイクロサービス
  • ...

以下の4つに(とりあえず)分類してみよう

  1. 仮想化技術
  2. コンテナのための周辺ツールや技術
  3. コンテナのプラットフォーム
  4. Linuxでコンテナを実現するための機能

(ジャンルがジャンルなので、本家RailsGirlsのBentoboxのようにうまくできないところもあるでしょう...)

Docker ってなんだろう?

  • 皆さん、コンピューターは使っていますか?
  • 最近のコンピューター(OS)は、複数人で同時に使えるようにできています。(家族で、きょうだいで、お子様に、会社で...)
  • 複数人で使うと、どういう困ったことがあるでしょう?

コンピューターの資源は共用です

  • 一人がメモリをたくさん使ってしまうと、他の人は困ってしまいますね
  • でも、一人一人にコンピューターを買うことができない時もあります。特に、何百人、何千人と使う場合。
  • なので、いろいろな方法で安全に資源(リソース)を分け合う

仮想化技術のいろいろ

  • 完全仮想化・準仮想化
  • ハイパーバイザ型仮想化・ソフトウェア型仮想化
  • コンテナ型仮想化
    • 決定的な違い
    • CPUやメモリなど仮想ハードウェアがない。ただのプロセス

2018-12-02 16 13 35

2018-12-02 16 13 45

2018-12-02 16 13 11

コンテナのいいところ

  • 比較的リソースを使いません
  • 起動などが高速です
  • 環境(イメージ)が比較的小さく収まり、ポータブルです
  • いわゆるVMと、VirtualHostのようなものの間の性質がある。

2018-12-02 16 14 01


Dockerを触ってみよう

簡単なWebアプリケーションを作っておく

  • 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

このWebアプリケーションをDocker化する...

Step1: Rubyが動くイメージを動かしてみる

# 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
  • 何が起こっているか?

Step2: RubyでWebアプリを動かす(サービス化する)

# 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のプロセスがいない」ことも確認してみる

2018-12-02 21 16 24

$ 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
  • 何が起こっているか?

Step3: アプリケーションをイメージの中に埋め込む

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

2018-12-02 16 03 13


追加課題

  • Rubyアプリに使うRubyのバージョンを変えてみよう (★☆☆)
    • 最新の 2.5.3 にするには?
  • SQliteをインストールし、データを永続化してみよう (★★☆)
    • ruby:2.5.1 image のベースはDebianというLinuxディストロを使っています。 つまり、 apt-get でOSライブラリを入れる
    • https://hub.docker.com/_/ruby/
  • この環境をインターネットに公開しよう (★★★)

さらなる追加課題・応用編

  • Lita という Slack にも使えるボットフレームワークで、fjord slackのボットを作ってみよう
    • Lita用の設定(bot用のトークン)は、駒形さんが用意してくれるはずw
  • Litaは、 Redisが必ず必要になる フレームワークです。これをDockerで手軽に開発するには?
  • 複数のコンテナを組み合わせるには docker-compose がお手軽です。
  • 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化できるはず...!!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment