- Fork from Docker cheat sheet
- 実際にコマンドを試したい場合は、すぐにDockerを試したい人のための基礎コマンドを参照
Why Should I Care (For Developers)
"Dockerが面白いのはシンプルな環境に隔離性と再現性をもたらしてくれることだ.ランタイムの環境を一度作れば、パッケージにして別のマシンでも再利用することできる.さらに,すべてはホスト内の隔離された環境で行われる(VMのように).最も素晴らしい点は,シンプルかつ高速であることだ."
"Xen とか VirtualBOX みたいにホスト内に仮想マシンを立ち上げるんじゃなくて、ホスト内の隔離された環境で仮想マシンを動かす技術。物理マシンをシミュレーションしているんじゃないってことは、VPS とか EC2 とかの仮想マシン上でも問題なく動くし、マシンを起動するプロセスが不要となるので、一瞬で使い始められるというメリットにつながっている。"
"UnionFS(ディレクトリを重ね合わせることができる)の実装の一つ。元の仮想マシンイメージを書き換えないで、更新が発生した部分は別の場所に書き込んでいくようになっている。これにより、仮想マシンの立ち上げ時にイメージのコピーが発生しないので、すぐに使い始められる。"
VirtualBoxとVagrantを準備する.dmgでインストール可能であるが,HomebrewとBrew Caskを使えば,コマンドラインからインストールすることも可能.
Homebrewのインストール
ruby -e "$(curl -fsSL https://raw.github.com/mxcl/homebrew/go)"
Virtualboxとvagrantのインストール
brew tap phinze/homebrew-cask
brew install brew-cask
brew cask install virtualbox
brew cask install vagrant
今回は,Dotcloudが準備したVagrantfileを用いる: docker/Vagrantfile(訳者注: 原典ではDocker friendlyなvagrant boxを使っているが,こちらを使ったほうが簡単なので改変).
git clone https://github.com/dotcloud/docker
cd docker
vagrant up
vagrant ssh
docker run ubuntu /bin/echo hello world
Your basic isolated Docker process. コンテナのVMに対する関係は,スレッドに対するプロセスの関係とみなすことができる. もしくはコンテナをchrootと見なすこともできる.
いくつかの誤解:
- コンテナは一時的なものではない.
docker run
はあなたが考えているものではない. - コンテナは単一のコマンドやプロセスに限定されない 奨励されているだけ.
docker run
コンテナを作成する.docker stop
コンテナを停止する.docker start
コンテナを起動する.docker restart
コンテナを再起動する.docker attach
起動中のコンテナに接続する.docker rm
コンテナを破棄する(コンテナを停止する必要がある)docker wait
コンテナが停止するまでブロックする.
コンテナを起動し,それに接続したい場合は,docker start
してからdocker attach
する.
完全に一時的なコンテナを作りたい場合は,docker run -rm
で作成すれば停止(docker stop
)後にコンテナは破棄される.
ホストのディレクトリをコンテナ内にマウントしたい場合は,docker run -v $HOSTDIR:$DOCKERDIR IMAGE COMMAND
とする.
docker ps
起動中のコンテナを表示する.docker inspect
コンテナの全情報を表示する(IPを含む).docker logs
コンテナのログを表示する.docker events
コンテナ内のイベントを表示する.docker port
コンテナのportを表示する.docker top
コンテナのプロセスを表示する.
docker ps -a
起動中と停止中のコンテナを表示する.
docker cp
コンテナ内のファイルをホストにコピーする.docker export
コンテナのファイルシステムを出力する.
イメージとは単にdockerコンテナのためのテンプレート.
docker pull
レジストリからdockerイメージ,もしくはレポジトリを取得する.docker import
ファイルシステムのtarballからイメージを取得する.docker tag
イメージにタグをつける.(タグ名は<username>/<imagename>が奨励されている)docker build
Dockerfileからイメージを作成する.docker commit
コンテナからイメージを作成する.docker rmi
イメージを削除する.docker insert
URLからイメージにファイルを取り込む.docker load
標準入力としてtarファイルからレポジトリを取り込む.タグとイメージを含む(バージョン0.7現在)
単にイメージ内にログインしたい場合は,docker run -rm -t -i IMAGE /bin/bash
とする.
docker import
と docker commit
はファイルシステムをセットアップするだけで,DockerfileのようなCMDやENTRYPOINT,EXPOSEは含まない.bug.
docker images
全イメージを表示する.docker history
イメージの履歴を表示する.
レポジトリ(repository)は,ホストされた タグ付きのイメージの集合.
レジストリ(registry)は,ホスト -- レポジトリを保持し,[レポジトリのアップロードやダウンロードのためのHTTP APIを提供する](http://docs.docker.io/en/l\ atest/use/workingwithrepository)サーバ.
Docker.ioは,自身のindexをレジストリにホストしており,多くのレポジトリが存在している. (自分のレポジトリをhttps://index.docker.io/に作成することも可能)
docker login
レジストリにログインする.docker search
レジストリのイメージを検索する.docker pull
レジストリからdockerイメージ,もしくはレポジトリを取得する.docker push
イメージをレジストリにプッシュする.(レポジトリ名は/<repo_name>)
configurationファイル.docker build
とすることでDockerコンテナのセットアップを行う.docker commit
よりも好ましい.
http://github.com/wsargent/docker-devenvを読むが良い.より詳細にはbest practicesが良い.
訳者の例、Dockerで複数バージョンのrubyがインストールされたイメージを作る
DockerのAufsはLayersに基づく. Layersはファイルシステムのためのgit commitsもしくはchangesetsのようなものである.
Linksは,Dockerコンテナ同士が通信するための仕組みである.Linking into Redisが唯一の実例.
例えば,CONTAINERという名前のついたコンテナがあり,以下のようにDockerfileに外部に晒すポートが設定されているとする.
EXPOSE 1337
このとき,LINKEDという名前の別のコンテナを以下のように作成すると,
docker run -d -link CONTAINER:ALIAS -name LINKED user/wordpress
外部に晒したポートとコンテナのエイリアスが以下の環境変数でLINKEDコンテナに現れる.
$ALIAS_PORT_1337_TCP_PORT
$ALIAS_PORT_1337_TCP_ADDR
Linksを削除するには,docker rm -link
とする.
Dockerのvolumesは流動的な(free-floating)なファイルシステムである.volumesは特定のコンテナに接続されていなくてよい.
volumesは,linksが使えない状況で便利である.例えば,2つのDockerインスタンスの通信をそのファイルシステムと切り離して行う必要があるときなど.
docker run -volume-from
とすれば,同時に複数のDocker コンテナでそれらをマウントすることができる.詳細はadvanced volumes.
参考
毎回コンテナのIDを保持するのは面倒
ID=$(docker run ubuntu /bin/echo hello world)
docker commit $ID hello-world
以下のaliasを設定すると便利
alias dl='docker ps -l -q'
docker run ubuntu echo hello world
docker commit `dl` helloworld
Cmd
は起動後のコンテナで実行するコマンド
docker run -i -t ubuntu bash
apt-get install posgresql
exit
docker commit -run='{"Cmd":["postgres", "-too -many -opts"]}' `dl` postgres
docker inspect `dl` | grep IPAddress | cut -d '"' -f 4
もしくは
wget http://stedolan.github.io/jq/download/source/jq-1.3.tar.gz
tar xzvf jq-1.3.tar.gz
cd jq-1.3
./configure && make && sudo make install
docker inspect `dl` | jq -r '.[0].NetworkSettings.IPAddress'
docker run -rm ubuntu env
docker ps -a | grep 'weeks ago' | awk '{print $1}' | xargs docker rm
docker rm `docker ps -a -q`
docker images -viz | dot -Tpng -o docker.png