Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog

This post is Private. Only a writer or those who know its URL can access this post.

Improve article
RevisionsShow article in Markdown
Report article
Help us understand the problem. What is going on with this article?

Docker でちょっとだけ遊んでみよう

More than 3 years have passed since last update.

Docker でちょっとだけ遊んでみよう

by masakura
1 / 43

今日の目的

  • Docker の仕組みの説明は最小限で
  • 使って遊んでみましょう!
  • フリータイムをもうけてるので、トライしてみましょう!

自己紹介

  • 氏名: 政倉 智 (まさくら とも)
  • 所属: codeArts 株式会社
  • 所属: html5j 鹿児島
  • 趣味: バイク・プログラミング

Docker って?

  • Build, Ship, and Run Any App, Anywhere
  • 目的のために、VMware などとは違う技術を採用
    • 得手不得手がある
  • 今日は Docker の ShipRun の良さを体験!
  • 手早く 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

こんなことを勝手にやってくれる!

  1. Docker Hub から hello-world イメージをダウンロード
  2. コンテナ (仮想化環境) が作られる
  3. hello プログラムが実行される
  4. プログラムが終了したらコンテナは終了

一般的な仮想化ソフト (VMware 等) との違い

  • イメージ名だけで簡単に実行できる
  • ハードウェアや OS のブートがないのでめちゃ速い!
  • プログラムが終了すると停止する

イメージはどこに?

  • Docker Hub にある
  • hello-world で検索するといっぱい出てくる
  • イメージ名に / が入っていないのが Docker 社公式のイメージ
  • 基本的にここからイメージを拾う

hello-world イメージの特徴

  • かなりミニマムな 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

だけだと面白くないので...

  • 適当なディレクトリを作って 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

ログを見るには 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

コンテナに入る

$ 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

補足


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 ContainersHyper-V Containers は同じイメージが使える
  • Windows/Hyper-V Containers 向けのイメージは少ないので、実質 Linux 用と考えたほうがいい

Docker for Windows/Mac って何よ?

  • Linux の仮想環境上に Docker Engine をインストールしてる
    • Hyper-V or xhyve
  • ローカルで動いているように見えるラッパー付き
  • ネイティブ Docker と比べるとオーバーヘッドがある
  • 初期設定でメモリが 2GB になっているので、こまめに落としたほうがいいかも

おまけ

おまけを用意していますので、フリータイムで遊んでみましょう。


GitLab を試そう!


Gradle でビルドする

失敗したー


Docker Image の作成に挑戦!

# Dockerfile
FROM nginx
COPY index.html /usr/share/nginx/html/
  • index.htmlDockerfile を用意
  • そのディレクトリで docker build -t hogehoge . でイメージ作成
  • docker run -dP hogehoge で実行

頑張って、Docker Hub につっこんで、Arukas にデプロイしてみて!


Docker Machine の作成に挑戦!

  • Docker Machine は複数の Docker Engine を管理するためのもの
  • docker-machine create -d virtualbox docker1 で作成
  • eval $(docker-machine env docker1) で切り替え
  • docker infodocker1 にアクセスできる

ぐぐってがんばって!

masakura
gitlab-jp
Git/DevOpsツールチェーンプラットフォーム「GitLab」についての日本コミュニティ。
https://gitlab-jp.connpass.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away