Docker-compose和Consul

Docker-compose简介 

Docker Compose是一个用于定义和管理多个Docker容器的工具。它使用一个单独的YAML文件来配置和组织多个服务,并提供一组命令来管理这些服务的生命周期。

使用Docker Compose可以实现以下功能:

  1. 定义多个服务:通过编写一个docker-compose.yml文件,你可以定义多个需要运行的服务、它们的镜像、端口映射、环境变量等信息。

  2. 启动和停止服务:使用docker-compose up命令可以启动定义的所有服务。而使用docker-compose down命令可以停止并移除容器。

  3. 管理服务依赖关系:如果你的应用由多个服务组成,例如一个Web前端和一个数据库后端,你可以在docker-compose.yml中指定它们之间的依赖关系,确保它们在正确的顺序和环境中启动。

  4. 扩展和缩减服务:你可以使用docker-compose scale命令来扩展或缩减特定服务的实例数量,以适应不同的负载需求。

  5. 环境变量管理:Docker Compose允许你在docker-compose.yml文件中设置环境变量,这样你可以轻松地管理不同服务的配置参数。

  6. 网络配置:Docker Compose会自动为所定义的服务创建一个默认的网络,使得服务之间可以通过服务名进行通信。

总之,Docker Compose简化了多个Docker容器的管理和协同工作。通过一个简单的配置文件,你可以定义和管理多个容器、它们的依赖关系和环境变量,从而实现更方便、可重复和可扩展的容器化应用部署。

 YAML 文件格式及编写注意事项 


YAML 是一种标记语言,它可以很直观的展示数据序列化格式,可读性高。类似于 XML数据描述语言,语法比 XML 简单的很多。YAML 数据结构通过缩进来表示,连续的项目通过减号来表示,键值对用冒号分隔,数组用中括号 [] 括起来, hash 用花括号 {} 括起来。

