实验:docker私有仓库部署和管理

配置环境:
服务器:20.0.0.21 Docker-ce、Compose 3、Consul(自动发现自动更新)、Consul-template
服务器:20.0.0.20 Docker-ce、registrator(自动发现)
服务器:20.0.0.22 Consul

以下操作在20.0.0.21服务器操作

  • docker compose部署
把docker-compose容器编排工具上传上去

cp -p docker-compose /usr/local/bin/   		//把工具复制到bin下,让系统所能识别

chmod +x /usr/local/bin/docker-compose	//给执行权限

mkdir compose_nginx           //创建一个nginx编排容器目录,意思就是各种版本nginx镜像都可以放这个目录下 

cd compose_nginx/				//进入目录
  • 以下部分和nginx镜像创建一样
mkdir nginx				//创建一个nginx目录

cd nginx/					//进入nginx

vim Dockerfile				//编辑一个Dockerfile容器脚本
#基于基础镜像
FROM centos:7
#用户信息
MAINTAINER this is nginx <zk>
#添加环境包
RUN yum -y update
RUN yum -y install gcc gcc-c++ make pcre-devel  zlib-devel perl
RUN useradd -M -s /sbin/nologin nginx
#下载nginx软件包
ADD nginx-1.15.9.tar.gz /opt
WORKDIR /opt
#指定工作目录
WORKDIR nginx-1.15.9
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
#添加宿主机中run.sh到容器中
ADD run.sh /run.sh
RUN chmod 755 /run.sh
CMD ["/run.sh"]

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


把nginx包上传上去
  • 上面就是nginx镜像创建
cd ..

vim docker-compose.yml	//创建compose编排模板脚本
version: '3'
services:
  nginx:
    hostname: nginx
    build:
      context: ./nginx
      dockerfile: Dockerfile
    ports:
     - 1216:80
     - 1217:443
    networks:
     - zjz
    volumes:
     - ./wwwroot:/usr/local/nginx/html 
networks:
  zjz:


---------------------------------------------------------上面脚本的解释------------------------------------------------------------------------------

version: '3'		//编排工具版本
services:			//服务。下面首行缩进的都代表都是services子选项
  nginx:			//服务名称
    hostname: nginx		//容器主机名
    build:			//重新构建服务
      context: ./nginx		//创建nginx所需的材料都在当前nginx目录下
      dockerfile: Dockerfile	//指定dockerfile文件在当前nginx目录下
    ports:			//提供出来的端口
     - 1216:80		//1216是对外端口,80是内端口,http的
     - 1217:443		//1217是对外端口,443是内端口,https的
    networks:		//网络名称
     - zjz	            //如果要建群集,那这就是网络群集名称。如果想让别的容器跟你一个网段,那这里名称要一致
    volumes:                                //建立一个数据卷
     - ./wwwroot:/usr/local/nginx/html        //把宿主机的wwwroot目录关联到容器上的站点目录,会在宿主机自动创建wwwroot目录
networks:			//对外公开声明一下networks群集的名称。针对整个服务器的。跟services一个级别,不用缩进。
  zjz:
--------------------------------------------------------------------------------------------------------------------------------------------------------

//-f:执行docker-compose.yml工具的编排,up:开启 意思是创建容器后就开启,-d:守护进程
docker-compose -f docker-compose.yml up -d     


测试:http://20.0.0.21:1216/    	//会显示403,也就是能连接上但没有网页


//创建一个站点页面
echo "this is nginx" > wwwroot/index.html


测试:http://20.0.0.21:1216/	//在查看就是正常访问了

以下操作在20.0.0.21服务器操作

  • consul服务器部署
mkdir consul

cd consul/

把consul_0.9.2_linux_amd64包上传到此目录

unzip consul_0.9.2_linux_amd64.zip 		//解压

mv consul /usr/bin/				//让系统所能识别命令

consul agent \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.21 \
-client=0.0.0.0 \
-node=consul-server01  & > /var/log/consul.log  &

-----------------------------------------上面的配置解释------------------------------------------------------
consul agentr \				//使用agentr代理功能
-server \					//指定服务器server
-bootstrap \				//参与选举为领袖
-ui \					//提供web访问页面(图形化页面)
-data-dir=/var/lib/consul-data \		//数据存储位置
-bind=20.0.0.21 \				//绑定地址(本地地址)
-client=0.0.0.0 \				//监听客户端任意网段
-node=consul-server01  & > /var/log/consul.log  &		//node=consul-server01 是本地节点名称,不管对的错的 有日志产生就混合输出到/var/log/consul.log下,& 放到后台运行
---------------------------------------------------------------------------------------------------------------

