docker-compose 使用例子

安装docker-compose,这里采用pip install的方式

yum install -y epel-release
yum install -y python-pip

pip install -U pip

pip install docker-compose

查看docker-compose版本

docker-compose -v
docker-compose version 1.24.1, build 4667896

添加 bash 补全命令 :

curl -L https://raw.githubusercontent.com/docker/compose/1.24.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

命令 功能
build 指定Dockerfile所在文件夹的路径
cap_add cap_drop 指定窗口的内核能力
command 覆盖容器启动后默认执行的命令
cgroup_parent 指定父 cgroup 组,意味着将继承该组的资源限制 。 目前不支持 Swarm 模式
container_name 指定容非名称。 目前不支持 Swarm 模式
devices 指定设备映射关系,不支持 Swarm 模式
depends_on 指定多个服务之间的依赖关系
dns 自定义 DNS 服务器
dns_search 配置DNS搜索域
dockfile 指定额外的编译镜像的 Docke file 文件
entrypoint 覆盖容器中默认的人口命令
env_file 从文件中获取环境变量
environment 设置环境变量
expose 暴露端口,但不映射到宿主机,只被连接的服务访问
exetends 基于其他模板文件进行扩展
external_links 链接到docker-compose.yml外部的容器
extra_hosts 指定额外的 host 名称映射信息
healthcheck 指定检测应用健康状态的机制
image 指定为镜像名称或镜像id
isolation 配置容器隔离的机制 v
lables 为容器添加Docker无数据信息
links 连接到其他服务中的容器
logging 与日志相关的配置
network_mode 设置网络模式
networks 所加入的网络
pid 跟主机系统共享进程命名空间
ports 暴露端口信息
secrets 配置应用的秘密数据
security_opt 指定容器模板标签(label)机制的默认属性(用户、角色、类型、级别等)
stop_grace_period 指定应用停止时,容器的优雅停止期限。过期后则通过SIGKILL强制退出,默认值为10s
stop_signal 指定停止容器的信号
sysctls 配置容器内的内核参数。 目前不支持 Swarm 模式
ulimits 指定容器的 ulimits 限制值
userns_mode 指定用户命名空间模式。 目前不支持 Swarm模式
volumes 数据卷所挂载路径设置
restart 指定重启策略
deploy 指定部署和运行时的容器相关配置。 该命令只在 Swarm 模式下生效,且只支持 docker stack deploy 命令部署

应用案例: Web负载均衡

首先创建一个haprox_web目录,作为项目工作目录,并在其中分别创建两个子目
录: web和haproxy。

  1. web子目录
    在web子目录下将放置所需Web应用代码和Dockerle, 一会将生成需要的Web镜像。
    这里用Python程序来实现一个简单的Web应用,该应用能响应HTTP请求,返回的页
    面将打印出访问者的 IP 和响应请求的后端容器的 IP。
    编写一个index.py作为服务器文件,代码为:
import sys
import BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
import socket
import fcntl
import struct
import pickle
from datetime import datetime
from collections import OrderedDict


