Compose是用於定義和運行復雜Docker應用的工具。你可以在一個文件中定義一個多容器的應用,然後使用一條命令來啓動你的應用,然後所有相關的操作都會被自動完成。
1. 安裝Docker和Compose
# 當前最新的Docker是1.6.2,Compose爲1.2.0
curl -s https://get.docker.io/ubuntu/ | sudo sh
sudo apt-get update
sudo apt-get install lxc-docker
# 參考http://docs.docker.com/compose/install/#install-compose
curl -L https://github.com/docker/compose/releases/download/1.2.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose上面這個方法真的慢出翔,可以通過Python pip安裝。
apt-get install python-pip python-dev
pip install -U docker-compose
這樣compose就安裝好了,查看一下compose的版本信息:
chmod +x /usr/local/bin/docker-compose docker-compose -version docker-compose 1.2.0
2. 使用Compose
使用Compose只需要簡單的三個步驟:首先,使用Dockerfile來定義你的應用環境:
FROM python:2.7 ADD ./code WORKDIR /code RUN pip install -r requirements.txt
其中,requirements.txt中的內容包括:
flask redis
再用Python寫一個簡單的app.py
from flask importFlaskfrom redis importRedisimport os
app =Flask(__name__)
redis =Redis(host='redis', port=6379)@app.route('/')def hello():
redis.incr('hits')return'Hello World! I have been seen %s times.'% redis.get('hits')if __name__ =="__main__":
app.run(host="0.0.0.0", debug=True)
第二步,用一個compose.yaml來定義你的應用,他們可以在下個互隔離的容器中組成你的應用。
web:
build:.
command: python app.py
ports:-"5000:5000"
volumes:-.:/code
links:- redis
redis:
image: redis
第三步,執行docker-compose up來啓動你的應用,它會根據compose.yaml的設置來pull/run這倆個容器。
Creating myapp_redis_1... Creating myapp_web_1... Building web... Step 0 : FROM python:2.7 2.7: Pulling from python ... Status: Downloaded newer image for python:2.7 ---> d833e0b23482 Step 1 : ADD . /code ---> 1c04b1b15808 Removing intermediate container 9dab91b4410d Step 2 : WORKDIR /code ---> Running in f495a62feac9 ---> ffea89a7b090 Attaching to myapp_redis_1, myapp_web_1 ...... redis_1 | [1] 17 May 10:42:38.147 * The server is now ready to accept connections on port 6379 web_1 | * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit) web_1 | * Restarting with stat
3. Yaml文件參考
在上面的yaml文件中,我們可以看到compose文件的基本結構。首先是定義一個服務名,下面是yaml服務中的一些選項條目:
image
:鏡像的ID
build
:直接從pwd的Dockerfile來build,而非通過image選項來pull
links
:連接到那些容器。每個佔一行,格式爲SERVICE[:ALIAS],例如 – db[:database]
external_links
:連接到該compose.yaml文件之外的容器中,比如是提供共享或者通用服務的容器服務。格式同links
command
:替換默認的command命令
ports
: 導出端口。格式可以是:
ports:-"3000"-"8000:8000"-"127.0.0.1:8001:8001"
expose
:導出端口,但不映射到宿主機的端口上。它僅對links的容器開放。格式直接指定端口號即可。
volumes
:加載路徑作爲卷,可以指定只讀模式:
volumes:-/var/lib/mysql
- cache/:/tmp/cache
-~/configs:/etc/configs/:ro
volumes_from
:加載其他容器或者服務的所有卷
environment:- RACK_ENV=development - SESSION_SECRET
env_file
:從一個文件中導入環境變量,文件的格式爲RACK_ENV=development
extends
:擴展另一個服務,可以覆蓋其中的一些選項。一個sample如下:
common.yml webapp: build:./webapp environment:- DEBUG=false- SEND_EMAILS=false development.yml web:extends: file: common.yml service: webapp ports:-"8000:8000" links:- db environment:- DEBUG=true db: image: postgres
net
:容器的網絡模式,可以爲”bridge”, “none”, “container:[name or id]”, “host”中的一個。
dns
:可以設置一個或多個自定義的DNS地址。
dns_search
:可以設置一個或多個DNS的掃描域。
其他的 working_dir, entrypoint, user, hostname, domainname, mem_limit, privileged, restart, stdin_open, tty, cpu_shares
,和docker
run
命令是一樣的,這些命令都是單行的命令。例如:
cpu_shares:73 working_dir:/code entrypoint: /code/entrypoint.sh user: postgresql hostname: foo domainname: foo.com mem_limit:1000000000 privileged:true restart: always stdin_open:true tty:true
4. docker-compose常用命令
在第二節中的 docker-compose up
,這兩個容器都是在前臺運行的。我們可以指定-d命令以daemon的方式啓動容器。除此之外,docker-compose還支持下面參數:
--verbose
:輸出詳細信息
-f
制定一個非docker-compose.yml命名的yaml文件
-p
設置一個項目名稱(默認是directory名)
docker-compose的動作包括:
build
:構建服務
kill -s SIGINT
:給服務發送特定的信號。
logs
:輸出日誌
port
:輸出綁定的端口
ps
:輸出運行的容器
pull
:pull服務的image
rm
:刪除停止的容器
run
: 運行某個服務,例如docker-compose run web python manage.py shell
start
:運行某個服務中存在的容器。
stop
:停止某個服務中存在的容器。
up
:create + run + attach容器到服務。
scale
:設置服務運行的容器數量。例如:docker-compose scale web=2 worker=3