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
ほうほう。了解。
では早速、
- OS Xのバージョンが 10.8以降であることを確認
- Docker Toolboxをここからインストール
- 僕は特に設定を変更せずデフォルトでインストールしました
- インストール終了後"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"は読み込むイメージの名前
つまりさっきのこのコマンドの実行によって
- "hello-world"イメージをすでに持ってるか確認
- そんなのねえ
- OK。じゃあ Docker Hub(詳細は後ほど) からそのイメージをダウンロードしてまいります
- ダウンロード終了。イメージを読み込んで実行しまする
- ・・・実行完了
という流れでコンテナ上でイメージの読み込みが行われていたわけです。
たしかに出力結果を見ると、 「そんなイメージはローカルにないよ」とか「最新版をPullってきます」とか実行履歴が残ってますね。
ちなみにダウンロードしてきたこの最新版"hello-world"イメージはDockerの中の人が作ったものです。
イメージは世界中の誰でも作ることができて、今回の"hello-world"イメージみたいに他の人がダウンロードしてシェアすることもできるんですね。
なるほど。少しわかったかも。
Docker Hubを覗いてみる
さて、イメージについてです。
イメージは世界中の誰でも作成できます。
そしてその作成されたたくさんのイメージを検索・シェアできるのが
Docker Hub
です。 この Docker Hub に、個人が作成したイメージや、Googleなどの企業のオフィシャルなイメージも配布されてます。すげ。
では早速 Docker Hubを覗いてみます。
ついでにチュートリアルに沿って"whalesay"なるイメージを検索してみましょう。
- ここから Docker Hubを開く
- "whalesay"で検索
- 検索結果から docker/whalesay をクリック
- イメージの詳細画面が開きます
このイメージ詳細画面に使い方なんかが載ってます。
では早速この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上にアップしてみます。
そのためにはアカウントの作成が必要になります。下記手順で作成してください。
- こちらのページの右側のフォームを入力し"Sign up"
- 入力したメールアドレス宛てにメールが届く
- メール内の"Confirm Your Email"ボタンをクリック
ログイン状態になると"Welcome to Docker Hub"と大きく表示されたプロフィールページが開きます。
では作成したdocker-whaleイメージを公開しましょう。
まず下記手順でimageをアップするリポジトリを作成します。
- "Create Repository"をクリック
- いくつか入力する箇所があるフォームが表示される
- name: Create Repository
- short description: My smarter Docker whale.
- full description: 今回はなにも書き込まない
- Visibility: public
- "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の公開
をすでに終えたことになります。
ぼくもこれでスタートラインに立てたわけですので、いろいろとやってみてその記事をアップします。
おつかれっした!