イモケンピウスの辞書

脳の記憶容量がフロッピーディスク2枚分しかないのでここに残しておくことにしました。Android、Unityについての記事が多いです

Docker入門 ~公式チュートリアルに沿って~

hubot用のローカル環境構築の際に、VMの必要性を感じたので、Dockerを少し触ってみました

環境:Mac OS X 10.10.5

Dockerのインストール

公式サイトチュートリアルを参考に。

"Docker Toolbox"なるものを使用してDockerをインストールするようです。

Docker Toolboxには下記ツールが含まれてますとのこと。

  • Docker Machine for running the docker-machine binary
  • Docker Engine for running the docker binary
  • Docker Compose for running the docker-compose binary
  • Kitematic, the Docker GUI
  • a shell preconfigured for a Docker command-line environment
  • Oracle VM VirtualBox

ほうほう。了解。

では早速、

  1. OS Xのバージョンが 10.8以降であることを確認
  2. Docker Toolboxをここからインストール
    • 僕は特に設定を変更せずデフォルトでインストールしました
  3. インストール終了後"Quick Start"画面で「続ける」を押して「閉じる」

これでインストールは完了ですね

Dockerのインストールが正常に行われいるか確認

いよいよDockerのコンテナとやらを触ってみます。 まずDocker VMを作成するようです。一度作ってしまえば何度でも繰り返し使えるとのこと。

  • Launchpadから"Docker Quickstart Terminal"を開く
  • するとターミナルが開きセットアップが自動的に開始されます
  • セットアップが終了して待機状態になったら下記コマンドを実行
$ docker run hello-world

コマンドが正常実行されるとこんな出力になるはずです。

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world

b901d36b6f2f: Pull complete
0a6ba66e537a: Pull complete
Digest: sha256:8be990ef2aeb16dbcb9271ddfe2610fa6658d13f6dfb8bc72074cc1ca36966a7
Status: Downloaded newer image for hello-world:latest

Hello from Docker.
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker Hub account:
 https://hub.docker.com

For more examples and ideas, visit:
 https://docs.docker.com/userguide/

これが表示されていればDockerのインストールを成功とのことです。

コンテナとイメージ

コンテナとイメージについて公式サイトにはこのように記述されてます。

A container is a stripped-to-basics version of a Linux operating system. An image is software you load into a container.

日本語でおk。 コンテナはまっさらな状態のLinux OSで、そのコンテナ上でイメージと呼ばれるソフトウェアを読み込む。 この解釈で大丈夫なのかな。不安。

先ほど入力したコマンドを見てみます

"docker run hello-world"

  • "run"コマンドはコンテナを作成し、実行するコマンド
  • "hello-world"は読み込むイメージの名前

つまりさっきのこのコマンドの実行によって

  1. "hello-world"イメージをすでに持ってるか確認
  2. そんなのねえ
  3. OK。じゃあ Docker Hub(詳細は後ほど) からそのイメージをダウンロードしてまいります
  4. ダウンロード終了。イメージを読み込んで実行しまする
  5. ・・・実行完了

という流れでコンテナ上でイメージの読み込みが行われていたわけです。

たしかに出力結果を見ると、 「そんなイメージはローカルにないよ」とか「最新版をPullってきます」とか実行履歴が残ってますね。

ちなみにダウンロードしてきたこの最新版"hello-world"イメージはDockerの中の人が作ったものです。

イメージは世界中の誰でも作ることができて、今回の"hello-world"イメージみたいに他の人がダウンロードしてシェアすることもできるんですね。

なるほど。少しわかったかも。

Docker Hubを覗いてみる

さて、イメージについてです。

イメージは世界中の誰でも作成できます。

そしてその作成されたたくさんのイメージを検索・シェアできるのが

Docker Hub

です。 この Docker Hub に、個人が作成したイメージや、Googleなどの企業のオフィシャルなイメージも配布されてます。すげ。

では早速 Docker Hubを覗いてみます。

ついでにチュートリアルに沿って"whalesay"なるイメージを検索してみましょう。

  1. ここから Docker Hubを開く
  2. "whalesay"で検索
  3. 検索結果から docker/whalesay をクリック
  4. イメージの詳細画面が開きます