使用 YAML 时需要注意下面事项:

  1. 缩进:YAML使用缩进来表示层次结构,一般使用2个空格或4个空格作为缩进单位,不要使用制表符。缩进的数量必须保持一致,否则会导致语法错误。

  2. 键值对:YAML使用冒号(:)来分隔键和值,键值对之间使用一个空格进行分隔。

  3. 列表:列表使用短横线(-)作为起始标记,并使用一个空格进行分隔。

  4. 多行文本:如果需要在YAML文件中编写多行文本,可以使用竖线(|)或大于号(>)进行表示。竖线会保留文本中的换行符,而大于号会将换行符替换为一个空格。

  5. 注释:可以使用井号(#)来添加注释,从井号开始到行末都会被视为注释内容。

  6. 引用:可以使用&和*符号来创建和引用锚点,以避免重复定义相同的数据。

  7. 引号:如果值中包含特殊字符或空格,可以使用单引号(')或双引号(")进行引用。单引号会保持原样,而双引号可以进行变量替换和转义字符处理。

  8. 继承和覆盖:可以使用<<符号来继承和覆盖已定义的键值对。

  9. 大小写敏感

Docker Compose配置常用字段


字段                                       描述
build                                      指定 Dockerfile 文件名,
                                     要指定Dockerfile文件需要在build标签的子级标签中使用dockerfile标签指定
dockerfile                                 构建镜像上下文路径
context                                    可以是 dockerfile 的路径,或者是指向 git 仓库的 url 地址
image                                      指定镜像
command:                                  执行命令,覆盖容器启动后默认执行的命令
container_name                             指定容器名称,由于容器名称是唯一的,如果指定自定义名                                                         称,则无法scale指定容器数量
deploy                                     指定部署和运行服务相关配置,只能在 Swarm 模式使用
environment                                添加环境变量
networks                                   加入网络,引用顶级networks下条目
network_mode                            设置容器的网络模式,如 host,bridge,...
ports                                      暴露容器端口,与 -p 相同,但端口不能低于 60
volumes                                    挂载一个宿主机目录或命令卷到容器,命名卷要在顶级 volumes 定义卷名称
volumes_from                            从另一个服务或容器挂载卷,可选参数 :ro 和 :rw,仅版本 '2' 支持
hostname                                   容器主机名
sysctls                                    在容器内设置内核参数
links                                    连接到另外一个容器,- 服务名称[:服务别名]
privileged                                用来给容器root权限,注意是不安全的,true | false
restart                                    设置重启策略,no,always,nounless-st-failure,oped
                                        no,默认策略,在容器退出时不重启容器。
                                        on-failure,在容器非正常退出时(退出状态非0),才会重启容器。
                                        on-failure:3,在容器非正常退出时重启容器,最多重启3次。
                                        always,在容器退出时总是重启容器。
                                        unless-stopped,在容器退出的容器时总是重启容器,但是不考虑在 Docker 守护进程启动时就已经停止了。
depends_on                           depends_on标签用于解决容器的依赖、启动先后的问题。
php:
  depends_on:
    - apache
    - mysql

Docker Compose 常用命令


字段                                        描述
build                                       重新构建服务
ps                                          列出容器
up                                          创建和启动容器    
exec                                        在容器里面执行命令
scale                                       指定一个服务容器启动数量
top                                         显示容器进程
logs                                        查看容器输出
down                                        删除容器、网络、数据卷和镜像
stop/start/restart                          停止/启动/重启服务

Docker Compose 文件结构


yum install -y tree
tree /opt/compose_nginx
/opt/compose_nginx/
├── docker-compose.yml                #创建模板脚本
├── nginx
│?? ├── Dockerfile                    #创建容器脚本
│?? ├── nginx-1.12.0.tar.gz            #复制源码包
│?? └── run.sh                        #启动服务脚本
└── wwwroot
    └── index.html                    #站点网页

Docker Compose安装部署

Docker Compose 是 Docker 的独立产品,因此需要安装 Docker 之后在单独安装 Docker Compose


curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose --version

准备依赖文件


mkdir -p /opt/compose_nginx/nginx /opt/compose_nginx/wwwroot
cd /opt/compose_nginx/nginx
cp nginx-1.12.0.tar.gz ./

vim run.sh
#!/bin/bash
/usr/local/nginx/sbin/nginx

vim Dockerfile
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx image
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#上传nginx软件压缩包,并解压
ADD nginx-1.12.0.tar.gz /usr/local/src/
#指定工作目录
WORKDIR /usr/local/src/nginx-1.12.0
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            #关闭 nginx 在后台运行
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]
//方法二:
ENTRYPOINT [ "/usr/local/nginx/sbin/nginx", "-g", "daemon off;" ]


echo "

this is test web

" > /opt/compose_nginx/wwwroot/index.html


编写配置文件docker-compose.yml


vim /opt/compose_nginx/docker-compose.yml
version: '3'
services:
  nginx:
    container_name: web1
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
      - 1216:80
      - 1217:443
    networks:
      lnmp:
        ipv4_address: 172.20.0.10
    volumes:
      - ./wwwroot:/usr/local/nginx/html
networks:
  lnmp:
   driver: bridge
   ipam:
     config:
       - subnet: 172.20.0.0/16


cd /opt/compose_nginx/
docker-compose -f docker-compose.yml up -d

-f, --file FILE :使用特定的 compose 模板文件,默认为 docker-compose.yml
-d :在后台运行
docker ps -a
CONTAINER ID   IMAGE                 COMMAND     CREATED              STATUS              PORTS                                         NAMES
b48dceee248f   compose_nginx_nginx   "/run.sh"   About a minute ago   Up About a minute   0.0.0.0:1216->80/tcp, 0.0.0.0:1217->443/tcp   compose_nginx_nginx_1

cd /opt/compose_nginx/
docker-compose ps                    #必须在docker-compose.yml所在目录执行此命令

浏览器访问:http://192.168.90.10:1216


Consul简介

Consul是一种开源的分布式服务发现和配置管理工具。它提供了服务注册与发现,健康检查,KV存储,多数据中心,安全服务通信等功能,是构建分布式系统和微服务架构的重要工具。

Consul主要由以下几个组件组成:

  1. Agent(代理):运行在每个节点上的进程,负责与其他Agent通信来完成服务注册、健康检查等工作。

  2. Server(服务器):提供更高级别的服务发现和配置管理功能,同时也承担了集群管理和状态同步等任务。

  3. Catalog(目录):存储所有服务实例的元数据和状态信息,包括服务名称、地址、端口、标签等。

  4. Health Check(健康检查):通过定期进行健康检查来保证服务的可用性,检查结果会被记录在Catalog中。

  5. Key-Value Store(键值存储):提供了一个分布式的KV存储,用于存储和共享配置信息、特性标志等数据。

  6. DNS接口:提供了DNS接口来支持服务发现的客户端透明地访问服务。

Consul通过集成多种服务发现、负载均衡和监控工具,如NGINX、HAProxy、LoadBalancer、Prometheus等,可以实现服务治理和故障自愈,提高了系统的可靠性和弹性,是一种非常有用的分布式系统解决方案。


consul 部署


consul服务器            192.168.90.10      运行consul服务、nginx服务、consul-template守护进程
registrator服务器        192.168.90.20        运行registrator容器、运行nginx容器

systemctl stop firewalld.service
setenforce 0

consul服务器 


1. 建立 Consul 服务
mkdir /opt/consul
cp consul_0.9.2_linux_amd64.zip /opt/consul
cd /opt/consul
unzip consul_0.9.2_linux_amd64.zip
mv consul /usr/local/bin/

//设置代理,在后台启动 consul 服务端
 consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.90.10 \
-client=0.0.0.0 \
-node=consul-server01 &> /var/log/consul.log &


----------------------------------------------------------------------------------------------------------
-server: 以server身份启动。默认是client。
-bootstrap :用来控制一个server是否在bootstrap模式,在一个数据中心中只能有一个server处于bootstrap模式,当一个server处于 bootstrap模式时,可以自己选举为 server-leader。
-bootstrap-expect=2 :集群要求的最少server数量,当低于这个数量,集群即失效。
-ui :指定开启 UI 界面,这样可以通过 http://localhost:8500/ui 这样的地址访问 consul 自带的 web UI 界面。
-data-dir :指定数据存储目录。
-bind :指定用来在集群内部的通讯地址,集群内的所有节点到此地址都必须是可达的,默认是0.0.0.0。
-client :指定 consul 绑定在哪个 client 地址上,这个地址提供 HTTP、DNS、RPC 等服务,默认是 127.0.0.1。
-node :节点在集群中的名称,在一个集群中必须是唯一的,默认是该节点的主机名。
-datacenter :指定数据中心名称,默认是dc1。
----------------------------------------------------------------------------------------------------------

netstat -natp | grep consul

启动consul后默认会监听5个端口:
8300:replication、leader farwarding的端口
8301:lan cossip的端口
8302:wan gossip的端口
8500:web ui界面的端口
8600:使用dns协议查看节点信息的端口

2. 查看集群信息
#查看members状态
consul members
Node             Address             Status  Type    Build  Protocol  DC
consul-server01  192.168.90.10:8301  alive   server  0.9.2  2         dc1

#查看集群状态
consul operator raft list-peers

consul info | grep leader
    leader = true
    leader_addr = 192.168.10.23:8300

 通过 http api 获取集群信息


curl 127.0.0.1:8500/v1/status/peers             #查看集群server成员
curl 127.0.0.1:8500/v1/status/leader            #集群 server-leader
curl 127.0.0.1:8500/v1/catalog/services            #注册的所有服务
curl 127.0.0.1:8500/v1/catalog/nginx            #查看 nginx 服务信息
curl 127.0.0.1:8500/v1/catalog/nodes            #集群节点详细信息


 registrator服务器


//容器服务自动加入 Nginx 集群
1. 安装 Gliderlabs/Registrator
Gliderlabs/Registrator 可检查容器运行状态自动注册,还可注销 docker 容器的服务到服务配置中心。目前支持 Consul、Etcd 和 SkyDNS2。

docker run -d \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
--ip=192.168.90.20 \
consul://192.168.90.10:8500

----------------------------------------------------------------------------------------------------------
--net=host :把运行的docker容器设定为host网络模式。
-v /var/run/docker.sock:/tmp/docker.sock :把宿主机的Docker守护进程(Docker daemon)默认监听的Unix域套接字挂载到容器中。
--restart=always :设置在容器退出时总是重启容器。
--ip :刚才把network指定了host模式,所以我们指定ip为宿主机的ip。
consul :指定consul服务器的IP和端口。
----------------------------------------------------------------------------------------------------------


测试服务发现功能是否正常


docker run -itd -p:83:80 --name test-01 -h test01 nginx
docker run -itd -p:84:80 --name test-02 -h test02 nginx
docker run -itd -p:88:80 --name test-03 -h test03 httpd
docker run -itd -p:89:80 --name test-04 -h test04 httpd     httpd                #-h:设置容器主机名


验证 http 和 nginx 服务是否注册到 consul


浏览器中,输入 http://192.168.90.10:8500,在 Web 页面中“单击 NODES”,然后单击“consurl-server01”,会出现 5 个服务。

//在consul服务器使用curl测试连接服务器
curl 127.0.0.1:8500/v1/catalog/services 
{"consul":[],"httpd":[],"nginx":[]}


consul-template

consul-template是一个用于与Consul集成的工具,可以根据Consul中的服务和配置信息生成文件。它可以监视Consul中的键值存储和服务注册信息的更改,并根据这些更改自动更新和重新生成文件。

consul-template主要有以下特性:

  1. 动态生成配置文件:consul-template可以根据Consul中的键值存储(Key-Value Store)中的配置信息,生成配置文件,如Nginx、HAProxy、Apache等的配置文件。

  2. 服务发现与负载均衡:通过consul-template,可以将服务注册在Consul中的服务信息注入到配置文件中,从而实现服务发现和负载均衡。

  3. 模板语言支持:consul-template使用Go语言的模板引擎,支持灵活的模板语法,可以根据需求定制生成的配置文件。

  4. 自动更新:consul-template会监视Consul中的键值存储和服务注册信息的更改,并自动更新生成的配置文件。当Consul中的信息发生变化时,consul-template会检测到并重新生成文件,以确保配置文件始终与最新的服务和配置信息保持同步。

  5. 支持多种操作系统和容器环境:consul-template可以在各种操作系统和容器环境中运行,包括Linux、Windows、Docker等。

通过使用consul-template,可以更方便地将Consul的服务和配置信息应用到实际的应用程序中,同时可以实现动态更新配置文件的功能,提高系统的可靠性和灵活性。

consul-template部署

1. 准备 template nginx 模板文件
//在consul服务器上操作
vim /opt/consul/nginx.ctmpl
#定义nginx upstream一个简单模板
upstream http_backend {
  {{range service "nginx"}}
   server {{.Address}}:{{.Port}};
   {{end}}
}

#定义一个server,监听8000端口,反向代理到upstream
server {
    listen 8000;
    server_name localhost 192.168.90.10;
    access_log /var/log/nginx/kgc.com-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;
    }
}