//查看集群信息
[root@localhost consul]# consul members
Node             Address         Status  Type    Build  Protocol  DC
consul-server01  20.0.0.21:8301  alive(在线状态)   server  0.9.2  2         dc1(数据中心,默认都叫dc1)


[root@localhost consul]# consul info | grep leader		//过滤leader(老大,也是服务角色)是谁
	leader = true
	leader_addr = 20.0.0.21:8300


//通httpd api 获取集群信息
curl 127.0.0.1:8500/v1/status/peers		//查看集群server成员
curl 127.0.0.1:8500/v1/status/leader		//集群 Raf leader
curl 127.0.0.1:8500/v1/catalog/services		//注册的所有服务
curl 127.0.0.1:8500/v1/catalog/services		//查看nginx服务信息
curl 127.0.0.1:8500/v1/catalog/nodes		//集群节点详细信息------做到这里,只能这条能查询使用!

以下操作在20.0.0.20服务器操作!!!!

  • 容器服务自动加入nginx集群(Registrator注册器)
1.安装Glider labs/Registrator Glider labs/Registrator
可检查容器运行状态自动注册,还可注销docker容器的服务到服务配置中心。
目前支持 Consul、Etcd  和 SkyDNS2。
在   20.0.0.20   节点,执行以下操作:
docker  run -d  \
--name=registrator \
--net=host \
-v /var/run/docker.sock:/tmp/docker.sock \
--restart=always \
gliderlabs/registrator:latest \
-ip=20.0.0.20 \
consul://20.0.0.21:8500
----------------------------上面解释--------------------------------------------------
docker  run -d  \
--name=registrator \			//指定容器名称
--net=host \				//指定host网络
-v /var/run/docker.sock:/tmp/docker.sock \	//指定数据卷
--restart=always \				//重启策略(always:始终重启)
gliderlabs/registrator:latest \			//指定从哪个镜像进行加载
-ip=20.0.0.20 \				//指定本地ip地址
consul://20.0.0.21:8500			//指定对方ip地址
---------------------------------------------------------------------------------------
等上面下载完成后,就可以实现自动注册功能
浏览器输入20.0.0.21:8500就能看见consul页面情况,但里面没有服务,只有自己




2、测试服务发现功能是否正常,还是在20.0.0.21服务器操作

下面创建容器解释:用docker run -itd ,指定外端口83映射到内端口80,容器名称test-01,-h  test01是主机名删掉也可以,nginx镜像 
可以一个一个创建,也可以直接复制四条进去创建,但创建后要ps -a查看一下少不少,少哪个容器在单独创建哪个
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


2、验证http 和nginx 服务是否注册到 consul
浏览器输入 20.0.0.21:8500  ,单机 NODES ,然后单机 consurl-server01,会出现5个服务


3、验证nginx能不能正常访问
浏览器输入20.0.0.20:83 就能看见nginx网页
浏览器输入20.0.0.20:84 就能看见nginx网页


20.0.0.20服务器就自动注册
20.0.0.21服务器就会自动发现

还是在20.0.0.21服务器上操作

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

准备template nginx模板文件
这个模板的作用实现配置文件的实时更新
//在consul(20.0.0.21)上操作
mkdir consul/
cd consul/
vim nginx.ctmpl

vim    /root/consul/nginx.ctmpl
	#http_backend(是服务器池子的名称)
upstream  http_backend {
   {{range service "nginx"}}
    server  {{.Address}}:{{.Port}};
    {{end}}
}
upstream模块,将使nginx跨越单机的限制,完成网络数据的接收、处理和转发。
上面代码的解释:upstream模块做的是四层转发。这个模板当中先声明了后端服务器池(也就是上面五行代码),这个后端服务器池引用了两个变量,一个是Address、一个是Port,分别读取node节点20.0.0.20ip地址和20.0.0.20的端口83、84,两个信息就会被加载过来,生成两条server条目(开几条nginx就会加载几条)

server  {
    listen 1216;
    server_name localhost  20.0.0.21;
    access_log  /var/log/nginx/zk.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;
     }
}
-----------------------------------------------上面的解释-----------------------------------------------------
server  {
    listen 1216;		//监听端口,也是代理端口,提供给客户端的。映射的是容器的外端口
    server_name localhost  20.0.0.21;		//指定本地地址,监听地址
    access_log  /var/ log/nginx/zk.cn-access.log;	//日志文件所在位置
    index  index.html index.php;		//首页类型
    location  /  {				
          proxy _set_header HOST $host;		//proxy(代理、跳转),header(头部信息),主机
          proxy_set_header  X-Real-IP  $remote_addr;	//请求者的地址,会把请求的地址进行转发	
          proxy_set_header Client-IP     $remote_addr;	//客户端ip
          proxy_set_header X-Forwarded-For  $proxy_add_x_forwarded_for;		//跳转的地址
          proxy _pass http://http_backend;	 //proxy _pass是反向代理模块,http协议开头,后面是http_backend(服务器池子名称)地址
     }
}

  • 编译安装nginx
