今日の目的
- Docker の仕組みの説明は最小限で
- 使って遊んでみましょう!
- フリータイムをもうけてるので、トライしてみましょう!
自己紹介
- 氏名: 政倉 智 (まさくら とも)
- 所属: codeArts 株式会社
- 所属: html5j 鹿児島
- 趣味: バイク・プログラミング
Docker って?
- Build, Ship, and Run Any App, Anywhere
- 目的のために、VMware などとは違う技術を採用
- 得手不得手がある
- 今日は Docker の
Ship
とRun
の良さを体験! - 手早く WordPress とか起動できるから感動するよ!
使ってみよう!
Kitematic
- CUI が嫌いな人は Kitematic を試してみて!
- Docker Toolbox は入れんほうがいいみたい
なにはなくとも Hello, world!
たったこれだけで、動くよ! しかも早いよ!
$ docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... snip
こんなことを勝手にやってくれる!
- Docker Hub から
hello-world
イメージをダウンロード - コンテナ (仮想化環境) が作られる
-
hello
プログラムが実行される - プログラムが終了したらコンテナは終了
一般的な仮想化ソフト (VMware 等) との違い
- イメージ名だけで簡単に実行できる
- ハードウェアや OS のブートがないのでめちゃ速い!
- プログラムが終了すると停止する
イメージはどこに?
- Docker Hub にある
- hello-world で検索するといっぱい出てくる
- イメージ名に
/
が入っていないのが Docker 社公式のイメージ - 基本的にここからイメージを拾う
- かなりミニマムな Linux (Not ディストリビューション)
- kernel はホストと共有なんで、何もない
- 971 bytes しかない!
-
Hello, world
を出力するプログラムhello
が同梱されている - コンテナの起動時に
hello
が起動される
停止したコンテナを含む一覧は ps -a
で
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
58964a62e129 hello-world "/hello" 7 seconds ago Exited (0) 6 seconds ago jolly_wright
もう一度起動するには start
$ docker start -i jolly_wright
Hello from Docker!
This message shows that your installation appears to be working correctly.
-
-i
は標準入出力にアタッチ
このままだとストレージの肥やしになるので削除する
$ docker rm jolly_wright
jolly_wright
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 名前は
ps -a
の結果から引っ張ってきた
名前を明示的につける
$ docker run --name hogehoge hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
... snip
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ad0fe974a873 hello-world "/hello" 20 seconds ago Exited (0) 18 seconds ago hogehoge
Ubuntu を使ってみる
Ubuntu も公式イメージがあるので簡単!
$ docker run -it ubuntu
root@32ec93577ebf:/# cat /etc/lsb-release
DISTRIB_ID=Ubuntu
DISTRIB_RELEASE=16.04
DISTRIB_CODENAME=xenial
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
root@32ec93577ebf:/# uname -a
Linux 32ec93577ebf 4.4.43-boot2docker #1 SMP Wed Jan 18 18:33:18 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux
終了するには exit
を
root@32ec93577ebf:/# exit
exit
特定のバージョンの Ubuntu を使いたいときはタグを使う
$ docker run -it ubuntu:14.04
- どのタグがあるかは Docker Hub で Tags
- デフォルトは
latest
Tetris で遊ぶ
HTML5 アプリ版の Tetris のイメージを uzyexe さんが作ってくれてる!
$ docker run -d -P uzyexe/tetris
f32dbf565a1b2a6229b1edd64a78e021d2326de151ef2303a4cffde2e4607651
- 前回と違って...
-
-d
でバックグラウンドで動くように -
-P
でサービスポートを公開
-
この場合、自分の端末の 32771
番がにアクセスすると、コンテナの 80
版 (Web Server) にアクセスできる
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f32dbf565a1b uzyexe/tetris "/bin/sh -c '(tail..." 32 seconds ago Up 31 seconds 0.0.0.0:32771->80/tcp, 0.0.0.0:32770->443/tcp gracious_perlman
-
http://localhost:32771
へ Go!
nginx でウェブサイトを公開
前回と一緒!
$ docker run -d -P nginx
871897202bb7846d1dcab4ffc6ec14286b46fad86abbe108658e8c7ee7a4d779
$ docker ps
871897202bb7 nginx "nginx -g 'daemon ..." 15 seconds ago Up 14 seconds 0.0.0.0:32769->80/tcp, 0.0.0.0:32768->443/tcp adoring_mayer
- http://localhost:32768/ にアクセス!
だけだと面白くないので...
- 適当なディレクトリを作って
index.html
ファイルを作る - 中身何でもいいよ!
$ docker run -d -P -v /path/to/html:/usr/share/nginx/html:ro nginx
f4f93c426fbf12523f9440da7de24a1a4130bdd67b2c2a6bb6acf8b3c5dfc65e
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f4f93c426fbf nginx "nginx -g 'daemon ..." 2 seconds ago Up 1 second 0.0.0.0:32771->80/tcp, 0.0.0.0:32770->443/tcp zealous_wing
-
http://localhost:32770
にアクセスすると... - nginx イメージの説明に使い方あり
ログを見るには docker logs
$ docker logs -f zealous_wing
172.17.0.1 - - [01/Feb/2017:09:28:05 +0000] "GET / HTTP/1.1" 200 5 "-" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36" "-"
2017/02/01 09:28:05 [error] 8#8: *1 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host: "localhost:32771", referrer: "http://localhost:32771/"
172.17.0.1 - - [01/Feb/2017:09:28:05 +0000] "GET /favicon.ico HTTP/1.1" 404 571 "http://localhost:32771/" "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.76 Safari/537.36" "-"
-
-f
をつけると表示し続けてくれる
PHP を動かしてみる
PHP も nginx と同じ要領で、PHP イメージの説明 を見ながら
こんなファイルを作って...
# index.php
<?php phpinfo() ?>
起動する!
$ docker run -d -P -v /path/to/php:/var/www/html php:7.0-apache
16fd12cb1748ea468f84962c12f77a1020554fc473b4d60fb58aaaec9e748339
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
16fd12cb1748 php:7.0-apache "docker-php-entryp..." 12 seconds ago Up 11 seconds 0.0.0.0:32772->80/tcp trusting_minsky
- http://localhost:32772/ にアクセス!
- タグが
7.0-apache
なのに気をつけてね!
コンテナに入る
$ docker exec -it trusting_minsky bash
root@16fd12cb1748:/var/www/html#
-
-it
はターミナルにアタッチ、忘れない -
bash
でエラーになる時はsh
がいいかも - 思ったとおりに動かない時は、これでがんばる
WordPress を起動!
-
WordPress はデータベースが必要なのでコンテナを二つ起動する
- イメージによってはデータベース込みもある
-
Docker Compose で管理すると楽
- 複数のコンテナをまとめて管理できる
- 適当なディレクトリを作って
docker-compose.yml
ファイルを作る
WordPress のイメージの説明に書かれてるので難しくはない。
# docker-compose.yml
version: '2'
services:
wordpress:
image: wordpress
ports:
- 8080:80
environment:
WORDPRESS_DB_PASSWORD: example
mysql:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: example
`docker-compose.yml ファイルがあるディレクトリで...
$ docker-compose up -d
⟫ docker-compose up -d
Creating network "wordpress_default" with the default driver
Creating wordpress_wordpress_1
Creating wordpress_mysql_1
- http://localhost:8080/ にアクセス!
-
docker-compose.yml
に8080
番で公開するよう書いてある
補足
Docker Engine はコンテナ仮想化が使われている
- カーネルはホストと共有する
- カーネルイメージじゃなくて、動いているそのものを共有
- プロセス管理もホスト側のカーネル
- なのでとっても速い!
- Linux の上だと、Linux しかだめ
- メモリも起動したプロセス分程度しか食わない!
- ディスプレイデバイスのエミュレートができない
- カーネルを共有するので、他のアーキテクチャのイメージは実行できない
- Linux 向けイメージは Linux でしか動かない
- arm 向けイメージは arm でしか動かない
ネイティブで動作するものはこれだけ
種類 | 動作 OS |
---|---|
Linux Container (x64) | Linux (x64) |
Linux Container (arm) | Linux (arm) |
Windows Containers | Windows Server 2016 |
Hyper-V Containers |
Windows Server 2016 or Windows 10 Pro x64
|
-
Windows Containers
とHyper-V Containers
は同じイメージが使える -
Windows/Hyper-V Containers
向けのイメージは少ないので、実質 Linux 用と考えたほうがいい
Docker for Windows/Mac って何よ?
- Linux の仮想環境上に Docker Engine をインストールしてる
- Hyper-V or xhyve
- ローカルで動いているように見えるラッパー付き
- ネイティブ Docker と比べるとオーバーヘッドがある
- 初期設定でメモリが 2GB になっているので、こまめに落としたほうがいいかも
おまけ
おまけを用意していますので、フリータイムで遊んでみましょう。
GitLab を試そう!
-
docker run -dP gitlab/gitlab-ce
で動いたりする... - 容量が大きいので、気をつけてね!
- GitLab CE をインストールしよう! (Docker Image 編)
Gradle でビルドする
失敗したー
Docker Image の作成に挑戦!
# Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html/
```
* `index.html` と `Dockerfile` を用意
* そのディレクトリで `docker build -t hogehoge .` でイメージ作成
* `docker run -dP hogehoge` で実行
頑張って、[Docker Hub](https://hub.docker.com/) につっこんで、[Arukas](https://arukas.io/) にデプロイしてみて!
----
### Docker Machine の作成に挑戦!
* Docker Machine は複数の Docker Engine を管理するためのもの
* `docker-machine create -d virtualbox docker1` で作成
* `eval $(docker-machine env docker1)` で切り替え
* `docker info` で `docker1` にアクセスできる
ぐぐってがんばって!