企业运维容器之 docker 三剑客compose

Posted 123坤

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了企业运维容器之 docker 三剑客compose相关的知识,希望对你有一定的参考价值。

1. Docker Compose 简介

  • 微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。
  • Docker Compose是一种编排服务,基于pyhton语言实现,是一个用于在 Docker 上定义并运行复杂应用的工具,可以让用户在集群中部署分布式应用。
  • 用户可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。
  • 解决了容器与容器之间如何管理编排的问题。
  • Docker Compose 中有两个重要的概念:
    服务 (service) :一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。
    项目 (project) :由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

2. Docker Compose 实践

  • docker compose 安装
  • 根据官方推荐下载curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-uname -s-uname -m> /usr/local/bin/docker-compose 下载后执行命令 # chmod +x /usr/local/bin/docker-compose 加上执行权限;
  • 从阿里云下载 https://mirrors.aliyun.com/docker-toolbox/linux/compose/1.21.2/ 下载后放在: /usr/local/bin/docker-compose 并给予执行的权限chmod +x /usr/local/bin/docker-compose ;

此处用阿里云的镜像站下载;

[root@server1 ~]# ls
compose  docker-compose-Linux-x86_64-1.27.0  
[root@server1 ~]# mv docker-compose-Linux-x86_64-1.27.0 /usr/local/bin/docker-compose
[root@server1 ~]# chmod +x /usr/local/bin/docker-compose

编辑 docker-compose.yml 文件;从 https://docs.docker.com/compose/compose-file/ 来查看其属性的含义,以下列出常用的几个含义:

  • Image:指定为镜像名称或镜像 ID,如果镜像在本地不存在,Compose 将会尝试拉取这个镜像。
  • Build:指定 Dockerfile 所在文件夹的路径。 Compose 将会利用它自动构建这个镜像,然后使用这个镜像。
  • Command:覆盖容器启动后默认执行的命令。
  • Links:链接到其它服务中的容器。
  • Ports:端口映射。
  • Expose::暴露端口信息。
  • Volumes:卷挂载路径设置

创建 docker-compose.yml 文件:

[root@server1 ~]# mkdir compose
[root@server1 ~]# cd compose/
[root@server1 compose]# mkdir web1
[root@server1 compose]# mkdir web2
[root@server1 compose]# echo web1 > web1/index.html
[root@server1 compose]# echo web2 > web2/index.html
[root@server1 compose]# vim docker-compose.yaml

version: "3.9"
services:

  web1:
    image: nginx:latest
    networks:
      - webnet
    volumes:
      - ./web1:/usr/share/nginx/html


  web2:
    image: nginx:latest
    networks:
      - webnet
    volumes:
      - ./web2:/usr/share/nginx/html

  haproxy:
    image: haproxy:latest
    networks:
      - webnet
    volumes:
      - ./haproxy/haproxy.cfg:/usr/local/etc/haproxy/haproxy.cfg:ro
    ports:
      - "80:80"

networks:
  webnet:

下载 haproxy 镜像,由于此处的镜像并没有配置文件需要自己来编写配置文件;

[root@server1 ~]# docker images haproxy
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
haproxy             latest              fbd1f55f79b3        5 years ago         139MB

[root@server1 ~]# docker run -it --rm haproxy bash
root@ac91f5c66564:/# cd /usr/local/etc/haproxy/
root@ac91f5c66564:/usr/local/etc/haproxy# ls
errors
root@ac91f5c66564:/usr/local/etc/haproxy# 
##没有配置文件
[root@server1 ~]# docker run -d --name demo haproxy
7c9267a15edc8b5d3f56bc9fb7c9015d256e8a073aa76b712352590c0088f323
[root@server1 ~]# docker ps | grep haproxy
[root@server1 ~]# docker ps -a | grep haproxy
7c9267a15edc        haproxy                                                   "/docker-entrypoint.…"   18 seconds ago      Exited (0) 17 seconds ago                                                  demo
[root@server1 ~]# docker logs demo
<7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds 
[ALERT] 152/025843 (8) : Could not open configuration file /usr/local/etc/haproxy/haproxy.cfg : No such file or directory
<5>haproxy-systemd-wrapper: exit, haproxy RC=256

##可以看到其无法打开配置文件

编写 haproxy.cfg文件:

[root@server1 ~]# cd compose/
[root@server2 compose]# mkdir haproxy
[root@server2 compose]# cd haproxy
[root@server2 haproxy]# vim haproxy.cfg 
#
# This is a sample configuration. It illustrates how to separate static objects
# traffic from dynamic traffic, and how to dynamically regulate the server load.
#
# It listens on 192.168.1.10:80, and directs all requests for Host 'img' or
# URIs starting with /img or /css to a dedicated group of servers. URIs
# starting with /admin/stats deliver the stats page.
#