1、安装环境依赖包
yum -y install gcc gcc-c++ make pcre-devel  zlib-devel perl 
gcc编译器
gcc-c++编译器
make工具
pcre-devel支持正则表达式的工具
zlib-devel压缩工具
perl语言工具
把nginx包上传上来
tar zxvf nginx-1.15.9.tar.gz -C /opt/	//解压
cd /opt/nginx-1.15.9/

./configure --prefix=/usr/local/nginx	//指定安装目录

make && make install		//编译安装

vim /usr/local/nginx/conf/nginx.conf	//nginx主配置文件
写在http字段当中添加
include     vhost/*.conf;		//只要是vhost目录下带有.conf结尾的都能识别

cd /usr/local/nginx/conf/	
mkdir  vhost			//上面主配置指定了路径,在这创建一个vhost

mkdir /var/log/nginx		//生成的日志路径。刚刚配置里的路径,需要手动创一个nginx目录

ln -s /usr/local/nginx/sbin/nginx /usr/local/sbin/		//让系统所能识别nginx命令

nginx						//启动nginx

[root@localhost log]# netstat -anpt | grep nginx		//查看nginx启动了没
  • 配置并启动 template
cd			//cd到root家目录

unzip consul-template_0.19.3_linux_amd64.zip	//解压

mv consul-template /usr/bin/			//系统所能识别	

//启用模板
consul-template -consul-addr  20.0.0.21:8500  \
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/zk.conf:/usr/local/nginx/sbin/nginx -s reload"  \
--log-level=info
-------------------------------------上面解释-------------------------------------------
consul-template -consul-addr  20.0.0.21:8500  \	//指定本地ip地址。读取template模板,加载本地的consul的服务当中拉取我所需的东西
-template "/root/consul/nginx.ctmpl:/usr/local/nginx/conf/vhost/zk.conf:/usr/local/nginx/sbin/nginx -s reload"  \ 		// 通过template模板产生出zk.conf配置文件,重载配置文件
--log-level=info	//日志定义 info(信息)级别
----------------------------------------------------------------------------------------	
这个时候就会进入监控状态,需要另开终端!

//另外打开一个终端查看生成配置文件

cd  /usr/local/nginx/conf/vhost/	//里面会自动生成一个zk.conf配置文件,可以vim进去看看

docker ps -a			//查看一下容器
docker stop d4cd7c9816e2 		//把刚刚那个容器关闭掉。冲突了!

/usr/local/nginx/sbin/nginx -s reload	//重启一下服务

浏览器输入:20.0.0.21:1216 就可以看见nginx网站
  • 增加一个nginx容器节点,看看zk.conf配置文件会不会变更
增加一个 nginx 容器节点,测试服务发现及配置更新功能
//在registrator服务端注册(20.0.0.20服务器上)
docker run -itd -p:85:80 --name test-05 -h test05 nginx		//创建一个容器

这个时候20.0.0.21服务器就会监控自动更新了,更新的是zk.conf

去20.0.0.21里面vim zk.conf 就能看见更新了ip


//查看三台nginx容器日志,请求正常轮询到各个容器节点上(20.0.0.20服务器查看)
docker logs  -f test-01		//就能看见谁访问的我!
docker logs  -f test-02
docker logs  -f test-05

以下操作在20.0.0.22服务器操作

  • consul多节点
//添加一台已有docker环境的服务器20.0.0.22/24加入已有的群集中
把consul_0.9.2_linux_amd64包传上去

unzip consul_0.9.2_linux_amd64.zip 

mv consul /usr/bin/			//系统所能识别命令
	
consul agent  \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.22 \
-client=0.0.0.0  \
-node=consul-server02 \
-enable-script-checks=true \
-datacenter=dc1 \
-join 20.0.0.21 &> /var/log/consul.log &
------------------------------上面解释------------------------------------------
consul agent  \
-server \
-bootstrap \
-ui \
-data-dir=/var/lib/consul-data \
-bind=20.0.0.22 \
-client=0.0.0.0  \
-node=consul-server02 \			//节点名称server02 
-enable-script-checks=true \			//开启服务检查
-datacenter=dc1 \				//数据中心名称
-join 20.0.0.21 &> /var/log/consul.log &	//添加到已有的集群当中
-------------------------------------------------------------------------------------------------------------
-enable-script-checks=true:设置检查服务为可用
-datacenter:数据中心名称
-join:加入到已有的集群中



测试:浏览器输入http://20.0.0.21:8500/,NODES里面就有server02
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值