尝试使用Docker Compose

这是Docker附送的圣诞节日历的第18天文章。

在12月4日,Docker 宣布了 Machine、Swarm、Compose 这三个功能。(引用)

宣布推出Docker Machine、Swarm和Compose用于编排分布式应用。

由于Docker 迷你课程日历的第17天是关于 Machine 和 Swarm 的文章,所以这次我们来尝试一下 Compose。

Compose是指创建或组合某种东西的过程或行为。

这个项目似乎是受到了Fig的启发。
同时发布的Machine、Swarm和Compose,它们的位置如下所示。

    • Machine: どんな環境でもDockerの環境を構築

 

    • Swarm: Dockerコンテナのクラスタリング

 

    Compose: Swarmで作ったクラスタリング環境にそれぞれのコンテナを撒く

只要有这些工具,就可以实现Docker的编排。

目前好发展仍在进行中,Compose正在该处Github Issues上进行讨论。

试用Compose的步骤

我会按照Github Issues上所写的尝试一下。

Translation: I will try it as written on Github Issues.

本次尝试的Compose命令已经成为Docker客户端的一部分。

首先,将 boot2docker 的虚拟机内的 Docker 和本地的 Docker 客户端版本设置为 1.3.2-dev。首先从虚拟机内部开始。

$ boot2docker ssh
docker@boot2docker:~$ sudo -i
root@boot2docker:~# curl -LO http://cl.ly/0Q3G1l2t301S/download/docker-1.3.2-dev-linux
root@boot2docker:~# /etc/init.d/docker stop
root@boot2docker:~# mv /usr/local/bin/docker ./docker-stable
root@boot2docker:~# mv ./docker-1.3.2-dev-linux /usr/local/bin/docker
root@boot2docker:~# chmod +x /usr/local/bin/docker
root@boot2docker:~# /etc/init.d/docker start
root@boot2docker:~# docker version
docker@boot2docker:~$ docker version
Client version: 1.3.2-dev
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): c6bf574
OS/Arch (client): linux/amd64
Server version: 1.3.2-dev
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): c6bf574
root@boot2docker:~# exit
docker@boot2docker:~$ exit

然后使用手头的Docker客户端。

$ curl -LO http://cl.ly/1J1G323h3d3T/download/docker-1.3.2-dev-darwin-amd64
$ mv /usr/local/bin/docker ./docker-stable
$ mv ./docker-1.3.2-dev-darwin-amd64 /usr/local/bin/docker
$ chmod +x /usr/local/bin/docker
$ docker version
Client version: 1.3.2-dev
Client API version: 1.16
Go version (client): go1.3.3
Git commit (client): c6bf574
OS/Arch (client): darwin/amd64
Server version: 1.3.2-dev
Server API version: 1.16
Go version (server): go1.3.3
Git commit (server): c6bf574

我已经准备好了。
我将使用Redis构建一个带有访问计数器的网站。

在Compose中,我们将配置内容写入group.yml。

name: counter

containers:
  web:
    build: .
    command: python app.py
    ports:
      - "5000:5000"
    volumes:
      - .:/code
    links:
      - redis
    environment:
      - PYTHONUNBUFFERED=1
  redis:
    image: redis:latest
    command: redis-server --appendonly yes

我们将编写定义在网页上的Web服务器代码。

from flask import Flask
from redis import Redis

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)
flask
redis

然后,编写Web服务器的Dockerfile。

FROM python:2.7
ADD . /code
WORKDIR /code
RUN pip install -r requirements.txt

准备就绪!使用 docker up 运行!

$ docker up
Recreating redis
Starting redis
Recreating web
Starting web
redis |                 _._                                                  
redis |            _.-``__ ''-._                                             
redis |       _.-``    `.  `_.  ''-._           Redis 2.8.18 (00000000/0) 64 bit
redis |   .-`` .-```.  ```\/    _.,_ ''-._                                   
redis |  (    '      ,       .-`  | `,    )     Running in stand alone mode
redis |  |`-._`-...-` __...-.``-._|'` _.-'|     Port: 6379
redis |  |    `-._   `._    /     _.-'    |     PID: 8
redis |   `-._    `-._  `-./  _.-'    _.-'                                   
redis |  |`-._`-._    `-.__.-'    _.-'_.-'|                                  
redis |  |    `-._`-._        _.-'_.-'    |           http://redis.io        
redis |   `-._    `-._`-.__.-'_.-'    _.-'                                   
redis |  |`-._`-._    `-.__.-'    _.-'_.-'|                                  
redis |  |    `-._`-._        _.-'_.-'    |                                  
redis |   `-._    `-._`-.__.-'_.-'    _.-'                                   
redis |       `-._    `-.__.-'    _.-'                                       
redis |           `-._        _.-'                                           
redis |               `-.__.-'                                               
redis | 
redis | [8] 18 Dec 08:19:20.335 # Server started, Redis version 2.8.18
redis | [8] 18 Dec 08:19:20.336 # WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect.
redis | [8] 18 Dec 08:19:20.336 # WARNING you have Transparent Huge Pages (THP) support enabled in your kernel. This will create latency and memory usage issues with Redis. To fix this issue run the command 'echo never > /sys/kernel/mm/transparent_hugepage/enabled' as root, and add it to your /etc/rc.local in order to retain the setting after a reboot. Redis must be restarted after THP is disabled.
redis | [8] 18 Dec 08:19:20.336 # WARNING: The TCP backlog setting of 511 cannot be enforced because /proc/sys/net/core/somaxconn is set to the lower value of 128.
redis | [8] 18 Dec 08:19:20.336 * The server is now ready to accept connections on port 6379
web   |  * Running on http://0.0.0.0:5000/
web   |  * Restarting with reloader

当在浏览器中打开 http://(boot2dockerVM的IP):5000

$ open http://$(boot2docker ip):5000
docker_compose.png

通过重新加载,计数会逐渐增加。
查看Docker日志,可以看到访问日志正常输出。

web   | 192.168.59.3 - - [18/Dec/2014 08:19:36] "GET / HTTP/1.1" 200 -

换句话说

希望 Fig 也能成为现阶段的打开模式。
希望能简化 Multi-Hosts 之类的操作。

广告
将在 10 秒后关闭
bannerAds