2. 编译安装nginx
yum -y install pcre-devel zlib-devel gcc gcc-c++ make
useradd -M -s /sbin/nologin nginx
tar zxvf nginx-1.12.0.tar.gz -C /opt/
cd /opt/nginx-1.12.0/
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx && make -j && make install

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/

3. 配置 nginx
vim /usr/local/nginx/conf/nginx.conf
......
http {
     include       mime.types;
     include  vhost/*.conf;                       #添加虚拟主机目录
     default_type  application/octet-stream;
......

//创建虚拟主机目录
mkdir /usr/local/nginx/conf/vhost 

//创建日志文件目录
mkdir /var/log/nginx
  
//启动nginx
nginx

4. 配置并启动 template
unzip consul-template_0.19.3_linux_amd64.zip -d /opt/
cd /opt/
mv consul-template /usr/local/bin/

//在前台启动 template 服务,启动后不要按 ctrl+c 中止 consul-template 进程。
consul-template --consul-addr 192.168.90.10:8500 \
--template "/opt/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/kgc.conf:/usr/local/nginx/sbin/nginx -s reload" \
--log-level=info

//另外打开一个终端查看生成配置文件
upstream http_backend {
   server 192.168.90.20:83;

   server 192.168.90.20:84;

}

server {
  listen 8000;
  server_name 192.168.90.10;
  access_log /var/log/nginx/kgc.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;
  }
}


5. 访问 template-nginx
docker ps -a
CONTAINER ID   IMAGE                           COMMAND                  CREATED       STATUS          PORTS                NAMES
9f0dc08956f4   httpd                           "httpd-foreground"       1 hours ago   Up 1 hours      0.0.0.0:89->80/tcp   test-04
a0bde07299da   httpd                           "httpd-foreground"       1 hours ago   Up 1 hours      0.0.0.0:88->80/tcp   test-03
4f74d2c38844   nginx                           "/docker-entrypoint.…"   1 hours ago   Up 1 hours      0.0.0.0:84->80/tcp   test-02
b73106db285b   nginx                           "/docker-entrypoint.…"   1 hours ago   Up 1 hours      0.0.0.0:83->80/tcp   test-01
409331c16824   gliderlabs/registrator:latest   "/bin/registrator -i…"   1 hours ago   Up 1 hours                        registrator

docker exec -it 4f74d2c38844 bash
echo "this is test1 web" > /usr/share/nginx/html/index.html

docker exec -it b73106db285b bash
echo "this is test2 web" > /usr/share/nginx/html/index.html

浏览器访问:http://192.168.10.23:8000/,并不断刷新。


6. 增加一个 nginx 容器节点
(1)增加一个 nginx 容器节点,测试服务发现及配置更新功能。
docker run -itd -p:85:80 --name test-05 -h test05 nginx

//观察 template 服务,会从模板更新/usr/local/nginx/conf/vhost/kgc.conf 文件内容,并且重载 nginx 服务。

(2)查看/usr/local/nginx/conf/vhost/kgc.conf 文件内容
cat /usr/local/nginx/conf/vhost/kgc.conf
upstream http_backend {

server 192.168.90.10:83;

server 192.168.90.10:84;

server 192.168.90.10:85;

server 192.168.90.10:86;

}

(3)查看三台 nginx 容器日志,请求正常轮询到各个容器节点上
docker logs -f test-01
docker logs -f test-02
docker logs -f test-05
docker logs -f test-06


consul 多节点


//添加一台已有docker环境的服务器192.168.90.30/24加入已有的群集中
consul agent \
-server \
-ui \
-data-dir=/var/lib/consul-data \
-bind=192.168.90.30 \
-client=0.0.0.0 \
-node=consul-server02 \
-enable-script-checks=true  \
-datacenter=dc1  \
-join 192.168.90.10 &> /var/log/consul.log &

------------------------------------------------------------------------
-enable-script-checks=true :设置检查服务为可用
-datacenter : 数据中心名称
-join :加入到已有的集群中
------------------------------------------------------------------------

consul members
Node             Address             Status  Type    Build  Protocol  DC
consul-server01  192.168.90.10:8301  alive   server  0.9.2  2         dc1
consul-server02  192.168.90.30:8301  alive   server  0.9.2  2         dc1


consul operator raft list-peers
Node             ID                  Address             State     Voter  RaftProtocol
Node             ID                  Address             State     Voter  RaftProtocol
consul-server01  192.168.90.10:8300  192.168.90.10:8300  leader    true   2
consul-server02  192.168.90.30:8300  192.168.90.20:8300  follower  true   2

你可能感兴趣的:(docker,consul,eureka)