带你快速上手Docker Compose容器编排及consul集群

目录

 

一、Docker Compose理论知识

1.1、Compose工具的由来

1.1.1、 Compose有2个重要的概念:

二、Docker Compose 容器编排:

三、Docker Compose 配置:

3.1、常用字段

字段

描述

build dockerfile context

指定Dockerfile文件名构建镜像上下文路径

image

指定镜像

command

执行命令,覆盖默认命令

container name

指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale

deploy

指定部署和运行服务相关配置,只能在Swarm模式使用

environment

添加环境变量

networks

加入网络

ports

暴露容器端口,与-p相同,但端口不能低于60

volumes

挂载宿主机路径或命令卷

restart

重启策略,默认no,always,no-failure,unless-stoped

hostname

容器主机名

3.2、常用命令

3.3、命令说明

四、案例部署

4.1、将docker-compose复制到/usr/bin目录下,并授权

4.2、创建nginx工作目录

4.3、创建编辑 yml 文件

4.4、编写网页文件

4.5、此时,可以用 tree 命令,查看一下根目录下的文件结构

4.6、执行开启

查看镜像和容器是否都正常且创建成功:

查看能否正常访问

五、Docker concul 容器服务更新与发现

5.1、Consul 简介

5.2、Consul 使用场景

5.3、Consul 优势

5.4、consul 端口的了解

六、搭建 consul 集群

6.1、配置 consul 服务器

6.2、进入容器

6.3、通过 httpd api 可以获取集群信息

6.4在server2上安装Gliderlabs/Registrator

在浏览器输入:http://192.168.206.10:8500查看

6.5、在server2上安装两个httpd及nginx容器

刷新网页

将两个nginx服务移除查看,网页监控服务也被移除

刷新网页

七、安装consul-template

7.1、consul-template

7.2、准备 template nginx 模板文件

7.3、编译安装nginx

7.4、配置nginx

7.5、创建虚拟主机目录和日志文件目录

7.6、启动nginx

7.7、配置并启动 template

7.8、启动template

7.9、我们可以服务端在创建一个 nginx 容器节点,检测服务发现及配置更新功能

7.10、删除一个nginx容器节点,查看配置文件变化

7.11、consul多节点


一、Docker Compose理论知识

1.1、Compose工具的由来

Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。

使用前面介绍的Dockerfile文件可以很容易定义一个单独的应用容器。然而在日常开发工作中,经常会碰到需要多个容器相互配合来完成某项任务的情况。

例如要实现一个 Web 项目,除了 Web 服务容器本身,往往还需要再加上后端的数据库服务容器;再比如在分布式应用一般包含若干个服务,每个服务一般都会部署多个实例。
如果每个服务都要手动启停,那么效率之低、维护量之大可想而知。这时候就需要一个工具能够管理一组相关联的的应用容器,这就是Docker Compose。

1.1.1、 Compose有2个重要的概念:

1.1.1.1、项目(Project):由一组关联的应用容器组成的一个完整业务单元,在 docker-compose.yml 文件中定义。

1.1.1.2、服务(Service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实例。

二、Docker Compose 容器编排:

1、Docker Compose 前身是Fig,是一个定义及运行多个 Docker 容器的工具;

2、使用 Docker Compose 不再需要使用 shell脚本来启动容器;

3、Docker Compose 非常适合组合使用多个容器进行开发的场景。

4、Docker Compose 的文件结构:

vim docker-compose.yml

YAML 是一种标记语言很直观的数据序列化格式
以下是文件格式及编写注意事项:

1、不支持制表符Tab键缩进,需要使用空格缩进;
2、通常开头缩进2个空格;
3、字符后缩进一个字符,如冒号、逗号、横杆 ;
4、用#号注释;
5、如果包含特殊字符用单引号引起来;
6、布尔值必须用引号括起来

三、Docker Compose 配置:

3.1、常用字段

字段

描述

build dockerfile context

指定Dockerfile文件名构建镜像上下文路径

image

指定镜像

command

执行命令,覆盖默认命令

container name

指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale

deploy

指定部署和运行服务相关配置,只能在Swarm模式使用

environment

添加环境变量

networks

加入网络

ports

暴露容器端口,与-p相同,但端口不能低于60

volumes

挂载宿主机路径或命令卷

restart

重启策略,默认no,always,no-failure,unless-stoped

hostname

容器主机名

3.2、常用命令

字段

描述

build

重新构建服务

ps

列出容器

up

创建和启动容器

exec

在容器里面执行命令

scale

指定一个服务容器启动数量

top

显示容器进程

logs

查看容器输出

down

删除容器、网络、数据卷和镜像

stop/start/restart

停止/启动/重启服务

3.3、命令说明

1、基本使用格式
docker-compose [options] [COMMAND] [ARGS…]

2、docker-compose选项
1):--verbose 输出更多调试信息
2):--version 打印版本并推出
3):-f,--file FILE 使用特定的compose模板文件,默认为docker-compose.yml
4):-p,--project-name NAME 指定项目名称,默认使用目录名称