global
        maxconn         65535
        stats socket    /var/run/haproxy.stat mode 600 level admin
        log             127.0.0.1 local0
        uid             200
        gid             200
        chroot          /var/empty
        daemon


defaults
        mode            http
        log             global
        option          httplog
        option          dontlognull
        monitor-uri     /monitoruri
        maxconn         8000
        timeout client  30s
        retries         2
        option redispatch
        timeout connect 5s
        timeout server  5s
        stats uri       /admin/stats


frontend public
        bind            *:80 name clear


backend dynamic
        balance         roundrobin
        server          a web1:80 check inter 1000
        server          b web2:80 check inter 1000

运行 docker-compose
docker-compose 命令必须在项目下运行。
以下是项目目录结构:

[root@server2 compose]# yum install tree.x86_64 -y
[root@server2 compose]# tree .
.
├── docker-compose.yaml
├── haproxy
│   └── haproxy.cfg
├── web1
│   └── index.html
└── web2
    └── index.html

3 directories, 4 files

docker-compose up 创建并启动容器

[root@server2 compose]# docker-compose up -d
Creating network "compose_webnet" with the default driver
Creating compose_web1_1    ... done
Creating compose_web2_1    ... done
Creating compose_haproxy_1 ... done
[root@server1 compose]# docker-compose ps	
	##在用命令查看其状态
      Name                     Command               State         Ports       
-------------------------------------------------------------------------------
compose_haproxy_1   /docker-entrypoint.sh hapr ...   Up      0.0.0.0:80->80/tcp
compose_web1_1      /docker-entrypoint.sh ngin ...   Up      80/tcp            
compose_web2_1      /docker-entrypoint.sh ngin ...   Up      80/tcp       

此时在查看日志时,会看到 haproxy 的起来之后所做的链接;
haproxy_1 | <7>haproxy-systemd-wrapper: executing /usr/local/sbin/haproxy -p /run/haproxy.pid -f /usr/local/etc/haproxy/haproxy.cfg -Ds

当都开启之后,此时在网页中便可访问:172.25.25.1/admin/stats 效果如下图所示

在这里插入图片描述
此时在测试发布页面时,如下所示,可以看到其是负载均衡的。

[root@westos ~]# curl 172.25.25.1
web1
[root@westos ~]# curl 172.25.25.1
web2
[root@westos ~]# curl 172.25.25.1
web1
[root@westos ~]# curl 172.25.25.1
web2
[root@westos ~]# curl 172.25.25.1
web1
[root@westos ~]# curl 172.25.25.1
web2

此时再次添加一个负载;

[root@server1 compose]# mkdir web3
[root@server1 compose]# echo web3 > web3/index.html
[root@server1 haproxy]# vim haproxy.cfg 

        balance         roundrobin
        server          a web1:80 check inter 1000
        server          b web2:80 check inter 1000
        server          server3 web3:80 check inter 1000
        
[root@server1 compose]# vim docker-compose.yaml 

  web3:
    image: nginx:latest
    networks:
      - webnet
    volumes:
      - ./web3:/usr/share/nginx/html
[root@server1 compose]# docker-compose stop
Stopping compose_web2_1 ... done
Stopping compose_web1_1 ... done
[root@server1 compose]# docker-compose up -d
Starting compose_web2_1    ... done
Starting compose_web1_1    ... done
Starting compose_haproxy_1 ... done
Creating compose_web3_1    ... done
[root@server1 compose]# docker-compose ps
      Name                     Command               State         Ports       
-------------------------------------------------------------------------------
compose_haproxy_1   /docker-entrypoint.sh hapr ...   Up      0.0.0.0:80->80/tcp
compose_web1_1      /docker-entrypoint.sh ngin ...   Up      80/tcp            
compose_web2_1      /docker-entrypoint.sh ngin ...   Up      80/tcp            
compose_web3_1      /docker-entrypoint.sh ngin ...   Up      80/tcp   

此时再次查看页面信息:

在这里插入图片描述
当关闭一个页面是,由于负载均衡是有健康检查的,等待时间到了之后便会调度不到信息;

[root@server1 compose]# docker-compose stop web2
Stopping compose_web2_1 ... done

在这里插入图片描述

3. Docker Compose 常用命令

  • Build: 构建或重新构建服务;
  • kill:强制停止服务容器;
  • logs:查看服务的输出;
  • port:打印绑定的公共端口;
  • ps:列出所有容器;
  • pull:拉取服务所需镜像;
  • rm:删除停止的服务容器;
  • up:构建并启动容器。

以上是关于企业运维容器之 docker 三剑客compose的主要内容,如果未能解决你的问题,请参考以下文章

企业运维容器之 docker 三剑客swarm

企业运维实战--Docker三剑客二之docker-compose

企业运维容器 docker 三剑客machine

24.Docker技术入门与实战 --- Docker三剑客之Compose

docker三剑客之docker-compose(记官方案例)

Docker三剑客之docker-compose