0
点赞
收藏
分享

微信扫一扫

Docker学习笔记19

小月亮06 2023-07-13 阅读 90
docker

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

​

 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

如果在前端,我们能看到运行的结果和报错。

如果在后端,只会显示容器运行的状态。

举报

相关推荐

0 条评论