- 更新日: 2016年9月6日
- Docker
Docker入門、VM上でLinuxコンテナ立ち上げ〜基本操作まで
インフラCIの環境を、Docker, Chef, Serverspec, Jenkins を使って整えたいな〜と考え、遅ればせながら Docker に入門しました。
Docker – Build, Ship, and Run Any App, Anywhere
実現したいのは、まさに以下のエントリーのような自動化。Chef cookbook のレシピが、いつでも確実に正しく構成できることを CI したいのが一番の目的です。
Docker + Chef + serverspec + Jenkins でインフラCIの環境を構築してみた – hidemium’s blog
Docker 入門に際して、次の記事等を参考にしました。
いまさら聞けないDocker入門(1):アプリ開発者もインフラ管理者も知っておきたいDockerの基礎知識 – @IT
Docker 初心者は phusion/baseimage-docker を使おう | diaspora
実例で学ぶDockerコマンド – Qiita
今回のエントリーは入門ということで、とりあえず Mac の Vagrant 上 VM で Docker のコンテナを立ち上げ一通り操作を行うところまで。やってみて分かりましたが、Docker は、理解するには実際に触って動かすのが一番ですね。説明読んでるだけじゃ分かり辛いツールです。
— 環境 —
Mac OS X
Vagrant 1.6.3
VirtualBox 4.3.12
Docker 1.3.2
phusion/baseimage-docker の Vagrantfile を利用
Vagrant と VirtualBox は入っていること前提。入っていない場合は、以下を参考にしてインストールしておきます。
MacにVagrantとVirtualBoxをインストール | EasyRamble
先人達の教え通り、ubuntu ベースの phusion/baseimage-docker をベースイメージとして使わせてもらいます。
https://github.com/phusion/baseimage-docker
phusion/baseimage-docker は、passenger で有名な phusion 社が開発している Docker 用ベースイメージ(Ubuntuベース)です。Dockerに含まれるいくつかのバグに対するワークアラウンドや便利な管理ツールを含み、Dockerフレンドリーなイメージとなっているそうです(Readmeより)。この phusion/baseimage-docker で用意されている Vagrantfile を利用すると、Vagrant + Virtualbox 上に Docker を使うための VM(Ubuntu box)を簡単に準備できます。
適当な作業ディレクトリに、baseimage-docker の Vagrantfile をダウンロード。
1 2 3 4 5 |
$ mkdir Docker $ cd Docker $ wget https://raw.githubusercontent.com/phusion/baseimage-docker/master/Vagrantfile |
その後 vagrant up。初回は、ubuntu の box ファイルのインストールがあるため少々時間がかかります。
1 2 3 4 5 6 7 8 9 10 11 |
$ vagrant up Bringing machine 'default' up with 'virtualbox' provider... ==> default: Box 'phusion-open-ubuntu-14.04-amd64' could not be found. Attempting to find and install... default: Box Provider: virtualbox default: Box Version: >= 0 ==> default: Adding box 'phusion-open-ubuntu-14.04-amd64' (v0) for provider: virtualbox default: Downloading: https://oss-binaries.phusionpassenger.com/vagrant/boxes/latest/ubuntu-14.04-amd64-vbox.box ==> default: Successfully added box 'phusion-open-ubuntu-14.04-amd64' (v0) for 'virtualbox'! ... |
vagrant ssh で ubuntu VM にログイン。
1 2 3 4 5 6 7 8 |
$ vagrant ssh Welcome to Ubuntu 14.04 LTS (GNU/Linux 3.13.0-24-generic x86_64) * Documentation: https://help.ubuntu.com/ Last login: Tue Apr 22 19:47:09 2014 from 10.0.2.2 vagrant@ubuntu-14:~$ |
phusion/baseimage-docker の Vagrantfile を使うと、既に docker がインストールされた状態となっています。docker のバージョン確認。
1 2 3 4 |
vagrant@ubuntu-14:~$ docker -v Docker version 1.3.2, build 39fa2fa |
docker で Linux コンテナを立ち上げ “Hello Docker”
まずは、早速 Linux コンテナを立ち上げてみましょう。docker run コマンドで、linux コンテナを立ちあげることができます。以下の例は、ubuntu(VM)上の linux コンテナ内(ubuntuイメージ利用)で、echo コマンドで “Hello Docker” を出力させる例です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
vagrant@ubuntu-14:~$ docker run ubuntu /bin/echo Hello Docker Unable to find image 'ubuntu' locally ubuntu:latest: The image you are pulling has been verified 511136ea3c5a: Pull complete 5bc37dc2dfba: Pull complete 61cb619d86bc: Pull complete 3f45ca85fedc: Pull complete 78e82ee876a2: Pull complete dc07507cef42: Pull complete 86ce37374f40: Pull complete Status: Downloaded newer image for ubuntu:latest Hello Docker |
「docker run イメージ名 コマンド」のように docker run コマンドを使い、Linux コンテナを立ち上げる。
同様に centos の linux コンテナを立ち上げて Hello Docker する例。
1 2 3 |
vagrant@ubuntu-14:~$ docker run centos /bin/echo Hello Docker |
初回は各々 ubuntu, centos 用のイメージ(image)をダウンロードする必要があるため、多少時間がかかります。しかし、2回目以降の docker run では linux コンテナの立ち上げは一瞬です。このコンテナ起動の速さは凄い。
コンテナIDを取得するエイリアスのコマンドを設定
Docker でコンテナを操作する際に、コマンドにコンテナID(CONTAINER ID)を指定します。起動中のコンテナを表示する docker ps コマンドで、docker が自動的に振った CONTAINER ID を確認できます。
1 2 3 |
vagrant@ubuntu-14:~$ docker ps |
停止中のコンテナも全て表示するには、-a オプションを付ける。
1 2 3 |
vagrant@ubuntu-14:~$ docker ps -a |
コンテナIDの確認を毎回 docker ps で行うのは面倒ですので、間近に利用したコンテナのIDを一発で取得できるように、以下のエイリアスを設定しておくと便利です。
1 2 3 |
vagrant@ubuntu-14:~$ alias dl="docker ps --latest --quiet" |
コンテナを操作する各種 docker コマンド
コンテナを操作するためによく使う docker コマンドを列挙しておきます。CONTAINER_ID は、間近に起動したコンテナを指定する場合は dl
でも可。
起動中のコンテナを表示。
1 2 3 |
$ docker ps |
起動中・停止中のコンテナすべてを表示。
1 2 3 |
$ docker ps -a |
コンテナの詳細を表示。
1 2 3 |
$ docker inspect CONTAINER_ID |
コンテナのログを表示。
1 2 3 |
$ docker logs CONTAINER_ID |
停止中のコンテナを起動。
1 2 3 |
$ docker start CONTAINER_ID |
コンテナを停止。
1 2 3 |
$ docker stop CONTAINER_ID |
コンテナを強制終了。
1 2 3 |
$ docker kill CONTAINER_ID |
コンテナを再起動。
1 2 3 |
$ docker restart CONTAINER_ID |
コンテナにアタッチ。
1 2 3 |
$ docker attach CONTAINER_ID |
コンテナのプロセスを表示。
1 2 3 |
$ docker top CONTAINER_ID |
コンテナを削除。
1 2 3 |
$ docker rm CONTAINER_ID |
Docker の Linux コンテナ内に入る
Docker で立ち上げた Linux コンテナ内に入るには、docker run コマンドで /bin/bash を -i, -t オプション付きで実行する。
1 2 3 4 5 6 7 |
vagrant@ubuntu-14:~$ docker run -rm -i -t ubuntu /bin/bash root@5c352eff42c9:/# ps aux USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND root 1 0.5 0.1 18168 1888 ? Ss 09:00 0:00 /bin/bash root 17 0.0 0.1 15568 1132 ? R+ 09:00 0:00 ps aux |
-rm オプションをつけると、コンテナの停止後にコンテナが破棄されます。コンテナ内では、/bin/bash のプロセスしか起動していないことを確認できます。
コンテナをバックグランドで動かす
-d オプションを使うと、バックグラウンドでコンテナを動かせる。以下の例は、1秒毎に”hello docker”を出力し続けます。
1 2 3 |
vagrant@ubuntu-14:~$ docker run -d ubuntu /bin/sh -c "while true; do echo hello docker; sleep 1; done" |
ログを確認。
1 2 3 4 5 6 7 |
vagrant@ubuntu-14:~$ docker logs `dl` hello docker hello docker hello docker ... |
イメージを操作する各種 docker コマンド
続いて、コンテナをイメージに保存する方法についてです。その前に、イメージ操作で使うコマンドを確認します。
イメージ一覧を表示。
1 2 3 |
$ docker images |
イメージの情報を表示。
1 2 3 |
$ docker inspect user/image_id |
イメージを削除
1 2 3 |
$ docker rmi user/image_id |
コンテナをイメージとして保存
立ち上げたコンテナにソフトウェア(memcached)を追加でインストールし、docker commit でコンテナをイメージに保存する手順です。この機能により、独自のイメージを自由に作成できます。
まず最初の段階のイメージ一覧を確認。
1 2 3 4 5 6 |
vagrant@ubuntu-14:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE ubuntu latest 86ce37374f40 6 days ago 192.7 MB centos latest ae0c2d0bdc10 4 weeks ago 224 MB |
ubuntu コンテナを立ち上げ、memcached をインストールし、docker commit でコンテナをイメージ化します。
1 2 3 4 5 6 7 |
vagrant@ubuntu-14:~$ docker run -i -t ubuntu /bin/bash root@befb1c52bc92:/# apt-get update root@befb1c52bc92:/# apt-get install -y memcached root@befb1c52bc92:/# exit vagrant@ubuntu-14:~$ docker commit `dl` takafumir/memcached |
“docker commit コンテナID イメージ名” という書式のコマンド。イメージ名は “user/image_id” と付けるのが推奨だそうです。
イメージ一覧を確認。
1 2 3 4 5 6 7 |
vagrant@ubuntu-14:~$ docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE takafumir/memcached latest 4d8063548766 4 seconds ago 215.1 MB ubuntu latest 86ce37374f40 6 days ago 192.7 MB centos latest ae0c2d0bdc10 4 weeks ago 224 MB |
独自の takafumir/memcached という名前のイメージが追加されたことを確認できます。この独自に保存したイメージを使って、コンテナを起動することももちろん可能です。
Dockerfile からイメージをビルド
Docker のイメージは、Dockerfile というコマンドを書いた設定ファイルからビルドすることができます。簡単な Dockerfile を作成して、イメージをビルドしてみます。
Vagrantfile を置いたディレクトリは、VM の /vagrant にマウントされ、自動で同期される。これを利用してローカルで編集したファイルを Vagrant の VM 内でファイルを使えます。WEB+DBのサーバ/インフラ徹底攻略に書いてあった技です、感謝。コンテナのイメージ化、Dockerfileについては、サーバ/インフラ徹底攻略 (WEB+DB PRESS plus)の最後のほうのDocker記事を参考にしました。
ローカル Mac で Dockerfile を作成。
1 2 3 4 5 6 7 8 9 10 11 12 |
[mac]$ mkdir memcached [mac]$ vi memcached/Dockerfile FROM ubuntu RUN apt-get update RUN apt-get install -y memcached RUN apt-get clean CMD ["/usr/bin/memcached", "-vv"] USER memcache |
Dockerfile は VM の /vagrant/memcached/Dockerfile に同期されるので、そのディレクトリを指定してビルド。
1 2 3 |
vagrant@ubuntu-14:~$ docker build -t takafumir/memcached /vagrant/memcached |
これにより、takafumir/memcached という名前で、memcached がインストール済みのイメージがビルドされます。ビルドされたイメージは、もちろん docker run でのコンテナ立ち上げに利用できます。
最後におさらい、Docker でできること
・コミュニティのイメージを使ってコンテナを立ち上げられる。(docker run)
・独自のコンテナのイメージを作成できる。(docker commit)
・Dockerfile からイメージをビルドできる。(docker build)
・独自に作ったイメージからも、もちろんコンテナを立ち上げられる。(docker run)
・一旦イメージを手元に取得できたら、コンテナは一瞬で立ち上がる。
まだ実用できるレベルじゃないですけど、本日ちゃんと触ってみて Docker の理解がだいぶ進みました。インフラCIに、Docker 使えそうな手応えを掴めて良かったです。Docker初心者ですので、間違いなどありましたらご指摘歓迎です!
- Docker の関連記事
- マストドン(Mastodon)のDockerインスタンスをさくらVPSに設置してみた
- Docker for MacでDocker.qcow2のサイズがどんどん大きくなる問題
- DockerでRails + MySQLの開発環境を構築
- 初回公開日: 2014年12月2日
Leave Your Message!