Posted at

Docker入門【ドットインストール】

More than 3 years have passed since last update.

せっかくならよく耳にするDockerを利用して仮想環境を構築しようと思い、例によってドットインストール様の動画を見ながら勉強、および構築を行いました。

Docker入門


#01 Dockerとは何か?


  • 軽量な仮想化環境

  • Build once, run anywhere

環境を簡単に集約できることはもちろんのこと、その環境を他の開発者がすぐに利用できる、という点も利点として挙げられる。


Dockerは、アプリケーションとOSをパッケージし、イメージ化する機能だけでなく、コンテナの機能に加えて、APIの提供やインターネットを通じて世界中の開発者の成果物を入手したり、逆に成果物をアップロードしたりすることで、成果物を効率よく管理、利活用する仕組みや、それらの一連の作業を自動化する機構などが備わっています。クラウド基盤ソフトウェアに比べ、導入のハードルも比較的低く、これらの魅力的な機能を簡単に試すことができるため、多くの開発者やIT部門の管理者での利用が急激に広まっています。

巷で話題のDockerとは? - Think IT


Docker公式サイト

(頻繁に仕様が変わるため、困ったら見ると良い)


#02 Ubuntuを用意しよう

今回のレッスンでは、VagrantにてUbuntuを立ち上げる。

CentOSがVagrantではよく利用されているが、DockerはUbuntuにて開発されているため、今回はUbuntuを利用する。

サーバの土台となる!Linuxの各ディストリビューションの特徴まとめ

1.Vagrantbox.esより、Ubuntu 14.04のURLをコピー。

https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box)

2.仮想環境を構築するディレクトリまで入り、インストールする

$ vagrant box add trusty64 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box

3.インストールが完了したら、Vagrantfileを作成する

# Docker用のディレクトリを作成する

$ mkdir Docker
$ cd Docker/
# Vagrantfileを作成
$ vagrant init trusty64

4.Vagrantfile内のipアドレスを変更する


Vagrantfile

- # config.vm.network "private_network", ip: "192.168.33.10"

+ config.vm.network "private_network", ip: "192.168.55.44"

5.Vagrantを立ち上げる

$ vagrant up

6.VagrantにSSH接続する

$ vagrant ssh

このような表示になっていれば、成功。

vagrant@vagrant-ubuntu-trusty-64:~$


#03 Dockerをインストールしよう

このあたりは動画と私の端末で若干異なったため、勉強も兼ねて取り組む。


インストール情報

Docker公式サイト https://docs.docker.com/

⇒ DOCS(右上)

⇒ Docker Engine(サイドバー)

⇒ Install

⇒ On Linux distributions

⇒ Installation on Ubuntu

対象の中に、今回インストールしたUbuntu Trusty 14.04を発見。


前提条件

カーネルが3.10より古いと動かないようなので、OSを確認。

# OSのリリースを表示

$ uname -r
# 3.13.0-85-generic


システムをアップグレードする

$ sudo apt-get update


APTとは


APTとは、Linuxでソフトウェアの導入や管理、削除に用いられるパッケージ管理システムの一つ。Debian Projectによって開発されたもので、Debian系ディストリビューションでよく使われている。

APTは関連する様々な作業をまとめて自動的に実行してくれるため、利用者が明示的に個々のステップを指示する必要がない。例えば、あるパッケージを導入するには「apt-get install パッケージ名」というコマンドを入力するだけで、インターネットからのファイルのダウンロードやソースコードのコンパイル、実行可能ファイルの作成・配置などをすべて行なってくれる。その際、そのパッケージが依存している別のパッケージがある場合には、これも自動的に探してきてインストールしてくれる。パッケージの更新や削除に関しても同様である。ディストリビューションを丸ごとアップグレードする機能もある。

APT 【 Advanced Packaging Tool 】 - e-Words


同じ略称で、Advanced Persistent Threats(持続的標的型攻撃)もあるようだ。


Dockerのインストール

このあたりからこちらのサイトを参考にして実施した。

Docker ドキュメント日本語化プロジェクト

$ curl -fsSL https://get.docker.com/ | sh

curlコマンドは以下を参照。

https://hydrocul.github.io/wiki/commands/curl.html


GPGキーを加える


