Docker之Docker Compose簡化複雜容器應用的利器

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章