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 補(bǔ)全命令 :

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 指定窗口的內(nèi)核能力
command 覆蓋容器啟動后默認(rèn)執(zhí)行的命令
cgroup_parent 指定父 cgroup 組铃诬,意味著將繼承該組的資源限制 。 目前不支持 Swarm 模式
container_name 指定容非名稱缤至。 目前不支持 Swarm 模式
devices 指定設(shè)備映射關(guān)系,不支持 Swarm 模式
depends_on 指定多個服務(wù)之間的依賴關(guān)系
dns 自定義 DNS 服務(wù)器
dns_search 配置DNS搜索域
dockfile 指定額外的編譯鏡像的 Docke file 文件
entrypoint 覆蓋容器中默認(rèn)的人口命令
env_file 從文件中獲取環(huán)境變量
environment 設(shè)置環(huán)境變量
expose 暴露端口呆细,但不映射到宿主機(jī)态辛,只被連接的服務(wù)訪問
exetends 基于其他模板文件進(jìn)行擴(kuò)展
external_links 鏈接到docker-compose.yml外部的容器
extra_hosts 指定額外的 host 名稱映射信息
healthcheck 指定檢測應(yīng)用健康狀態(tài)的機(jī)制
image 指定為鏡像名稱或鏡像id
isolation 配置容器隔離的機(jī)制 v
lables 為容器添加Docker無數(shù)據(jù)信息
links 連接到其他服務(wù)中的容器
logging 與日志相關(guān)的配置
network_mode 設(shè)置網(wǎng)絡(luò)模式
networks 所加入的網(wǎng)絡(luò)
pid 跟主機(jī)系統(tǒng)共享進(jìn)程命名空間
ports 暴露端口信息
secrets 配置應(yīng)用的秘密數(shù)據(jù)
security_opt 指定容器模板標(biāo)簽(label)機(jī)制的默認(rèn)屬性(用戶阶界、角色、類型坛梁、級別等)
stop_grace_period 指定應(yīng)用停止時而姐,容器的優(yōu)雅停止期限。過期后則通過SIGKILL強(qiáng)制退出划咐,默認(rèn)值為10s
stop_signal 指定停止容器的信號
sysctls 配置容器內(nèi)的內(nèi)核參數(shù)拴念。 目前不支持 Swarm 模式
ulimits 指定容器的 ulimits 限制值
userns_mode 指定用戶命名空間模式钧萍。 目前不支持 Swarm模式
volumes 數(shù)據(jù)卷所掛載路徑設(shè)置
restart 指定重啟策略
deploy 指定部署和運(yùn)行時的容器相關(guān)配置。 該命令只在 Swarm 模式下生效政鼠,且只支持 docker stack deploy 命令部署

應(yīng)用案例: Web負(fù)載均衡

首先創(chuàng)建一個haprox_web目錄风瘦,作為項目工作目錄,并在其中分別創(chuàng)建兩個子目
錄: web和haproxy公般。

  1. web子目錄
    在web子目錄下將放置所需Web應(yīng)用代碼和Dockerle, 一會將生成需要的Web鏡像万搔。
    這里用Python程序來實現(xiàn)一個簡單的Web應(yīng)用,該應(yīng)用能響應(yīng)HTTP請求俐载,返回的頁
    面將打印出訪問者的 IP 和響應(yīng)請求的后端容器的 IP蟹略。
    編寫一個index.py作為服務(wù)器文件,代碼為:
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,內(nèi)容如下:

FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
  1. haproxy目錄
    該目錄將配置haproxy鏡像遏佣。 在其中生成一個haproxy.cfg文件挖炬, 內(nèi)容為:
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目錄下運(yùn)行
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 的統(tǒng)計信息

圖片.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撩独,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子账月,更是在濱河造成了極大的恐慌综膀,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件局齿,死亡現(xiàn)場離奇詭異剧劝,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)抓歼,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進(jìn)店門讥此,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人谣妻,你說我怎么就攤上這事萄喳。” “怎么了拌禾?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵取胎,是天一觀的道長。 經(jīng)常有香客問我,道長闻蛀,這世上最難降的妖魔是什么匪傍? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮觉痛,結(jié)果婚禮上役衡,老公的妹妹穿的比我還像新娘。我一直安慰自己薪棒,他們只是感情好手蝎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著俐芯,像睡著了一般棵介。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上吧史,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天邮辽,我揣著相機(jī)與錄音,去河邊找鬼贸营。 笑死吨述,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钞脂。 我是一名探鬼主播揣云,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼冰啃!你這毒婦竟也來了邓夕?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤阎毅,失蹤者是張志新(化名)和其女友劉穎翎迁,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體净薛,經(jīng)...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年蒲拉,在試婚紗的時候發(fā)現(xiàn)自己被綠了肃拜。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡雌团,死狀恐怖燃领,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情锦援,我是刑警寧澤猛蔽,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響曼库,放射性物質(zhì)發(fā)生泄漏区岗。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一毁枯、第九天 我趴在偏房一處隱蔽的房頂上張望慈缔。 院中可真熱鬧,春花似錦种玛、人聲如沸藐鹤。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娱节。三九已至,卻和暖如春祭示,著一層夾襖步出監(jiān)牢的瞬間肄满,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工绍移, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留悄窃,地道東北人。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓蹂窖,卻偏偏與公主長得像轧抗,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子瞬测,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內(nèi)容