「GnuPG」(GNU Privacy Guard)という暗号化ソフトで生成される公開鍵です。Linuxの場合,apt-getコマンドやyumコマンドを使ってインターネットから入手できるパッケージが正しい配布先のものかどうかのチェックなどに利用しています。

GPGキーとは - 日経コンピュータ


$ sudo apt-key adv --keyserver hkp://p80.pool.sks-keyservers.net:80 --recv-keys 58118E89F3A912897C070ADBF76221572C52609D


Dockerのバージョンを確認

$ docker --version

# Docker version 1.11.0, build 4dc5990

今回インストールしたDockerは1.11.0のようです。


#04 作業の流れと用語を理解しよう

このレッスンでは、表題の内容の解説でしたが、自分なりにDockerの特徴も踏まえて調べてみました。

参考にしたサイトはこちら⇒Docker 入門


Dockerの特徴



画像元:Dockerの特徴 - Docker 入門

上図は仮想化方式の仕組み。

Hyper Visor(左)はOSそのものが仮想化のために設計されているため、オーバーヘッド(処理や負荷)が少なくなる。

それに対して、MacやWindowsなどのOS上で動くものは、ユーザーが操作しやすい反面、オーバーヘッドが大きくなる。



画像元:Dockerの特徴 - Docker 入門

Dockerはどうなのか?

上図にHyper VisorとDockerの比較図を載せるが、私がざっくり覚えた感じは…

従来の方法・・・OSに全部乗っかっている。

Docker・・・コンテナごとに独立したプロセスとして管理できる。

(いやいや全然分かってないよ、という方ご指摘お願いします。)

もっと詳細に解説しているサイトは⇒Docker - @IT

そしてこのコンテナを別の開発者の方に利用してもらうこともできる。

(この辺りはGitと同じようなイメージ?)


#05 Imageを操作してみよう

DockerではOSやアプリケーションのことをImageという。

Docker Indexで索引が可能だが、Docker Hubに登録しないといけないようなので、ユーザー登録をする。

(Githubと似たような感じ)


Imageの検索

右上の検索ボタンで可能。

例えば、centosとやると下図のようになる。


Imageをpullする

Docker Hubからもできるようだが、コマンドラインでImageをプルする。

まずはImageを検索する(今回はCentOS)。

$ sudo docker search centos | more

そうすると、CentOSのImage一覧が取得できる(公式や個人が作ったものと様々)。

この中からお目当てのImageをプルする。

今回は公式のcentosをプル。

$ sudo docker pull centos


コンテナのImage一覧を見る

プルできたら、Imageを確認する。

$ sudo docker images

これで、現在取得しているImageを見ることができる。

Imageは下表のような形ででてくる。

REPOSITORY
TAG
IMAGE ID
CREATED
SIZE

また、詳細な内容を確認したければ、inspectを使用する。

$ sudo docker inspect centos:latest

このとき、inspectの引数には対象が一意に特定できるようにしたいため、リポジトリ名:タグ名もしくはImage IDの最初の3〜4桁を指定してあげる。


Imageの削除

$ sudo docker rmi centos:latest

# rmi: remove image


#06 Containerを操作してみよう


Containerを作成する

$ sudo docker run centos echo "hello world"

これはCentOSImageでContainerを作成して、echo "hello world"というコマンドを実行する。


Containerの一覧を見る

# 実行中のContainer一覧

$ sudo docker ps

# 全てのContainer一覧
$ sudo docker ps -a

# 最新の5つを取得
$ sudo docker ps -a -n=5

また、この一覧のときにCONTAINER IDを取得できるので、IMAGE IDと同様に利用する。


Containerの削除

# d9eはCONTAINER IDの頭3桁

$ sudo docker rm d9e


07 実行中のContainerを操作しよう

今度は、バックグラウンドで動くコンテナを作成する。

run -dは、Dockerをデタッチモード(バックグラウンド)で起動する。

freeはLinuxコマンド(【 free 】 メモリーの使用状況を表示する)。

$ sudo docker run -d centos free -s 3

これは常に動いているため、psで見ることができる。

また、Dockerのログを見るためには、logsを利用する。

# 158はCONTAINER IDの頭3桁

$ sudo docker logs 158

バックグラウンドで動いているコンテナをフォアグラウンドに持ってくることもできる。

attachは実行中のコンテナに接続する。

