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
これでいくらでも環境を個別に立てられるようになった。停止したいときは、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