四、案例部署

4.1、将docker-compose复制到/usr/bin目录下,并授权

cp -p docker-compose /usr/local/bin    ###将docker-compose移动到/usr/local/bin
chmod +x /usr/local/bin/docker-compose

4.2、创建nginx工作目录

[root@server1 ~]# mkdir compose_nginx
[root@server1 ~]# cd compose_nginx/
[root@server1 compose_nginx]# mkdir nginx
[root@server1 compose_nginx]# cd nginx/

[root@server1 nginx]# vim Dockerfile
FROM centos:7
MAINTAINER this is nginx <yun>
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
ADD nginx-1.12.2.tar.gz /usr/local/src
WORKDIR /usr/local/src
WORKDIR nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
EXPOSE 443
#关闭守护进程,这里必须设置
RUN echo "daemon off;">>/usr/local/nginx/conf/nginx.conf
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

[root@server1 nginx]# vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

4.3、创建编辑 yml 文件

[root@server1 compose_nginx]# vim docker-compose.yml
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1220:443
    networks:
      - xml
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  xml:

4.4、编写网页文件

[root@server1 compose_nginx]# mkdir wwwroot
[root@server1 compose_nginx]# cd wwwroot/
[root@server1 wwwroot]# vim index.html
<h1>This is yun</h1>

4.5、此时,可以用 tree 命令,查看一下根目录下的文件结构

如果无法使用tree,先yum安装下

yum -y install tree
[root@server1 compose_nginx]# tree ./
./
├── docker-compose.yml
├── nginx
│   ├── Dockerfile
│   ├── nginx-1.12.2.tar.gz
│   └── run.sh
└── wwwroot
    └── index.html

4.6、执行开启

 docker-compose -f docker-compose.yml up -d

查看镜像和容器是否都正常且创建成功:

[root@server1 compose_nginx]# docker images
REPOSITORY            TAG                 IMAGE ID            CREATED             SIZE
compose_nginx_nginx   latest              ba2866d1098c        50 seconds ago      384MB      #镜像创建成功
centos                7                   8652b9f0cb4c        2 weeks ago         204MB
[root@server1 compose_nginx]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS              PORTS                                         NAMES
c5af2ac54f43        compose_nginx_nginx   "/run.sh"           58 seconds ago      Up 58 seconds       0.0.0.0:1216->80/tcp, 0.0.0.0:1220->443/tcp   compose_nginx_nginx_1    #容器创建成功

查看能否正常访问

五、Docker concul 容器服务更新与发现

5.1、Consul 简介

  • Consul 是一个支持多数据中心分布式高可用的 服务发现 和 配置共享 的服务软件,由 HashiCorp 公司用 Go 语言开发,基于 Mozilla Public License 2.0 的协议进行开源。

 5.1.1、主要特性:

  • Consul 支持健康检查,并允许 HTTP 、GRPC 和 DNS 协议调用 API 存储键值对。
  • 一致性协议采用 Raft 算法,用来保证服务的高可用。
  • 使用 GOSSIP 协议管理成员和广播消息, 并且支持 ACL 访问控制
  • consul的实例叫agent,agent有两种运行模式:server和client 。
  • 官方建议每个Consul Cluster数据中心至少有3个或以上的运行在Server Mode的Agent,Client节点不限

5.2、Consul 使用场景

  • Docker 容器的注册与配置共享

  • Coreos 实例的注册与配置共享

  • SaaS 应用的配置共享、服务发现和健康检查。

  • vitess 集群

  • 与 confd 服务集成,动态生成 nginx 和 haproxy 配置文件

