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というファイルを作ります。
-
node
とmongo
と言うserviceが定義されます (なおservice名は英数字のみ、_
とか-
は使えない)。
それぞれ、./node_test
と./mongo_test
以下のDockerfileからcontainerが作成されます。 -
node
serviceからmongo
serviceを参照するので、node
側にlinksの設定をします
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
の内容は実行されず、node
serviceの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
- 本家docker-compose.ymlの説明
- 本家docker-composeのコマンドラインオプション
- Touch the fig(1)
- docker-compose v1.1の新機能, 以下の2つが大きい機能追加かな
-
external_links
自分のdocker-compose.ymlに書かれて居ないdocker containerとlinkできる -
env_file
環境変数を記述して置ける。docker run --env-file
がdocker-compose上でもできる