技術ネタはQiitaに移りました。壁もどこぞに。

Docker を使ってみる

コマンドをググってみた。Qiita によさ気なのがあったので、参考に。

ポートフォワードや、ホスト・コンテナ間のディレクトリ共有ができるようなので、このへんおさえておけば大抵のことはできそう。実際に、適当なイメージを拾ってきて、起動・動作確認までをやってみる。

Docker イメージの検索

まずはイメージの検索から。docker search で公開されている Docker イメージの検索ができる。

$ sudo docker search httpd
NAME                         DESCRIPTION                                     STARS     OFFICIAL   AUTOMATED
httpd                        The Apache HTTP Server Project                  25        [OK]
centos/httpd                                                                 4
simpledrupalcloud/httpd                                                      1                    [OK]
chbrun/httpd                                                                 0                    [OK]
blinkmobile/apache-httpd     Starting with an Ubuntu base image, this p...   0                    [OK]
avalawn/docker-httpd                                                         0                    [OK]

OFFICIAL [OK] になっているのが公式イメージ。とりあえずこれを使う。

Docker イメージの取得

docker pull で検索したイメージを取得できる。

$ sudo docker pull httpd
511136ea3c5a: Pull complete
8771fbfe935c: Pull complete
0e30e84e9513: Pull complete
b383ad0b6022: Pull complete
8ca194da6670: Pull complete
17d1cc0a6b8f: Pull complete
f1244916b1c5: Pull complete
cb1152147ebb: Pull complete
bc0b697528ac: Pull complete
b051ef63bcb4: Pull complete
efca243ee409: Pull complete
d9a38da3e22c: Pull complete
159cb4622828: Pull complete
739aef46f6f6: Pull complete
f90095a67f5b: Pull complete
httpd:latest: The image you are pulling has been verified. Important: image verification is a tech preview feature and should not be relied on to provide security.
Status: Downloaded newer image for httpd:latest

apt-get で取得した docker.io パッケージの Docker 1.0.1 では、この pull できれいにイメージを取ってくることができず、途中でダウンロードが止まったり、REPOSITORY:TAG が設定されていなかったりしていたが、lxc-docker パッケージから入れた Docker 1.5.0 ではダウンロードも安定していて、REPOSITORY:TAG も正しく設定された状態で取得できた。

取得した Docker イメージの確認

docker images でローカルに保持している Docker イメージの一覧を確認できる。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
httpd               latest              f90095a67f5b        5 weeks ago         159.4 MB

Docker 1.0.1 では、イメージをひとつしか pull していないのに、何故か複数のイメージが表示されていたりしたが、Docker 1.5.0 では一覧の内容も正しくなっていた。

Docker コンテナの起動

いよいよ起動。docker run を使うがオプションがたくさんある。

$ sudo mkdir -p /var/opt/docker/httpd-1
$ sudo mkdir -p /var/opt/docker/httpd-2
$ sudo mkdir -p /var/opt/docker/httpd-3
$ sudo mkdir -p /var/opt/docker/httpd-4
$ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-1:/usr/local/apache2/htdocs httpd:latest
eb756ba23c2b1b69628b10903373853b1a7fe0ca0a1fbd0be115144c623ea188
$ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-2:/usr/local/apache2/htdocs httpd:latest
22780937665c4ec75c776277d18167679cf3b578628baf769edc726429c0563e
$ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-3:/usr/local/apache2/htdocs httpd:latest
219c733f64e346442cce768fc965a783b6d471f892e7391cc79e0b937ce1358f
$ sudo docker run -itd -p 80 -v /var/opt/docker/httpd-4:/usr/local/apache2/htdocs httpd:latest
1846f6acb7a5101f7b24680376836c69bf5a3a7abf98a8049387649c6e26aa74

この状態で4つの http サーバが起動している。-v-p がキモ。

-v では、ホスト・コンテナ間で共有するディレクトリを指定している。-v /var/opt/docker/httpd-4:/usr/local/apache2/htdocs は、ホストの /var/opt/docker/httpd-4 ディレクトリを、コンテナの /usr/local/apache2/htdocs ディレクトリに割り当てることを意味している。

-p では、コンテナ内のどのポートをホストに公開するかを指定している。端的にいえば、ポートフォワーディングの設定をおこなっている。-p 80 は、ホストの任意のポートを通じて、コンテナの80番ポートを公開することを意味している。ホストのポートを指定する場合は、-p {host-port}:{container-port} というかたちで指定する。公開されたポートを確認するには、docker ps を使用する。

Docker コンテナの利用

ここまでの流れで、ホストの /var/opt/docker/httpd-4 をコンテンツディレクトリとして、http サーバが起動しているので、試しにファイルを設置して動きを確認してみる。公開されているポートの確認をしてブラウザでアクセス。

$ sudo vi /var/opt/docker/httpd-4/index.html
...
$ sudo docker ps
CONTAINER ID        IMAGE               COMMAND              CREATED             STATUS              PORTS                   NAMES
1846f6acb7a5        httpd:latest        "httpd-foreground"   4 seconds ago       Up 4 seconds        0.0.0.0:49160->80/tcp   backstabbing_einstein
219c733f64e3        httpd:latest        "httpd-foreground"   19 minutes ago      Up 19 minutes       0.0.0.0:49159->80/tcp   admiring_babbage
22780937665c        httpd:latest        "httpd-foreground"   19 minutes ago      Up 19 minutes       0.0.0.0:49158->80/tcp   romantic_wozniak
eb756ba23c2b        httpd:latest        "httpd-foreground"   19 minutes ago      Up 19 minutes       0.0.0.0:49157->80/tcp   silly_mccarthy

f:id:Yoichi-KIKUCHI:20150308181906p:plain

これでいくらでも環境を個別に立てられるようになった。停止したいときは、docker stop {container-id|container-name} で。

念のため、今回の検証環境

$ uname -a
Linux ubuntu 3.16.0-31-generic #41~14.04.1-Ubuntu SMP Wed Feb 11 19:30:13 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux
$ docker --version
Docker version 1.5.0, build a8a31ef