5.3、Consul 优势

市面现在有很多类似的软件比如:zookeeper 、Etcd、doozerd、eureka,Consul 相比这些软件有什么优势呢?
下面来总结一下 Consul 的优势有那几点:

  • 使用 Raft 算法来保证一致性,比复杂的 Paxos 算法更直接。相比较而言,zookeeper 采用的是 Paxos,而 etcd 使用的则是 Raft。

  • 支持 多数据中心,内外网的服务采用不同的端口进行监听。 多数据中心集群可以避免单数据中心的单点故障,而其部署则需要考虑网络延迟,分片等情况等. zookeeper 和 etcd 均不提供多数据中心功能的支持。

  • 支持 健康检查。 etcd 不提供此功能。

  • 支持 HTTP、DNS 和 GPRS 协议接口。 zookeeper 的集成较为复杂,etcd 只支持 http 协议。

  • 官方提供 WEB管理界面,etcd 无此功能

5.4、consul 端口的了解

端口

说明

TCP/8300

8300端口用于服务器节点。客户端通过该端口RPC协议调用服务端节点。

TCP/UDP/8301

8301端口用于单个数据中心所有节点之间的互相通信, 即对LAN池信息的同步。她使得整个数据中心能够自动发现服务器地址,分布式检测节点故障,事件广播(如领导选举事件)。

TCP/UDP/8302

8302端口用于单个或多个数据中心之间的服务器节点的信息同步,即对WAN池信息的同步。它针对互联网的高延迟进行了优化,能够实现跨数据中心请求。

8500

8500端口基于HTTP协议,用于API接口或者WEB UI访问。

8600

8600端口作为DNS服务器,它使得我们可以通过节点名查询节点信息。

六、搭建 consul 集群

IP地址需要安装的软件
192.168.206.10Docker-ce 、Compose 3、Consul、Consul-template
192.168.206.20Docker-ce

6.1、配置 consul 服务器

上传consul_0.9.2_linux_amd64.zip到/root目录下
[root@server1 ~]# mkdir consul
[root@server1 ~]# cp consul_0.9.2_linux_amd64.zip /root/consul
[root@server1 ~]# cd consul/
[root@server1 consul]# unzip consul_0.9.2_linux_amd64.zip 
Archive:  consul_0.9.2_linux_amd64.zip
  inflating: consul 

将consul移动到/usr/local/bin
[root@server1 consul]# mv consul /usr/local/bin
[root@server1 consul]# consul agent \       #使用代理功能
> -server \
> -bootstrap \                              #参与选举为领袖
> -ui \
> -data-dir=/var/lib/consul-data \          #数据文件存放位置
> -bind=192.168.206.10 \
> -client=0.0.0.0 \                         #所有网段
>  -node=consul-server01 &> /var/log/consul.log &
[1] 53205
[root@server1 consul]# jobs                 #查看后台运行情况
[1]+  运行中               consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=192.168.206.10 -client=0.0.0.0 -node=consul-sserver01 &>/var/log/consul.log &           #查看集群信息
[root@server1 consul]# consul members
Node              Address              Status  Type    Build  Protocol  DC
consul-sserver01  192.168.206.10:8301  alive   server  0.9.2  2         dc1
[root@server1 consul]# consul info | grep leader  
	leader = true
	leader_addr = 192.168.206.10:8300

6.2、进入容器

[root@server1 consul]# docker ps -a
CONTAINER ID        IMAGE                 COMMAND             CREATED             STATUS      
c5af2ac54f43        compose_nginx_nginx   "/run.sh"           About an hour ago   Up About an 
[root@server1 consul]# docker exec -t c5af2ac54f43 /bin/bash

6.3、通过 httpd api 可以获取集群信息

[root@server1 consul]# curl 127.0.0.1:8500/v1/status/peers       ##查看群集server成员
[root@server1 consul]# curl 127.0.0.1:8500/v1/status/leaders     ##群集中 Raf leader
[root@server1 consul]# curl 127.0.0.1:8500/v1/catalog/services   ##注册的所有服务
[root@server1 consul]# curl 127.0.0.1:8500/v1/catalog/nodes      ##群集节点详细信息
[root@server1 consul]# curl 127.0.0.1:8500/v1/catalog/nginx      ##查看 nginx 服务信息

