Docker Compose 作用:
在一个文件中定义复杂的容器应用之间的关系,用一个命令即可执行。
YAML:类似html、xml、标记语言。
YAML格式文件,资源清单文件
docker compose 命令使用yaml文件来启动容器。
start & stop
down & up (关闭删除容器和启动新容器)
docker compose 定义方法:
容器分三层:
工程project一个目录;
服务service用于定义容器资源(镜像、网络、依赖、数据卷、端口、容器)
容器container,用于运行服务
步骤:
1. 创建一个目录(工程名称):
2. 创建一个docker compose.yaml文件,定义服务:
3. 可以docker-compose 命令启动服务:
docker-compose的部署:
curl -L "https://github.com/docker/compose/releases/download/1.24.1/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
# 检查docker-compose的版本:
dokcer-compose -v
说明:
1)安装的过程中,连接过程中可能会失败,可以多操作几次。
2)老师在视频中讲解的方法在pip install --upgrade pip 升级过程中失败。
使用docker-compose 部署应用案例:
使用haproxy实现web应用发布:
步骤:
第一步:创建一个文件夹(工程),并进入到工程目录:
mkdir docker-haproxy
cd docker-haproxy
第二步:定义web服务:
mkdir web
cd web
定义Dockerfile:
[root@node1 web]# cat Dockerfile
FROM python:2.7
WORKDIR /code
ADD . /code
EXPOSE 80
CMD python index.py
index.py文件:
#!/usr/bin/python
#coding=utf-8
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><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 <<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> requests " + "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文件为空:
cat index.html
第三步:定义haproxy服务:
mkdir haproxy
cd 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 *: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
说明:
1)log 是跟日志相关的
2)defaults:默认配置
3)listen stats:监听状态
4)frontend balancer:前端服务器
5)backend web_backends: 后端服务器
轮询调度算法:roundrobin:
check:check检查
说明:那这个haproxy的配置文件需要专门学习。
第四步:把web服务和haproxy整合,通过docker-compose.yaml整合以上服务:
vim docker-compose.yaml
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"
第五步:使用docker-compose 命令启动工程:
[root@node1 docker-haproxy]# pwd
/root/docker-haproxy
[root@node1 docker-haproxy]# docker-compose up
[root@node1 docker-haproxy]# docker-compose up
Starting docker-haproxy_webb_1 ... done
Starting docker-haproxy_webc_1 ... done
Starting docker-haproxy_weba_1 ... done
Starting docker-haproxy_haproxy_1 ... error
ERROR: for docker-haproxy_haproxy_1 Cannot start service haproxy: b'Cannot link to a non running container: /docker-haproxy_weba_1 AS /docker-haproxy_haproxy_1/docker-haproxy_weba_1'
ERROR: for haproxy Cannot start service haproxy: b'Cannot link to a non running container: /docker-haproxy_weba_1 AS /docker-haproxy_haproxy_1/docker-haproxy_weba_1'
ERROR: Encountered errors while bringing up the project.
在这个过程中下载镜像比较慢。
另外,这里面有个报错,暂时还没能解决。可以先放放。
第六步:访问测试:
总结下,Haproxy,我这边还需要专门练习和掌握这块知识点。
70端口:访问的是haproxy的页面。
80端口:是web页面。
docker-compose down
docker-compose up -d
如果在前端,我们能看到运行的结果和报错。文章来源:https://www.toymoban.com/news/detail-527462.html
如果在后端,只会显示容器运行的状态。文章来源地址https://www.toymoban.com/news/detail-527462.html
到了这里,关于Docker学习笔记19的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!