安裝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公般。
- 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 <<font color=\"blue\">" + guest + "</font>> to WebServer <<font color=\"blue\">" +
pair[1] + "</font>></p>")
else:
file.write("<p style=\"font-size:150%\" >#" + str(request[pair][1]) + ": <font color=\"maroon\">" + str(
request[pair][
0]) + " </font>request " + "from <<font color=\"navy\">" + guest + "</font>> to WebServer <<font color=\"navy\">" +
pair[1] + "</font>></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
- 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
- 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 端口,會獲取到頁面信息
訪問本地 70 端口稍刀,可以查看到 haproxy 的統(tǒng)計信息