6.4在server2上安装Gliderlabs/Registrator

配置192.168.206.20 节点

安装registrator

[root@server2 ~]# docker run -d \
> --name=registrator \                        #容器名称
> --net=host \
> -v /var/run/docker.sock:/tmp/docker.sock \
> --restart=always \
> gliderlabs/registrator:latest \             #镜像名称
> -ip=192.168.206.20 \
> consul://192.168.206.10:8500

在浏览器输入:http://192.168.206.10:8500查看

6.5、在server2上安装两个httpd及nginx容器

[root@server2 ~]# docker run -dit -p 83:80 --name test1 -h test1 nginx
[root@server2 ~]# docker run -dit -p 84:80 --name test2 -h test2 nginx
[root@server2 ~]# docker run -dit -p 88:80 --name test3 -h test3 httpd
[root@server2 ~]# docker run -dit -p 89:80 --name test4 -h test4 httpd



 查看容器状态
[root@server2 ~]# docker ps -a
CONTAINER ID        IMAGE                           COMMAND                  CREATED              STATUS              PORTS                NAMES
914f51726006        httpd                           "httpd-foreground"       About a minute ago   Up About a minute   0.0.0.0:89->80/tcp   test4
14fe49836475        httpd                           "httpd-foreground"       2 minutes ago        Up 2 minutes        0.0.0.0:88->80/tcp   test3
00b4f7697762        nginx                           "/docker-entrypoint.…"   2 minutes ago        Up 2 minutes        0.0.0.0:84->80/tcp   test2
677ee41ccbca        nginx                           "/docker-entrypoint.…"   3 minutes ago        Up 3 minutes        0.0.0.0:83->80/tcp   test1

刷新网页

将两个nginx服务移除查看,网页监控服务也被移除

[root@server2 ~]# docker stop 00b4f7697762
00b4f7697762
[root@server2 ~]# docker stop 677ee41ccbca
677ee41ccbca
[root@server2 ~]# docker rm 00b4f7697762
00b4f7697762
[root@server2 ~]# docker rm 677ee41ccbca
677ee41ccbca

刷新网页

七、安装consul-template

7.1、consul-template

1、是基于 Consul 的自动替换配置文件的应用;
2、可以查询 Consul 中的服务目录:Key、Key-values等;
3、特别适合动态的创建配置文件;
4、是一个守护进程,用于实时查询 consul 集群信息;

7.2、准备 template nginx 模板文件

consul-template是一个守护进程,用于实时查询consul集群信息,并更新文件系统上任意数量的指定模板,生成配置文件,更新完成以后,可以选择运行shell命令执行更新操作,重新加载Nginx。consul-template可以查询consul中的服务目录、Key、Key-values等。这种强大的抽象功能和查询语言模板可以使consul-template特别适合动态的创建配置文件

在 consul 服务器上操作,创建一个模板文件

[root@server1 consul]# vim nginx.ctmpl
upstream http_backend {
    {{range service "nginx"}}
     server {{.Address}}:{{.Port}};
     {{end}}
}

server {
       listen 83;
       server_name localhost 192.168.206.10;
       access_log /var/log/nginx/xml.cn-access.log;
       index index.html index.php;
       location / {
          proxy_set_header HOST $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Client-IP $remote_addr; 
          proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for;
          proxy_pass http://http_backend;
                 }
       }

7.3、编译安装nginx

将nginx上传到/root目录下
[root@server1 consul]# yum -y install gcc gcc-c++ pcre-devel zlib-devel
[root@server1 consul]# tar zxvf nginx-1.12.2.tar.gz -C /opt
[root@server1 consul]# cd /opt/nginx-1.12.2/
[root@server1 nginx-1.12.2]# ./configure --prefix=/usr/local/nginx
[root@server1 nginx-1.12.2]#  make && make install

7.4、配置nginx

