Docker Compose 是Docker官方编排(Orchstration)项目之一,负责快速在集群中部署分布式应用。
 
Dockerfile可以让用户管理一个单独的应用容器;而Compose则允许用户在一个模板(YAML格式)中定义一组相关联的应用容器(被称为一个project,即项目),如一个Web服务器再加上后端的数据库服务容器等。
 
1、安装Docker  
 
2、安装pip
 
3、安装Docker Compose
 
pip install docker-compose
 
如果报错,则使用下面的方法安装:
 
 
pip install docker-compose --ignore-installed requests
 
往往学习一个东西的时候,总喜欢先把原理什么的使劲的看明白再动手,其实不应该这样,先把实验模拟一遍,就大概知道这个东西是干嘛的,然后再一步一步的去深入研究。还有比如在学习Compose的时候这个实例中会用到haproxy,但是haproxy以前我又没用过,心想着要不先把这个弄懂,这个弄懂又有很懂东西得学,然后就进入一个循环模式了,与原始的目标越来越远越来越远,我们在做这个实验的时候,可以假装我已经对haproxy很熟悉了,等把compose弄明白之后,后续再去细入haproxy。
 
 
实例:一个haproxy容器,三个web容器,使用docker compose做编排
 
 
当客户端访问宿主机的80端口时,宿主机将80端口映射到haproxy容器的80端口,然后haproxy向后端的web转发请求,即转发到三台后端web容器的任意一台的80端口;
 
步骤:
 
1、创建主文件夹和目录,目录结构如下
 
 
对应的文件内容如下:
 
1)compose-haproxy-web/web/index.py
 
#!/usr/bin/python
#authors: yeasy.github.com
#date: 2013-07-05 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 "" 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><h1><font color=\"blue\" face=\"Georgia, Arial\" size=8><em>HA</em></font> Webpage Visit Results</h1></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> requests " + "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> requests " + "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()
 
2)compose-haproxy-web/web/index.html   直接touch即可
 
3)compose-haproxy-web/web/Dockerfile
 
# Description: This dockerfile uses the python image
# Version: V1.
# Author: LiLe
# Contact: @qq.com FROM python:2.7 #为后续的命令指定工作目录
WORKDIR /code #将指定的src复制到容器的dest,其中src可以是Dockerfile所在目录的一个相对路径;也可以是一个URL,还可以是一个tar文件,会自动解压为目录;这里的.是Dockerfile所在的目录
ADD . /code #Docker服务端暴露的端口号,在容器启动时需要使用-P指定
EXPOSE CMD python index.py
 
 
4)compose-haproxy-web/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:
stats enable
stats uri / frontend balancer
bind 0.0.0.0:
mode http
default_backend web_backends backend web_backends
mode http
option forwardfor
balance roundrobin
server weba weba: check
server webb webb: check
server webc webc: check
option httpchk GET /
http-check expect status

5)compose-haproxy-web/docker-compose.yml
 
# Description: This yml file order maanger haproxy cluster
# Version: V1.
# Author: LiLe
# Contact: @qq.com weba:
build: ./web
expose:
- webb:
build: ./web
expose:
- webc:
build: ./web
expose:
- haproxy:
image: haproxy:latest
volumes:
- ./haproxy:/haproxy-override
- ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro #links使得haproxy容器与其他容器相链接,使haproxy容器能直接通过内部端口访问weba、webb、webc
links:
- weba
- webb
- webc #宿主机:容器,把容器的端口暴露给宿主局的端口
ports:
- "80:80"
- "70:70" #容器内暴露的端口
expose:
- ""
- ""
 
2、启动
 
docker-compose up
 
正常应该是这样:
 
 
但是事实是这样:这里不是compose的问题,应该是index.py里的问题,暂时是忽略的
 
 
 
3、测试
 
访问宿主机的80端口,可以看到HA,刷新的话会到不同的后端webserver
 
 
 
访问宿主机的70端口,看到统计界面
 
 
 
 

