Docker Compose—簡化複雜應用的利器

Docker Compose—簡化複雜應用的利器

2015年5月17日 by debugo · 4條評論python

Compose是用於定義和運行復雜Docker應用的工具。你能夠在一個文件中定義一個多容器的應用,而後使用一條命令來啓動你的應用,而後全部相關的操做都會被自動完成。mysql

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-composegit

1github

2web

3redis

4sql

5docker

6shell

7flask

8

9

10

# 當前最新的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

1

2

3

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

1

2

3

4

FROM python:2.7

ADD ./code

WORKDIR /code

RUN pip install -r requirements.txt

 

其中,requirements.txt中的內容包括:

 

flask redis

1

2

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)

1

2

3

4

5

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

1

2

3

4

5

6

7

8

9

10

11

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

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"

1

ports:-"3000"-"8000:8000"-"127.0.0.1:8001:8001"

 

expose:導出端口,但不映射到宿主機的端口上。它僅對links的容器開放。格式直接指定端口號便可。
volumes:加載路徑做爲卷,能夠指定只讀模式:

 

volumes:-/var/lib/mysql - cache/:/tmp/cache -~/configs:/etc/configs/:ro

1

2

3

volumes:-/var/lib/mysql

- cache/:/tmp/cache

-~/configs:/etc/configs/:ro

 

volumes_from:加載其餘容器或者服務的全部卷

 

environment:- RACK_ENV=development - SESSION_SECRET

1

2

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

1

2

3

4

5

6

7

8

9

10

11

12

13

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

1

2

3

4

5

6

7

8

9

10

11

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
參考:
Compose Document

相關文章
相關標籤/搜索