= Docker学習メモ = == 基本 == === インストール(on Ubuntu 14.04) === {{{ sudo apt-get install docker.io sudo ln -s /usr/bin/docker.io /usr/local/bin/docker }}} === 基本的なOSイメージ === `docker pull`コマンドで適当なディストリビューションのイメージをダウンロードする。 * debian * ubuntu * centos などがある。 `docker search`コマンドで検索できる。 == コンテナ一覧 == 動作中のコンテナ {{{ docker ps }}} 終了したものも含めた全てのコンテナ {{{ docker ps -a }}} == イメージ一覧 == {{{ docker images }}} 親子関係を表示 {{{ docker images -t }}} === Dockerfile === {{{ # Debianのwheezyを元にする。 FROM debian:wheezy # イメージのAuthorフィールドに表示される。 # ここを変えると全てのキャッシュが無効になるので注意 MAINTAINER ytoku めーるあどれす # RUNはコマンドを実行したあとコミットする。 # コミットは新しいコンテナを作成する。要するにaufsを更に重ねる。 RUN apt-get update RUN apt-get install -y python # 以降のコマンドの実行ユーザを設定 USER nobody # docker runした時の実行コマンド # 数値をダブルクォーテーションで囲い忘れがちなので注意 ENTRYPOINT ["python", "-mSimpleHTTPServer", "8000"] # ENTRYPOINTの後ろにデフォルトで追加される。 # debianではデフォルトで["/bin/bash"]が入っているので # ENTRYPOINTを設定するときは忘れず空にする。 # ENTRYPOINTが設定されていない場合は、docker runしたときに # デフォルトで実行されるコマンドとなる。 CMD [] # 公開するポートを指定 # docker runする時に-p public_port:private_portで指定しないと外部には公開されない。 # むしろEXPOSEしなくても-pすれば公開される。 # docker run -p 8080:8000 EXPOSE 8000 }}} === Dockerfileを使ったビルド === ビルドするには {{{ docker build -t repository_name soruce-dir/ }}} ただしディレクトリ構成は {{{ source-dir/ Dockerfile additional-files }}} Dockerfile単体に対してビルドするには {{{ docker build -t respository_name - < Dockerfile }}} === 複数のデーモンを起動 === http://docs.docker.io/examples/using_supervisord/ == Q&A == === ゴミが溜まっていくのではないか === ==== コンテナ ==== 色々実験しているとゴミは溜まる。全てのコンテナを削除するには {{{ docker ps -aq | xargs docker rm }}} 適当にawkなどを噛ませてフィルタして削除すると良い。 実験する際には`run --rm`するとよい。 ==== イメージ ==== タグがついていないイメージを削除するには {{{ docker images | awk '$1 == "" {print $3}' | xargs docker rmi }}} === Dockerfileを編集してbuildし直し === Dockerfileを編集してbuildし直したい場合、前のイメージを削除してから再作成する必要はあるか? * 基本的にはない。`build`コマンドを再実行するとイメージを上書きしてくれる。 * さらにDockerfileの先頭から変更していない部分についてはキャッシュされる。 * 言い換えると`apt-get update`とかやってもキャッシュされるので注意。 === イメージとコンテナの違い === イメージ:: 「読み取り専用のレイヤー」のこと。割り振られたIDに対して中身が変化することは決して無い。 http://docs.docker.io/terms/image/ コンテナ:: 「読み書き可能なレイヤー」に親イメージに関する情報やネットワーク設定などを加えたもののこと。 `running`あるいは`exited`の状態を持つ。 http://docs.docker.io/terms/container/ === EXPOSEの意義 === * `EXPOSE`しておかないと`port`コマンドが動作しない。 他にある? === runしたときの影響範囲は? === runした時は指定したイメージを元に新しいコンテナが作られる。イメージが書き換わることはない。 実行結果をイメージにしたいときは`commit`コマンドを使用する。 === 何かのコマンドを実行したあとの状態を元に続けて操作を行うには? === `start`コマンドで、ファイルシステムへの変更を維持したままコマンドを再実行できる。 ただし`-a`オプションを付けないと実行したターミナルに対して自動で`attach`されないので注意。 あとで`start`するために一旦停止するには`stop`する。`restart`は`stop`+`start`? 直接他のコマンドを実行することは多分できない。 一旦`commit`でイメージにすれば他の作業を行うことも一応可能。 === 内部でiptables === `run`に`--privileged`オプションを渡す。 === セキュリティはどうなっている? === http://docs.docker.io/articles/security/