Dockerの使い方
Dockerの使い方について調べたことをメモします。
インストールと起動
sudo yum install docker sudo chkconfig docker on sudo service docker start
以降の操作は全てrootで行うと仮定。
イメージの取得
pull
コマンドでイメージを取得する。
# docker pull centos:6.6
ここではcentosの6.6のイメージを指定している。イメージは、レポジトリとタグにより指定される。centosがリポジトリで、6.6がタグである。
デフォルトでは、Docker Hubという「レジストリ」からイメージを取得することになっている。
レジストリにどのようなリポジトリがあるかは、searchコマンドで検索できる。ただしタグは検索できない。
# docker search <search-keyword>
イメージ一覧の表示
images
コマンドでイメージがダウンロードされていることを確認する。
# docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos 6.6 8b44529354f3 2 weeks ago 202.6 MB
コンテナの起動
run
コマンドでイメージと何らかのコマンドを指定することで、コンテナが起動する。ここではコマンドとしてbash
を起動する。
# docker run -ti centos:6.6 /bin/bash
-t
は仮想端末を割り当てるオプション、-i
はSTDINを開いたままにするオプションで、シェルのようにインタラクティブに操作する場合はいずれも必須。
コンテナの中で操作
コンテナでhttpdをインストールしてみる。
# docker run -ti centos:6.6 /bin/bash [root@11dd19074528 /]# yum install -y httpd [root@11dd19074528 /]# echo 'hello world' > /var/www/html/index.html [root@11dd19074528 /]# exit
exitすると/bin/bashが死んでコンテナが停止する。しかしコンテナが停止しても、httpdのインストールがなされた状態のままで残る。どのようなコンテナが残っているのかは、docker ps -a
コマンドで確認できる。
# docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 11dd19074528 centos:6.6 "/bin/bash" About a minute ago Exited (0) 5 seconds ago condescending_shockley
イメージ化
コンテナをイメージとして保存(commit)することで、後に使いまわせるようになる。ここではcentos:httpd_installedというイメージ名でイメージ化する。
# docker commit -m 'install httpd' <image-id> centos:httpd_installed # docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE centos httpd_installed 53c383ebc5dc 15 seconds ago 270.9 MB centos 6.6 8b44529354f3 2 weeks ago 202.6 MB
なお、イメージ化してもコンテナは残り続けるので、rm
コマンドで明示的にコンテナを削除する。
# docker rm `docker ps -aq`
イメージからhttpdを起動
上で作成したイメージcentos:httpd_installedから、httpdを走らせてみる。
2つの方法がある。1つは、docker run
でhttpdを指定する方法。
# docker run -d -p 8080:80 centos:httpd_installed /usr/sbin/httpd -DFOREGROUND
ここでのポイントは以下のとおり。
もう1つは、一度コンテナで/bin/bashを走らせ、httpdをバックグラウンドで起動後、Ctrl-P, Ctrl-Qでコンテナからデタッチする方法。
# docker run -p 8080:80 -ti centos:httpd_installed /bin/bash [root@9964dde4e945 /]# service httpd start [root@9964dde4e945 /]# # detach; Ctrl-P Ctrl-Q #
1コンテナ1プロセスが定石とされていることから、1つめのほうが望ましそうだ。参照: http://docs.docker.jp/engine/articles/dockerfile_best-practice.html
どちらの方法でも、ホストからwgetを打てばhttpdが動作していることを確認できる。
# wget http://localhost:8080/index.html
httpdを監視
コンテナの中のhttpdを監視するケースを考える。
1つめの方法の場合(docker run
でhttpdを直接立ち上げた場合)、docker exec
を使うことで、コンテナで一時的に/bin/bashを走らすことができる。
# docker exec -it `docker ps -q` /bin/bash [root@9beb6db80222 /]# /etc/init.d/httpd status # 状態確認 httpd (pid 1) is running... [root@9beb6db80222 /]# exit exit
また、2つめの方法の場合(docker run
で一度コンテナに入ったあとにバックグラウンドでhttpd起動)、docker attach <container-id>
を使うことで、デタッチしたコンテナに再びアタッチできる。
コンテナの停止
stop
/kill
コマンド。
# docker stop <container-id>
参考) stopとkillの違い: http://elendia.hatenablog.com/entry/2014/09/16/040659
再び起動するときはdocker start
コマンド。
# docker start 9beb
イメージの削除
イメージを削除したい場合は、docker rmi
コマンド。
# docker rmi <image id>
スクリプト化
Dockerfileにより、イメージ作成をスクリプト化できる。
以下の内容でDockerfileという名前のファイルを置く。
FROM centos:6.6 RUN yum -y install httpd RUN echo 'Hello world' > /var/www/html/index.html EXPOSE 80 ENTRYPOINT /usr/sbin/httpd -DFOREGROUND
Dockerfile作成後、build
コマンドでイメージを作成。
# docker build -t centos:httpd_installed .
-t
でイメージ名を指定する。末尾の.
は、「Dockerfileを含むディレクトリ」を指定している。
そしてrun
でコンテナを起動すると、DockerfileのENTRYPOINTで指定したコマンドが実行される。
# docker run -p 8080:80 -d centos:httpd_installed