今更聞けない人の為の Docker 再入門
こんにちは、エンジニアの鈴木です。
近年のインフラ周りの技術革新はめまぐるしいスピードで進んでいますね。
インフラ周りの「今更聞けない人の為のシリーズ」は
・Vagrant
・Chef
に続いて3つ目になりました。
この記事は以下のような人を対象としています。
・Docker ってそもそも何?
・Docker って名前を聞いたことあるけど、触ったことがない。
Docker ってそもそも何?
Docker(ドッカー)とは、Go言語製の軽量な仮想化環境を実現するためのツールで、オープンソースのコンテナー管理ソフトウェアの1つです。
OSやアプリケーションの設定をしたものをそのままイメージとして保存できるので、Dockerが導入されている別のサーバに設定を簡単に移行することができます。
完全仮想化を行うハイパーバイザー型製品と違って Docker はコンテナ型仮想化なのでディスクの使用量も少なく、ビルドもデプロイも高速、オーバーヘッドも少ないのが利点としてあげられます。
Googleでは全てのソフトウェアをコンテナ上で動かしていることで話題になりました。
→ http://www.publickey1.jp/blog/14/google20.html
また「Docker Hub」の登場によりビルド、テスト、デプロイの一連の継続的インテグレーション/継続的デプロイを実現できるようになったりと、Docker は今非常に勢いのあるツールといえます。
Dockerを触ってみよう
触ってみないと Docker がどんなものかイメージできないかもしれないのでまずは触ってみましょう。
環境
・Mac OSX 10.9
・Virtualbox 4.3.12
・Vagrant 1.6.3
今回は Virtualbox + Vagrant の上に Ubuntu をのせてその上に Docker をのせたいと思いますので
Vagrant を使ったことがない人はこちらで予め学習しておいてください。
Virtualbox + Vagrant に Ubuntuを用意
Docker のホストOSに Ubuntu を使いたいと思います。
boxファイルはこちらから。
$ vagrant box add ubuntu14.04 https://cloud-images.ubuntu.com/vagrant/trusty/current/trusty-server-cloudimg-amd64-vagrant-disk1.box //作業ディレクトリ作成 $ mkdir ~/schoolwith_docker $ cd ~/schoolwith_docker // 初期化 $ vagrant init ubuntu14.04
Vagrantfile が作成されるのでIPアドレスの部分だけ編集してください。
今回は192.168.33.10にします。
// Vagrantの立ち上げ $ vagrant up // Ubuntuにログイン $ vagrant ssh
無事ログインできました。
仮想マシンにDockerをインストール
ここからはUbuntuにログインした状態からの作業となります。
ではこのUbuntuにDockerをインストールしましょう。
$ curl -s https://get.docker.io/ubuntu/ | sudo sh $ docker --version Docker version 1.1.1, build bd609d2
これで入りました。
Docker Imageを取得しよう
ではまずOSやアプリケーションなどの設定が入っている Docker Image を取得してきます。
docker searchコマンドを使用してもいいですし、公式サイトから検索しても良いです。
今回はCentOSという Docker Image を取得します。
$ sudo docker pull centos
取得した Docker Image の確認は下記のようにします。
$ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos centos7 1a7dc42f78ba 4 days ago 236.4 MB centos latest 1a7dc42f78ba 4 days ago 236.4 MB centos centos6 cd934e0010d5 4 days ago 206.9 MB
取得した Docker Image の詳細を確認するには下記のようにします。
// sudo docker inspect {REPOSITORY}:{TAG} $ sudo docker inspect centos:centos7 省略
新しい Docker Image を作ってみよう
ではDockerのコンテナに入って変更を加えて新しい Docker Image を作ってみましょう。
せっかくなので先日リリースされたCentOS7を使ってみます。
// -i → コンテナーの標準入力を開く。 // -t → ttyを確保する。 $ sudo docker run -it centos:centos7 /bin/bash bash-4.2#
Dockerのコンテナに入れました。
vim が入っていないので vim インストールしてみましょう。
bash-4.2# which vim which: no vim in bash-4.2# yum install vim-enhanced bash-4.2# which vim /usr/bin/vim
入りました。
ではこの vim が入った状態のコンテナの Docker Image を作ってみましょう。
// コンテナから抜ける bash-4.2# exit // コンテナの状態を見る $ sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 92c59e742cb9 centos:centos7 /bin/bash 9 minutes ago Exited (0) 2 minutes ago trusting_brown // Docker Imageを作る // sudo docker commit {CONTAINER ID} {ユーザ名/コンテナ名} $ sudo docker commit 92c59e742cb9 yudsuzuk/vim // yudsuzuk/vim という Docker Image ができているか確認 $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE yudsuzuk/vim latest 95aa3c0d75e1 44 seconds ago 344.6 MB centos centos7 1a7dc42f78ba 4 days ago 236.4 MB centos latest 1a7dc42f78ba 4 days ago 236.4 MB centos centos6 cd934e0010d5 4 days ago 206.9 MB // 作成したDocker Imageを実行 $ sudo docker run -it yudsuzuk/vim /bin/bash // vim が入っているか確認 bash-4.2# which vim /usr/bin/vim
ちゃんと Docker Image が作られていましたね。
Dockerfileを使ってみる
実は今実施した
・Docker Imageを取得
・コンテナに何らかの変更を加える
・Docker Imageを作成
という流れをDockerfileを使ってまとめて実行することが出来ます。
ではDockerfileを使ってWebサーバを立ち上げるコンテナを作ってみましょう。
$ vim Dockerfile # 以下の内容でDockerfileを作成 FROM centos:centos7 MAINTAINER Yuzuru Suzuki <yuzuru@schoolwith.me> # RUN: ビルド時に実行される RUN yum install -y httpd # 80番を開放 EXPOSE 80 # CMD: run時に実行される CMD ["/usr/sbin/httpd", "-D", "FOREGROUND"]
ビルドしてみましょう。
$ sudo docker build -t yudsuzuk/httpd .
実行してみましょう。
ローカルのポート5000番をコンテナ側の80番にフォワードしてやります。
$ sudo docker run -p 5000:80 -d yudsuzuk/httpd
Apacheが立ち上がっているか確認しましょう
→ http://192.168.33.10:5000
無事立ち上がっていました。
Docker Image を Docker Hub に push してみよう
まずは Docker hub でアカウントを作成してください。
作成が終わったらターミナルからログインしてDocker Hub に push してみましょう。
// ログイン $ sudo docker login Username: yudsuzuk Password: Email: yuzuru@schoolwith.me Login Succeeded // push $ sudo docker push yudsuzuk/httpd
こうすることでpush した Docker Image を 他の環境から pull して使えるようになります。
便利で、簡単ですね。
まとめ
駆け足で Docker の触りをお話しました。
Docker の開発は非常に活発で主要なベンダーもサポートを表明してます。
今後、コンテナ型仮想化技術はどんどん発展して、取り入れていくべき技術に変わっていくでしょう。
みなさんもぜひ活用してみてください。