This post is Private. Only a writer or those who know its URL can access this post.
More than 1 year has passed since last update.

自己紹介

氏名 政倉 智 (まさくら とも)
所属 codeArts 株式会社
所属 html5j 鹿児島
趣味 バイク (車検に出したよ!)

始める前に


クラウドの仮想マシンの利用をお勧めします

  • 大量のダウンロードをするため
  • 今日は参加者が多いので、回線が厳しいかも
  • Azure/AWS/GCP/さくらなどの仮想マシンの利用をお勧め
  • クラウドの仮想マシンなら、ダウンロードがすごく速いです!

アジェンダ

  • Docker でコマンドラインツールを動かしてみよう!
  • 開発で便利に使ってみる
  • ご注意

Docker でコマンドラインツールを動かしてみよう!


Ubuntu を動かす

$ docker run --rm -it ubuntu bash
Unable to find image 'ubuntu:latest' locally
latest: Pulling from library/ubuntu
124c757242f8: Pull complete

 ...

Status: Downloaded newer image for ubuntu:latest
root@b0d37764ad50:/# exit
$

二回目からはキャッシュが使われるので一瞬で起動します


$ docker run --rm -it ubuntu bash
引数 説明
run コンテナ (仮想マシン) を作成して実行する
--rm 利用が終了したらコンテナ (仮想マシンを削除)
-it 対話ターミナルを利用する (--interactive--tty)
ubuntu イメージ名
bash コンテナで実行するコマンド

Docker Image と Docker Hub

  • 利用できる Docker Image は Docker Hub から検索できる
  • official というのは Docker 社公式
  • 自分でイメージを作ってアップロードすることもできる

image.png


Docker の仕組み (大雑把)

Untitled(10).png

  • コンテナは仮想マシンと違い、プロセスを隔離するだけ
  • ネットワークやストレージは仮想化されている
  • ホスト OS と違うものを動かすことはできない

起動が速い理由

Untitled(7)(2).png

  • Docker は OS の起動という概念がなく、プロセスを直接起動する
  • 「必要があるときだけコンテナを作る」でも十分実用になる

ストレージは積み重ね

Untitled(8)(3).png

  • 同じ Ubuntu Image から作成したコンテナは変更点だけが記録される
  • --rm オプションを使うと、コンテナの終了時にストレージも削除される (イメージは残る)

プログラム言語のお試しにも!

$ docker run --rm -it ruby
$ docker run --rm -it node
$ docker run --rm -it python

それぞれ REPL (対話的インターフェイス) が起動します


プログラム言語のお試しにも!

main.rb
puts "Hello, world!"
$ docker run --rm -v $PWD:$PWD -w $PWD ruby main.rb

# for Windows
$ docker run --rm -v c:/working:/working -w /working ruby main.rb
引数 説明
-v ホストの左側をコンテナの右側にマウントする
-w コンテナのカレントディレクトリを設定

開発で便利に使ってみる


Asciidoctor

main.adoc
= タイトル

ほげほげ
$ docker run --rm -it -v $PWD:$PWD -u $(id -u) -w $PWD \
    asciidoctor/docker-asciidoctor asciidoctor main.adoc

Windows の人はバックスラッシュを外して一行で書いてね!


LaTex

main.tex
\documentclass[a4paper]{article}

\begin{document}

Hello World !  % This is your content

\end{document}
$ docker run --rm -it -v $PWD:$PWD -u $(id -u) -w $PWD paperist/alpine-texlive-ja latexmk -C main.tex
$ docker run --rm -it -v $PWD:$PWD -u $(id -u) -w $PWD paperist/alpine-texlive-ja latexmk main.tex
$ docker run --rm -it -v $PWD:$PWD -u $(id -u) -w $PWD paperist/alpine-texlive-ja latexmk -c main.tex

CodeClimate

main.js
console.log('hello');

  var i = 0;
.eslintrc
{
  "extends": [
    "airbnb"
  ]
}
$ docker run \
   --interactive --tty --rm \
   --env CODECLIMATE_CODE="$PWD" \
   --volume "$PWD":/code  \
   --volume /var/run/docker.sock:/var/run/docker.sock \
   --volume /tmp/cc:/tmp/cc \
   codeclimate/codeclimate analyze -e eslint

イメージが数 GB あるので実行には注意!
Windows で動かすには工夫が必要


Selenium

Selenium 公式 Docker Image の docker-compose.yml を使う

$ docker-compose up -d

クライアントは今回 Webdriver.io を利用

$ docker run --rm -it huli/webdriverio wdio repl chrome --host {host_ip_address}
> browser.url('http://webdriver.io')
> browser.getTitle()
'WebdriverIO - WebDriver bindings for Node.js'
> $$('nav a')[3].click()
 browser.getTitle()
'WebdriverIO - API Docs'

Vue.js も!

$ docker run -it --rm -v "$PWD":"$PWD" -w "$PWD" ebiven/vue-cli vue create app
$ cd app
$ docker run -it --rm -v "$PWD":"$PWD" -w "PWD" -p 8080:8080 ebiven/vue-cli npm run serve

ぶっちゃけ

  • CLI で動いて Docker Image があればなんでもいける
  • docker run --rm -v $PWD:/data {image} の後に使うコマンドを書くだけ...
  • 自分で Docker Image を作ればもっといろいろできる

何がうれしいの?


  • パソコンが汚れない
    • 昔は Oracle インストールしたら Perl/Java を古いのをインストールしてくれるとかあって、それでいろんなものが動かなった
    • 開発環境をインストールしたらついでにいろいろ入って、おかしくなるのはよくある
    • Ruby とかいくつ入ってますか? どれが使われるか把握していますか?
  • 複数の環境を混在できる
    • プロジェクト A は Ruby 2.1.2、B は Ruby 2.2.0 とか...
  • いにしえのプロジェクトのメンテナンスのために、環境を作る必要がない
  • チームで開発環境を同一にでき、バージョン誤差を減らせる

注意点


ストレージ食います!

  • docker container prune で不要なコンテナの削除
  • docker container ls でコンテナリスト、docker container rm で消せる
  • docker image prune -a で不要なイメージの削除

そのままでは、root でファイルが作成される

  • コンテナのコマンドは root で動く
  • 結果、-v で共有したファイルも root で作成される (Linux では)
  • Docker for Windows/Mac は利用ユーザーになるので、あまり考えなくていいよ
$ docker run --rm -it -u $(id -u) -v $PWD:$PWD ubuntu touch file
                      ~~~~~~~~~~~
                      起動するプロセスの uid を自分と同じものに

Docker for Windows/Mac

  • 内部で Linux 仮想マシンを動かして、その中で Docker を動かしている (Windows や macOS で動いているわけではない)
  • Windows は Hyper-V を利用で、ダイナミックメモリになってないので、仮想マシン分メモリ食うかも
  • Mac も仮想マシンだけど、Docker で利用している分だけになるらしい
  • Docker の設定でメモリ使用量とか調整してね

Windows Container

  • Windows にはネイティブのコンテナが
    • Windows Container (Linux のに近い)
    • Hyper-V Container (普通の仮想マシンに近い)
  • 使ってないのでわからない!

自分はあんまり使ってないけど


人によっては、ほぼ Docker で開発ってやってるらしい


チャレンジしてみよう!


ご清聴ありがとうございました!

Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account log in.