このイメージ詳細画面に使い方なんかが載ってます。

では早速このwhalesay イメージを読み込んで実行してみます。

こちらのコマンドを実行。

docker run docker/whalesay cowsay boo

すると↓のような出力がされるはずです。

$ docker run docker/whalesay cowsay boo
Unable to find image 'docker/whalesay:latest' locally
latest: Pulling from docker/whalesay
2880a3395ede: Pull complete
515565c29c94: Pull complete
98b15185dba7: Pull complete
2ce633e3e9c9: Pull complete
35217eff2e30: Pull complete
326bddfde6c0: Pull complete
3a2e7fe79da7: Pull complete
517de05c9075: Pull complete
8f17e9411cf6: Pull complete
ded5e192a685: Pull complete
Digest: sha256:178598e51a26abbc958b8a2e48825c90bc22e641de3d31e18aaf55f3258ba93b
Status: Downloaded newer image for docker/whalesay:latest
 _____
< boo >
 -----
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

出力結果の中身を見てみると、イメージをローカルから探し、見つからなかったのでHubからインストールしているのがわかります。

それでは合わせて、こちらのコマンドも実行してみてください

docker images

なんとなく想像つくかと思いますが、こちらのコマンドで「ローカルにあるイメージ」のリストを表示します。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
hello-world         latest              0a6ba66e537a        6 weeks ago         960 B
docker/whalesay     latest              ded5e192a685        6 months ago        247 MB

hello-worldイメージとdocker/whalesayイメージがリスト表示されています。 さきほどHubからPullってきたイメージですね。

imageを作ってみる

次は自分でimageを作成します。

まず任意の場所にフォルダを作成しましょう。

僕は「mydockerbuild」という名前のフォルダを作成しました。

mkdir mydockerbuild
cd mydockerbuild/

このフォルダの中に「imageを作成するために必要な物すべて」を格納します。

次に Dockerfile と呼ばれるimageの設定ファイルを作成します。

こちらのコマンドを実行します。

touch Dockerfile

実行後、処理は行われていないように見えますがちゃんと Dockerfile が作られています。

$ ls
Dockerfile

ではこのファイルを編集します。

お好きなテキストエディターで、このDockerfileを開きましょう。 もしくは

open -e Dockerfile

で、ターミナルからエディターを開きます。

中身はまっさら何も書かれていない状態です。

ここに↓のソースをまるっとコピペして保存ください。

FROM docker/whalesay:latest

RUN apt-get -y update && apt-get install -y fortunes

CMD /usr/games/fortune -a | cowsay

登場したキーワードの説明です。

FROM:ベースにするイメージ。今回は docker/whalesay:latest

RUN:RUN のあとのコマンドを実行する。今回は apt-getというプログラムのアップデートと、apt−getを使用して fortunes プログラムをインストールします。

CMD:fotunesプログラムとcawsayプログラムの連携。

fortunesプログラムは歴史上の偉人や有名人の発言を無造作に表示するプログラムです。 まあ使ってるうちに覚えるでしょう。きっと。

保存が終われば、エディターは閉じてターミナルに戻ります。

下記コードで、Dockerfileが正常に編集されているか確認します

cat Dockerfile

では、新しいイメージを作ります。

こちらのコマンドを実行してください。最後のピリオド( . )も忘れずに

docker build -t docker-whale .

実行するとビルドが始まり、終了まで少し時間がかかります。

ビルドが終了し、出力結果の一番最後の行に↓のような表示があれば成功です。

Successfully built 32162e90e123

ではさきほどの

docker build -t docker-whale .

こちらのコマンドの解説。

このコマンドは、さきほど作成したDockerfileを取得しdocker-whaleという名前のimageをローカルに作成します。

ローカルのイメージをリスト表示してくれる"docker images"コマンドを実行してみると、たしかに追加されています。

では作成したイメージを実行してみます。

docker run docker-whale

すると、、、

$ docker run docker-whale
 _________________________________________
