文档章节

Docker Compose—简化复杂应用的利器

M
 Mackchao_Sun
发布于 2016/10/17 15:06
字数 1556
阅读 22
收藏 0

Docker Compose—简化复杂应用的利器

2015年5月17日 by debugo · 4条评论

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

1

2

3

4

5

6

7

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

本文转载自:http://debugo.com/docker-compose/

M
粉丝 4
博文 158
码字总数 29095
作品 0
朝阳
技术主管
私信 提问
Docker搭建带有访问认证的私有仓库

以下步骤均为本人亲自踩坑,历经数次失败,最终搭建成功 一、环境信息: 操作系统:CentOS 7 Docker版本:1.12.5 (更高版本应该类似) registry:2.4.1 registry-web: hyper/docker-registry...

yuhaitao8922
2017/06/10
0
0
Kubernetes 实战教学,手把手教您如何在 K8s 平台上使用 Compose(二)

出品丨Docker公司(ID:docker-cn) 编译丨小东 每周一、三、五,与您不见不散! 用过 Kubernetes 的用户都知道 Kubernetes API 真的非常庞大。在最新的版本中,从 Pods 和 Deployments 到 ...

docker公司
02/18
0
0
Docker Toolbox:联合Compose、Boot2Docker、Kitematic

有了Toolbox,桌面用户在使用Docker时,可以将一系列使用容器运行的app组合在一起,对于用户来说,这是一个由来已久的痛点。 桌面用户在使用Docker时,一直是分成几个独立的部分:精简的Boo...

苏宁公有云
2015/08/20
219
0
“docker-app”实用工具分享,大大提高 Compose 文件复用率

本文首发自“Docker公司”公众号(ID:docker-cn) 编译丨小东 每周一、三、五 与您不见不散! Docker Compose 在开发人员中非常流行,它用来描述应用程序。目前,GitHub 上有超过30万个 Do...

docker公司
2018/06/27
0
0
docker-compose 所带来的方便

docker-compose 是一款开源的docker 简化复杂容器环境的管理工具 。 docker-compose 在结合Swarm 与 docker 进程化容器部署可以很方便的部署一套环境。 具体的流程如下: docker-compose v2 ...

jicki
2016/05/19
0
0

没有更多内容

加载失败,请刷新页面

加载更多

100天搞定机器学习|Day55 最大熵模型

1、熵的定义 熵最早是一个物理学概念,由克劳修斯于1854年提出,它是描述事物无序性的参数,跟热力学第二定律的宏观方向性有关:在不加外力的情况下,总是往混乱状态改变。熵增是宇宙的基本定...

机器学习算法与Python实战
34分钟前
5
0
找子表

select a.constraint_name, a.table_name, b.constraint_name from user_constraints a, user_constraints b where a.constraint_type = 'R' and b.constraint_type = 'P' and a.r_constrain......

兵荒马乱的青春
36分钟前
6
0
Web应用安全如何防御或者检查漏洞?

     Web应用安全如何防御或者检查漏洞?这是大家一直关心的问题。随着计算机技术的发展,网络漏洞也变得越来越多样化了,你知道吗,每隔9 小时就会发布 1 个严重漏洞,并且有可能会进行远...

梅丽莎好
44分钟前
7
0
Vim 复制粘帖格式错乱问题的解决办法

有时候,复制文本(尤其是代码)到 Vim,会出现格式错乱的问题。看样子,应该是自动缩进惹得祸。本文不去深究原因,直接给出解决方法。 1. paste 模式 运行如下命令,进入 paste 模式: :set...

观海562
45分钟前
7
0
OSM初识(三)OSM Data

一 导出数据 将XML格式的OSM数据转换成另一种格式。 二 提取数据 剪切你选择区域内的数据,或者提取出特定区域特定的特征 三 数据格式 OSM文件仅属于OSM,不能用别的软件打开。其中后缀为bz2...

yuankaichao
55分钟前
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部