Docker Compose(八)的更多相关文章

  1. .Net Core微服务入门全纪录(八)——Docker Compose与容器网络

    Tips:本篇已加入系列文章阅读目录,可点击查看更多相关文章. 前言 上一篇[.Net Core微服务入门全纪录(七)--IdentityServer4-授权认证]中使用IdentityServer4 ...

  2. Docker从入门到精通(八)——Docker Compose

    恭喜大家,学到这里,对于 docker 的基础玩法大家应该都会了,下面会介绍 docker的一些编排工具. 1.为什么需要 Docker Compose? 官网镇楼:https://www.runoo ...

  3. 八、docker compose容器编排

    一. Docker-Compose 1.1. 什么是Docker Compose Compose 项目是 Docker 官方的开源项目,负责实现 Docker 容器集群的快速编排,开源代码在 http ...

  4. Docker学习笔记 - Docker Compose 脚本命令

    Docker Compose 配置文件包含 version.services.networks 三大部分,最关键的是 services 和 networks 两个部分, version: '2' se ...

  5. 在Windows Server 2019通过Docker Compose部署Asp.Net Core

    一.安装Docker Enterprise 安装文档是: https://docs.docker.com/install/windows/docker-ee/ 安装完成后,如下图 二.首先,拉取一个W ...

  6. Docker Compose配置文件详解(V3)

    Docker Compose配置文件是Docker Compose的核心,用于定义服务.网络和数据卷.格式为YAML,默认路径为./docker-compose.yml,可以使用.yml或.yaml扩 ...

  7. Docker compose学习笔记

    一.compose compose 作用 你的应用可能需要很多个服务,比如web服务,数据库服务,缓存服务等等.我们可以把这些服务放到单独的容器里面,如果手工去配置这些服务会有些麻烦,docker c ...

  8. docker compose 笔记

    https://www.youtube.com/watch?v=Uez88TWOECg 是基于这个视频做的笔记. Docker Compose: Compose is a tool for defin ...

  9. 利用docker compose启动gitlab及runner

    添加docker compose配置文件 新建文件docker-compose.yml,输入如下内容: gitlab: image: 'gitlab/gitlab-ce:latest' contain ...

随机推荐

  1. postman(四):添加变量

    在进行API测试的时候,不同接口之间有时会用到同样的参数,甚至有些值都很少会改变,比如每个请求的ip和端口. 为了提高用例的可读性以及可维护性,可以利用postman的“变量”把经常用到的“固定值”抽 ...

  2. Orchard是如何呈现内容的

    首先Orchard是一个建立在ASP.NET MVC框架上的CMS应用框架.Orchard在呈现内容的时候也遵循MVC的规律,也是通过Controller来处理Url请求并决定用那个View来呈现那种 ...

  3. VSCode汉化

    1.打开VSCode 点击箭头指示地方  在搜索框中输入chinese 然后安装中文简体 2.按住 Ctrl+shift+p 选择配置显示语言 然后会看见下面的样子 添加 "locale&q ...

  4. Servlet、Listener和Filter

    Servlet: Servlet(Server Applet)是Java Servlet的简称,称为小服务程序或服务连接器,用Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式 ...

  5. 『计算机视觉』Mask-RCNN_从服装关键点检测看KeyPoints分支

    下图Github地址:Mask_RCNN       Mask_RCNN_KeyPoints『计算机视觉』Mask-RCNN_论文学习『计算机视觉』Mask-RCNN_项目文档翻译『计算机视觉』Mas ...

  6. Matlab:高阶常微分三种边界条件的特殊解法(中心差分法,高精度导数边界处理)

    函数文件1: function b=F(f,x0,h,N) % b(1,1)=x0(1)-h*x0(2)-u(1); % b(2,1)=x0(2)+h*x0(1)^2-u(2)-h*f; b=zero ...

  7. python __init__.py 的作用

    __init__.py的主要作用是: . Python中package的标识,不能删除 . 定义__all__用来模糊导入 . 编写Python代码(不建议在__init__中写python模块,可以 ...

  8. SSH服务器拒绝了密码

    一般进行到这一步,可能是sshd的设置不允许root用户远程登录首先修改一下vim /etc/sshd/ssh_config     修改成如下图:然后reboot或者service sshd res ...

  9. Django框架(四)

    八.Django 模型层(2) 多表操作 创建模型 实例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息. ...

  10. LSTM如何解决梯度消失或爆炸的?

    from:https://zhuanlan.zhihu.com/p/44163528 哪些问题? 梯度消失会导致我们的神经网络中前面层的网络权重无法得到更新,也就停止了学习. 梯度爆炸会使得学习不稳定 ...