/ Three minutes' thought would suffice to \
| find this out; but thought is irksome   |
| and three minutes is a long time.       |
|                                         |
\ -- A. E. Houseman                       /
 -----------------------------------------
    \
     \
      \
                    ##        .
              ## ## ##       ==
           ## ## ## ##      ===
       /""""""""""""""""___/ ===
  ~~~ {~~ ~~~~ ~~~ ~~~~ ~~ ~ /  ===- ~~~
       \______ o          __/
        \    \        __/
          \____\______/

このように、クジラが偉い人の名言を表示してくれます。

つまりよりスマートなクジラができあがったわけですね。

毎回コマンドを実行するたびにクジラが表示する名言は変わります。 もちろんこの名言はfotunesプログラムから引っ張ってきたものですね。

作成したimageをHubで共有する

作成したimageをDocker Hub上にアップしてみます。

そのためにはアカウントの作成が必要になります。下記手順で作成してください。

  1. こちらのページの右側のフォームを入力し"Sign up"
  2. 入力したメールアドレス宛てにメールが届く
  3. メール内の"Confirm Your Email"ボタンをクリック

ログイン状態になると"Welcome to Docker Hub"と大きく表示されたプロフィールページが開きます。

では作成したdocker-whaleイメージを公開しましょう。

まず下記手順でimageをアップするリポジトリを作成します。

  1. "Create Repository"をクリック
  2. いくつか入力する箇所があるフォームが表示される
    • name: Create Repository
    • short description: My smarter Docker whale.
    • full description: 今回はなにも書き込まない
    • Visibility: public
  3. "Create"

これでレポジトリが作成されました。 ここにimageをアップします。

ではまずimageの一覧を表示させます。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
docker-whale        latest              321642e907e5        34 minutes ago      274.1 MB
hello-world         latest              0a6ba66e537a        6 weeks ago         960 B
docker/whalesay     latest              ded5e192a685        6 months ago        247 MB

表示された一覧のdocker-whaleイメージの"IMAGE_ID"列の英数字をコピーしましょう。

このイメージIDと"docker tag"コマンドでタグ付けを行います

フォーマットはこちら

docker tag イメージID アカウント名/docker-whale:latest

コピペしたイメージIDとアカウント登録時に入力したアカウント名をそれぞれ置き換えて実行してください。

実行後もう一度"docker images"コマンドでリスト表示すると新しくアカウント名/docker-whaleイメージが作成されているはずです。

では次はターミナルからDocker Hubにログインします。 ↓のコマンドを実行し、パスワードを要求されるので入力するとログインに成功するはずです。

docker login --username=アカウント名 --email=登録したメアド

ログインに成功したら、さきほどのタグ付けしたimageをリポジトリにアップします

docker push アカウント名/docker-whale

アップが終了したら、Docker Hubページを開いてimageがアップされているか見てみましょう。

では最後に、アップしたimageを今度はダウンロードして実行してみます。

そのためにはローカルに存在しているdocker-whaleイメージを削除しなくてはなりません。 削除を行わないと、同じimagesが二つになってしまうのでインストールできません。

"docker images"コマンドでimageリストを表示し

  • docker-whale
  • アカウント名/docker-whale

の二つのイメージのイメージIDをコピペしてください。二つは同じIDだとおもいます。

では下記rmiコマンドで削除を行います

docker rmi -f コピペしたイメージID

これで二つのイメージは削除されました。

では次はダウンロードです。

ちなみに用語として

ダウンロード=プル アップロード=プッシュ

それぞれ言い換えできます。プル・プッシュはよくつかいますので覚えておいてください。

それではイメージのプル(ダウンロード)を行います

docker pull アカウント名/docker-whale

プル終了後に、実際にイメージを実行してみてください。 クジラが名言を発していれば正常にプルできています。

お疲れさまでした!

これでチュートリアルは終了です。

ここまでのチュートリアル

  • Dockerのインストール
  • コンテナ上でのイメージの実行
  • Docker Hubアカウントとレポジトリの作成
  • imageの修正と新しいimageの作成
  • imageの公開

をすでに終えたことになります。

ぼくもこれでスタートラインに立てたわけですので、いろいろとやってみてその記事をアップします。

おつかれっした!