Edited at

fig/docker-compose事始め

More than 3 years have passed since last update.

fig/docker-compose初心者なので、環境構築、超簡単なdocker-compose.yml、docker-compose xxのコマンドライン辺りを半年後の自分用にチラシの裏しておきます。なお、figはdockerへ統合された事に伴い、docker-composeと名前が変わっています。ここでは(タイトルを除いて)docker-composeで統一します。


docker-compose環境をEC2にsetupする

Amazon EC2 + Ubuntu14.04でのsetup手順です(docker-composeの最新verのinstallコマンドは随時ここを参照してください。以下は(現時点の最新の)Ver1.3.3の場合のCommandになります

まずはDocker (>v1.3)をいれる

#apt-get update
#wget -qO- https://get.docker.com/ | sh
#apt-get -y install sysv-rc-conf
#sysv-rc-conf docker on

続いて、docker-compose v1.3.3をいれる (curl経由)
#curl -L https://github.com/docker/compose/releases/download/1.3.3/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
#chmod +x /usr/local/bin/docker-compose

#docker-compose --version
で、1.3.3と表示される事を確認

なお、Mac等ではcurlでいれると実行時にErrorで動かないケースがあるみたいで、その場合はpythonのpip経由でsetupすると動くみたいです。

#apt-get install python-pip

#pip --version
#pip install -U docker-compose
#docker-compose --version


nodeとmongoのcontainerを立ち上げる

まずはdocker-compose.ymlというファイルを作ります。



  • nodemongoと言うserviceが定義されます (なおservice名は英数字のみ、_とか-は使えない)。

    それぞれ、./node_test./mongo_test以下のDockerfileからcontainerが作成されます。


  • node serviceからmongo serviceを参照するので、node側にlinksの設定をします


docker-compose.yml

node:

build: ./node_test
ports:
- "25525:80"
links:
- mongo
mongo:
build: ./mongo_test
ports:
- "27017:27017"

この状態で、docker-compose upを実行すると、containerの作成と起動がされるはず!

docker-compose up -dでbackgroundでdocker-composeを動かしてくれます。


docker-compose.ymlのoption

本家docker-compose.ymlの説明がモトネタです。

Option名
意味

web
任意の名前

build
Dockerfile のpath

image
Dockerのimage IDもしくはTag。既に完成済のimageを使うか、imageをnetwork経由で持ってくる場合

links
別のContainerを参照する場合に使う、docker run --linkに相当

external_links
docker-compose.ymlに書かれて無い別containerを参照する場合に使う, docker-compose v1.1の新機能

ports
Host側にPortをbindする場合に使う、docker run -pに相当、exposeとの使い分けに注意

expose
Host側にPortをbindせずに別containerと通信する場合に使う、portsとの使い分けに注意

volumes
host linuxのdirectoryをcontainer側にmountする場合に使う、docker run -vに相当

command
DockerfileのCMDを上書きしてする場合に使う

environment
container内での環境変数を追加設定する


docker-composeコマンドのoption

本家docker-composeのコマンドラインオプションが元ネタです。


docker-compose up

docker-compose.ymlを探してそこにに書かれた内容から、containerの再構築/起動/Linkを行う。



  • docker-compose up -dとすると、backgroundでdocker-composeが動く


  • docker-compose up --no-recreateとすると、containerの停止/再構築がされず、停止状態のcontainerの起動から始まる


docker-compose ps

docker psと同じで、containerの状態をdumpしてくれる


docker-compose logs

個々のcontainerの標準出力が纏められて出力される。


docker-compose run

主に問題解析用のcommandか。本家では、Run a one-off command on a serviceと書かれて居る。



  • docker-compose run node

    docker-compose.ymlの中で、nodeで設定されたserviceと、そこからlinksで指定されたservivce達が立ち上がる


  • docker-compose run node /bin/sh

    nodeのDockerfileのCMDの内容は実行されず、nodeserviceのcontainerのshell状態で立ち上がる


  • docker-compose run --service-ports node /bin/sh

    docker-compose.ymlのportsの設定が有効な状態でcontainerのshell状態で立ち上がる


  • docker-compose run node cat /etc/hosts

    node serviceの/etc/hostsをdump, linkしているcontainerのhost名の確認ができる


  • docker-compose run --no-deps node cat /etc/hosts

    --no-depsを加えると、linksで指定されたserviceが起動しない状態でnode serviceのcontainerを起動


  • docker-compose run node env

    envを加えると、nodeで設定されたserviceの環境変数がDumpされる

注意点



  • --service-ports のoptionが無いと、docker-compose.ymlのportsの設定が無効状態でContainer起動するので注意。


  • docker run xxで起動した場合、環境変数は設定されて居ない状態でContainerが立ち上がります。docker-compose.ymlのenvironmentで設定した内容も、linksで設定した別Containerの内容も設定されません。containerのshellでexport xx=yyなどで個別に設定してあげる必要があります (何か上手い回避策があれば教えてください)。


docker-compose build

docker-compose.ymlから参照されているdocker imageを作り直します。Dockerfile等を書き直した時には、作りなおしが必要です。

なお、--no-cacheのOptionは動かないみたいなので、cache無しで0から作り直したい場合には、docker build --no-cacheを実行する必要が有ります。


為になるLink