[root@server1 nginx-1.12.2]# vim /usr/local/nginx/conf/nginx.conf
http {
    include       mime.types;
    include       vhost/*.conf;   ###添加虚拟主机目录
    default_type  application/octet-stream;

7.5、创建虚拟主机目录和日志文件目录

[root@server1 ~]# mkdir /usr/local/nginx/conf/vhost
[root@server1 ~]# mkdir /var/log/nginx

7.6、启动nginx

[root@server1 ~]# /usr/local/nginx/sbin/nginx

7.7、配置并启动 template

上传template到/root目录下
[root@server1 ~]# unzip consul-template_0.19.3_linux_amd64.zip   #解压缩
Archive:  consul-template_0.19.3_linux_amd64.zip
  inflating: consul-template
[root@server1 ~]# mv consul-template /usr/local/bin              #移动

7.8、启动template

[root@server1 consul]# consul-template -consul-addr 192.268.206.10:8500 -template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/xh.conf:/usr/local/nginx/sbin/nginx -s reload" --log-level=info
 再开一个server1终端查看
[root@server1 ~]# cd /usr/local/nginx/conf/vhost/
[root@server1 vhost]# cat xml.conf 
upstream http_backend {
    
    server 192.168.206.10:83;    #会自动识别并添加,等会将容器服务关闭后查看
     
 }
 
 server {
   listen 83;
   server_name localhost 192.168.206.10;
   access_log /var/log/nginx/xml.cn-access.log;
   index index.html index.php;
    location / {
      proxy_set_header HOST $host;
      proxy_set_header X-Real-IP $remote_addr;     
      proxy_set_header Client-IP $remote_addr;
      proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_pass http://http_backend;
   }
}

7.9、我们可以服务端在创建一个 nginx 容器节点,检测服务发现及配置更新功能

server2上再启动一个nginx服务容器
[root@server2 ~]# docker run -dit -p 89:80 --name test6 -h test6 nginx
[root@server2 ~]# docker run -dit -p 88:80 --name test6 -h test6 nginx
在server1上查看
[root@server1 vhost]# cat xh.conf
upstream http_backend {
  
     server 192.168.206.20:83;

     server 192.168.206.20:88;
 
     server 192.168.206.20:89;       #节点自动添加

}
 
server {
       listen 83;
       server_name localhost 192.168.206.10;
       access_log /var/log/nginx/xml.cn-access.log;
       index index.html index.php;
       location / {
          proxy_set_header HOST $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Client-IP $remote_addr;
          proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for;
          proxy_pass http://http_backend;
                 }
       }

在server2上查看日志(访问192.168.206.10可以访问后面的节点)
[root@server2 ~]# docker logs -f test5

7.10、删除一个nginx容器节点,查看配置文件变化

[root@server2 ~]# docker stop 601bce2a82e6
601bce2a82e6
[root@server2 ~]# docker rm 601bce2a82e6
601bce2a82e6
  
查看会发现节点自动移除
[root@server1 vhost]# cat xh.conf 
upstream http_backend {
     
     server 192.168.206.20:83;
     
     server 198.168.206.20:88;
     
}
 
server {
       listen 83;
       server_name localhost 192.168.206.10;
       access_log /var/log/nginx/xml.cn-access.log;
       index index.html index.php;
       location / {
          proxy_set_header HOST $host;
          proxy_set_header X-Real-IP $remote_addr;
          proxy_set_header Client-IP $remote_addr; 
          proxy_set_header X-Fprwarded-For $proxy_add_x_forwarded_for;
          proxy_pass http://http_backend;
                 }
       }

7.11、consul多节点

上传consul压缩包到server3上

解压缩
[root@server3 ~]# unzip consul_0.9.2_linux_amd64.zip 
Archive:  consul_0.9.2_linux_amd64.zip
   inflating: consul       
[root@server3 ~]# mv consul /usr/local/bin/

加入已有的群集中
[root@server3 ~]# consul agent \
> -bootstrap \
> -ui \
> -data-dir=/var/lib/consul-data \
> -server \
> -bind=192.168.206.30 \
> -client=0.0.0.0 \
> -node=consul-server3 \
> -enable-script-checks=true \
> -datacenter=dc1 \
> join 192.168.206.10 &> /var/log/consul.log &
[1] 17753

查看运行状态
[root@server3 ~]# jobs
[1]+  运行中               consul agent -bootstrap -ui -data-dir=/var/lib/consul-data -server -bind=20.0.0.30 -client=0.0.0.0 -node=consul-server3 -enable-script-checks=true -datacenter=dc1 join 20.0.0.10 &>/var/log/consul.log &

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值