class HandlerClass(SimpleHTTPRequestHandler):
    def get_ip_address(self, ifname):
        s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
        return socket.inet_ntoa(fcntl.ioctl(s.fileno(),
                                            0x8915,  # SIOCGIFADDR
                                            struct.pack('256s', ifname[:15])
                                            )[20:24])

    def log_message(self, format, *args):
        if len(args) < 3 or "200" not in args[1]:
            return
        try:
            request = pickle.load(open("pickle_data.txt", "r"))
        except:
            request = OrderedDict()

        time_now = datetime.now()
        ts = time_now.strftime('%Y-%m-%d %H:%M:%S')
        server = self.get_ip_address('eth0')
        host = self.address_string()
        addr_pair = (host, server)
        if addr_pair not in request:
            request[addr_pair] = [1, ts]
        else:
            num = request[addr_pair][0] + 1
            del request[addr_pair]
            request[addr_pair] = [num, ts]

        file = open("index.html", "w")
        file.write(
            "<!DOCTYPE html> <html> <body><center><hl><font color=\"blue\"face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</hl></center>")
        for pair in request:
            if pair[0] == host:
                guest = "LOCAL: " + pair[0]
            else:
                guest = pair[0]
            if (time_now - datetime.strptime(request[pair][1], '%Y-%m-%d %H:%M:%S')).seconds < 3:
                file.write("<p style=\"font-size:150%\" >#" + str(request[pair][1]) + ": <font color=\"red\">" + str(
                    request[pair][
                        0]) + " </font>request " + "from &lt<font color=\"blue\">" + guest + "</font>&gt to WebServer &lt<font color=\"blue\">" +
                           pair[1] + "</font>&gt</p>")
            else:
                file.write("<p style=\"font-size:150%\" >#" + str(request[pair][1]) + ": <font color=\"maroon\">" + str(
                    request[pair][
                        0]) + " </font>request " + "from &lt<font color=\"navy\">" + guest + "</font>&gt to WebServer &lt<font color=\"navy\">" +
                           pair[1] + "</font>&gt</p>")
        file.write("</body> </html>")
        file.close()
        pickle.dump(request, open("pickle_data.txt", "w"))


if __name__ == '__main__':
    try:
        ServerClass = BaseHTTPServer.HTTPServer
        Protocol = "HTTP/1.0"
        addr = len(sys.argv) < 2 and "0.0.0.0" or sys.argv[1]
        port = len(sys.argv) < 3 and 80 or int(sys.argv[2])
        HandlerClass.protocol_version = Protocol
        httpd = ServerClass((addr, port), HandlerClass)
        sa = httpd.socket.getsockname()
        print "Serving HTTP on", sa[0], "port", sa[1], " ..."
        httpd.serve_forever()
    except:
        exit()

生成一个index.html
编辑一个Dockerfile,内容如下:

FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
  1. haproxy目录
    该目录将配置haproxy镜像。 在其中生成一个haproxy.cfg文件, 内容为:
global
    log 127.0.0.1 local0
    log 127.0.0.1 local1 notice
    maxconn 4096
defaults
    log global
    mode http
    option httplog
    option dontlognull
    timeout connect 5000ms
    timeout client 50000ms
    timeout server 50000ms
listen stats
    bind 0.0.0.0:70
    mode http
    stats enable
    stats hide-version
    stats scope .
    stats realm Haproxy\ Statistics
    stats uri /
    stats auth user:pass
frontend balancer
    bind 0.0.0.0:80
    mode http
    default_backend web_backends
backend web_backends
    mode http
    option forwardfor
    balance roundrobin
    server weba weba:80 check
    server webb webb:80 check
    server webc webc:80 check
    #option httpchk
    #option httpchk GET /
    http-check expect status 200

  1. docker-compose.yml
    在haproxy_web目录下编写一个docker-compose.yml文件, 该文件是Compose
    使用的主模板文件。 其 中, 指定启动3个Web容 器(weba、 webb、 webc), 以及1个
    haproxy容器:
weba:
    build: ./web
    expose:
        - 80
webb:
    build: ./web
    expose:
        - 80
webc:
    build: ./web
    expose:
        - 80
haproxy:
    image: haproxy:1.6
    volumes:
        - ./haproxy:/haproxy-override
        - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    links:
        - weba
        - webb
        - webc
    ports:
        - "80:80"
        - "70:70"

在haproxy_web目录下运行
docker-compose up --build 命令,控制台会整合打印出所有容器的
输出信息:

Successfully built baab8924db96
Successfully tagged haproxy_web_weba:latest
Starting haproxy_web_weba_1 ... done
Starting haproxy_web_webb_1 ... done
Starting haproxy_web_webc_1 ... done
Starting haproxy_web_haproxy_1 ... done
Attaching to haproxy_web_webc_1, haproxy_web_weba_1, haproxy_web_webb_1, haproxy_web_haproxy_1

通过浏览器访问本地的 80 端口,会获取到页面信息


图片.png

访问本地 70 端口,可以查看到 haproxy 的统计信息

图片.png
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容