--sig-proxy=falseオプションにて、Ctrl+Cで抜けてもコンテナは実行を続ける。

trueにするとその逆。)

$ sudo docker attach --sig-proxy=false 158


Containerの停止、終了

強制終了はkill

$ sudo docker kill 158

停止はstop

$ sudo docker stop 158

開始はstart

$ sudo docker start 158

こちらの方の記事が非常に参考になりました↓

Dockerコンテナの作成、起動〜停止まで


#08 ContainerからImageを作ってみよう

Containerの中でImageを作成したり、変更したりする。

1.Containerにインタラクティブモードで入る(run -i

2.ターミナルを立ち上げる(オプション-t

3.引数で与えられた/bin/bashでシェルを指定

$ sudo docker run -i -t centos /bin/bash

これで、Containerの中に入れるため、試しにlsで構成を見てみる。

ここに新しくhello.txtファイルを作成する。

touchコマンドを利用しました。 ⇒ 空のファイルを作成しよう!!

新しくファイルの作成が確認できたら、exitでインタラクティブモードから抜ける。

そして、Imageを作成する。

(このあたりはGitに似ているかも。)

# CONTAINER IDの取得

$ sudo docker ps -a

# commitでImageを作成
$ sudo docker commit 0f2 naoki85/hello

# Imageを確認
$ sudo docker images

これで作成したContainerがImageとして保存された。


#09 Dockerfileを使ってみよう

1.Imageを取得して、2.Containerを作成して、3.再びImageにする。

この作業を一連の流れとしてビルドすることができる。

その際には、Dockerfileを利用する。

カレントディレクトリにDockerfileを作成し、以下のように記述する。

(今回はechoするだけ。)

# 元にするImageを書く

FROM centos
# 誰が書いたか記述
MAINTAINER naoki85 <naoki85@gmail.com>
# RUN: buildするときに実行される
RUN echo "now building..."
# CMD: runするときに実行される
CMD ["echo","now running..."] # CMD echo "now running..."

これを以下のコマンドでビルドする。

詳しくは下記のリファレンスに記載されているが、build -tでImageにタグ付けして構築している。

build - コマンドライン・リファレンス

$ sudo docker build -t naoki85/echo .

# 以下、処理中の表示
Sending build context to Docker daemon 15.36 kB
Step 1 : FROM centos
---> 778a53015523
Step 2 : MAINTAINER naoki85 <naoki85@gmail.com>
---> Running in 235bbf9e23b6
---> 368aad18e229
Removing intermediate container 235bbf9e23b6
Step 3 : RUN echo "now building..."
---> Running in ac042091f261
now building...
---> 0cee1630782e
Removing intermediate container ac042091f261
Step 4 : CMD echo now running...
---> Running in a5c7a1380e79
---> 682ab136f943
Removing intermediate container a5c7a1380e79
Successfully built 682ab136f943

これで、Imageが作成された。

試しにrunをしてみると、CMDで記述したコマンドが実行される。

sudo docker run naoki85/echo

# now running...


#10 Webサーバーを立ち上げてみよう

httpdがインストールされないため、ここは注意が必要。

(バグ?他の方の記事にもあったよう⇒Ubuntu上のdocker build で error

また、ちょっと古い仕様だから、という指摘も受けた。

こちらについては調査する。

ビルドの際にWebサーバーをインストールし、runで確認する。

FROM centos

MAINTAINER naoki85 <naoki85@gmail.com>
RUN yum install -y httpd
# index.htmlをコピー
ADD ./index.html /var/www/html/
# 80番ポートをあける
EXPOSE 80
CMD ["usr/sbin/httpd","-D","FOREGROUND"]

適当なindex.htmlを作成してビルドする。

$ sudo docker build -t naoki85/httpd .

ビルドが成功したら、run

$ sudo docker run -p 8080:80 -d naoki85/httpd

成功していれば、Webページが表示されている。


#11 Imageをpushしてみよう

Imageをプッシュするためには、Docker Hubにログインしなければならない。

$ sudo docker login

# ユーザーネームとパスワードが聞かれる
# ログアウトはsudo docker logout

その後、Imageをプッシュする

$ sudo docker push naoki85/httpd

すると、Docker Hubの方に登録されている。


終わりに

httpdのインストールのところは現在の仕様だとうまくいかないようなので、解決法を探す。