Docker-Compose操作ノート

19500 ワード

ターゲット:1つのHaproxy、3つのWebコンテナをマウントします。


プロジェクト作業ディレクトリとしてcompose-haproxy-webディレクトリを作成し、haproxyとwebの2つのサブディレクトリを作成します。


Webディレクトリ:

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("  

HA Webpage Visit Results

"
) 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("

#"

+ str(request[pair][1]) +": "+str(request[pair][0])+ " requests " + "from &lt"+guest+"&gt to WebServer &lt"+pair[1]+"&gt") else: file.write("

#"

+ str(request[pair][1]) +": "+str(request[pair][0])+ " requests " + "from &lt"+guest+"&gt to WebServer &lt"+pair[1]+"&gt") file.write(" ") 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(index.htmlファイルを一時的に生成し、その内容はindex.pyによって更新されます.)
$ touch index.html

Dockerfile
FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py

haproxyディレクトリ

  haproxy.cfg  , :
global
  log 127.0.0.1 local0
  log 127.0.0.1 local1 notice

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
    stats enable
    stats uri /

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 GET /
    http-check expect status 200    

docker-compose.yml(docker-compose.ymlファイルを作成します.これはComposeで使用されるマスターテンプレートファイルです.内容は非常に簡単で、3つのwebコンテナと1つのhaproxyコンテナを指定します.)
weba:
    build: ./web
    expose:
        - 80

webb:
    build: ./web
    expose:
        - 80

webc:
    build: ./web
    expose:
        - 80

haproxy:
    image: haproxy:latest
    volumes:
        - ./haproxy:/haproxy-override
        - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    links:
        - weba
        - webb
        - webc
    ports:
        - "80:80"
        - "70:70"
    expose:
        - "80"
        - "70"

composeプロジェクトの実行
 
compose-haproxy-web
├── docker-compose.yml
├── haproxy
   └── haproxy.cfg
└── web
    ├── Dockerfile
    ├── index.html
    └── index.py
$sudo docker-compose up
WARNING: The Docker Engine you're using is running in swarm mode.

Compose does not use swarm mode to deploy services to multiple nodes in a swarm. All containers will be scheduled on the current node.

To deploy your application across the swarm, use `docker stack deploy`.

Building webb
Step 1/5 : FROM python
latest: Pulling from library/python


このときローカルの80ポートにアクセスすると、haproxyを介してバックエンドのあるwebコンテナに自動的に転送され、ページがリフレッシュされ、アクセスするコンテナアドレスの変化が観察されます.
ローカル70ポートにアクセスすると、haproxyの統計が表示されます.