目录
指定容器名称,由于容器名称是唯一的,如果指定自定义名称,则无法scale
重启策略,默认no,always,no-failure,unless-stoped
4.1、将docker-compose复制到/usr/bin目录下,并授权
4.5、此时,可以用 tree 命令,查看一下根目录下的文件结构
6.4在server2上安装Gliderlabs/Registrator
在浏览器输入:http://192.168.206.10:8500查看
6.5、在server2上安装两个httpd及nginx容器
7.9、我们可以服务端在创建一个 nginx 容器节点,检测服务发现及配置更新功能
一、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.10 | Docker-ce 、Compose 3、Consul、Consul-template |
192.168.206.20 | Docker-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 &