Docker 构建持续集成环境


CI/CD介绍

  1. CI(持续集成)/CD(持续交付/持续部署)

发布流程设计

基础环境准备

docker服务器 与 Harbor

1
2
3
Jenkins服务器      172.17.70.243
Docker服务器 172.17.70.244
Git/Harbor 172.17.70.242
  1. docker 服务器 能够访问 Harbor仓库
1
2
[root@Jenkins ~]# docker login 172.17.70.242
[root@Docker ~]# docker login 172.17.70.242
  1. 每台服务器安装JAVA环境
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# 解压
[root@server2 ~]# tar -zxvf jdk-8u231-linux-x64.tar.gz -C /usr/local/
[root@server2 ~]# ls -l /usr/local/jdk1.8.0_231/

# 配置环境变量
[root@server2 local]# vim /etc/profile

export JAVA_HOME=/usr/local/jdk1.8.0_231
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$CLASSPATH

[root@server2 local]# source /etc/profile

# 让设置生效
[root@server2 local]# java -version
java version "1.8.0_231"
Java(TM) SE Runtime Environment (build 1.8.0_231-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.231-b11, mixed mode)

部署 Git 服务器

  1. 部署仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1. 安装Git
yum install git

2. 创建Git用户
useradd git
passwd git

3. 创建仓库
su - git
mkdir solo.git
cd solo.git/

# 初始化仓库
git --bare init

[git@Git-Harbor solo.git]$ ls
branches config description HEAD hooks info objects refs
  1. 部署本地git 提交solo项目到git仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
1. Jenkins服务器上安装git,下载solo项目有到服务器上,模拟开发上传到git仓库再
[root@Jenkins opt]# yum install git

2. 下载solo项目
[root@Jenkins opt]# git clone https://github.com/b3log/solo.git
# 本地工程路径: /opt/solo

[root@Jenkins tmp]# git clone https://github.com/b3log/solo-skins.git
[root@Jenkins tmp]# cd solo-skins/
[root@Jenkins skins]# cd /opt/test/solo/src/main/webapp/skins
# 复制所有皮肤到本地目录
[root@Jenkins skins]# cp -r /tmp/solo-skins/* .



3. 创建本地git目录 test
[root@Jenkins opt]# mkdir test
[root@Jenkins opt]# cd test/

# 把git服务器上solo项目拉过来
[root@Jenkins test]# git clone root@172.17.70.242:/home/git/solo.git

# 在把本地写好的solo项目 git上去
[root@Jenkins solo]# cd /opt/test/solo/
[root@Jenkins test]# cp ../solo/* solo/ -rf

[root@Jenkins solo]# cd /opt/test/solo
[root@Jenkins solo]# ls -l
total 428
-rw-r--r-- 1 root root 141981 Nov 3 17:58 CHANGE_LOGS.html
-rw-r--r-- 1 root root 519 Nov 3 17:58 Dockerfile
-rw-r--r-- 1 root root 4486 Nov 3 17:58 gulpfile.js
-rw-r--r-- 1 root root 34522 Nov 3 17:58 LICENSE
-rw-r--r-- 1 root root 938 Nov 3 17:58 package.json
-rw-r--r-- 1 root root 211486 Nov 3 17:58 package-lock.json
-rw-r--r-- 1 root root 14647 Nov 3 17:58 pom.xml
-rw-r--r-- 1 root root 1390 Nov 3 17:58 README.md
drwxr-xr-x 2 root root 4096 Nov 3 17:58 scripts
drwxr-xr-x 4 root root 4096 Nov 3 17:58 src

# 提交到本地
[root@Jenkins solo]# git config user.name "leo"
[root@Jenkins solo]# git config user.email "365042337@qq.com"
[root@Jenkins solo]# git add .
[root@Jenkins solo]# git commit -m "all"

# psuh到 git 服务器
[root@Jenkins solo]# git push origin master
root@172.17.70.242's password:
Counting objects: 655, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (641/641), done.
Writing objects: 100% (655/655), 5.14 MiB | 9.80 MiB/s, done.
Total 655 (delta 240), reused 0 (delta 0)
To root@172.17.70.242:/home/git/solo.git
* [new branch] master -> master

创建 自定义虚拟网络 solo

1
2
# 在docker服务器上创建
[root@Docker opt]# docker network create solo

solo 部署 mysql服务器

1
2
3
4
5
docker run -d \
--name solo_mysql \
--net solo \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=solo mysql:5.6 --character-set-server=utf8

修改 solo 源码中的数据库连接配置

1
2
3
4
5
6
7
8
9
10
11
12
# 使用mysql容器名访问
[root@Jenkins resources]# cd /opt/test/solo/src/main/resources
[root@Jenkins resources]# sed -i 's#localhost#solo_mysql#g' local.properties

# 提交到本地
[root@Jenkins solo]# git config user.name "leo"
[root@Jenkins solo]# git config user.email "365042337@qq.com"
[root@Jenkins solo]# git add .
[root@Jenkins solo]# git commit -m "all"

# psuh到 git 服务器
[root@Jenkins solo]# git push origin master

部署 Harbor 镜像仓库

1
1. 如果不使用https,docker服务器上别忘记配置信任

Jenkins 安装

1
2
3
4
5
# 配置jenkins 服务器 与git服务器免交互
[root@Jenkins jenkins]# ssh-keygen
[root@Jenkins jenkins]# ssh-copy-id git@172.17.70.242
# 不用输入密码 即可git
[root@Jenkins jenkins]# git clone git@172.17.70.242:/home/git/solo.git
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
# 使用jenkins容器
[root@Jenkins solo]# cd /opt/
[root@Jenkins opt]# mkdir jenkins

# git jenkins容器使用git拉取镜像
# libltdl-dev jenkins使用宿主机的docker引擎

# 先拉取最新jenkins版本
[root@Jenkins jenkins]# docker pull jenkins/jenkins

[root@Jenkins jenkins]# vim Dockerfile

FROM jenkins/jenkins
USER root
# RUN echo '' > /etc/apt/sources.list.d/jessie-backports.list && \
# wget http://mirrors.163.com/.help/sources.list.jessie -O /etc/apt/sources.list

# COPY sources.list.jessie /etc/apt/sources.list

RUN apt-get update && apt-get install -y git libltdl-dev

[root@Jenkins jenkins]# docker build -t jenkins:v1 .


# 启动
[root@Jenkins jenkins]# docker run -d --name jenkins -p 8080:8080 -v /var/jenkins_home/:/var/jenkins_home -v /usr/local/apache-maven-3.5.0:/usr/local/maven -v /usr/local/jdk1.8.0_231/:/usr/local/jdk -v /var/run/docker.sock:/var/run/docker.sock -v $(which docker):/usr/bin/docker -v ~/.ssh:/root/.ssh jenkins:v1

[root@Jenkins jenkins]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e37fe659cc2 jenkins:v1 "/bin/tini -- /usr/l…" 42 seconds ago Up 41 seconds 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins

# 安装 apache-maven-3.5.0-bin.tar
[root@Jenkins opt]# tar -zxvf apache-maven-3.5.0-bin.tar.gz -C /usr/local/


# 安装jenkins解锁
[root@Jenkins secrets]# cat /var/jenkins_home/secrets/initialAdminPassword
b4b2de84e81f45caae80a105a9460eba

# 选择插件安装

构建基础镜像

1
2
3
4
5
6
7
8
9
10
11
12
13
[root@Docker solo]# mkdir -p /opt/solo/

[root@Docker solo]# vim Dockerfile
FROM centos:7
MAINTAINER leo 365042337@qq.com
RUN yum install unzip iproute -y
ENV JAVA_HOME /usr/local/jdk
ADD apache-tomcat-8.5.47.tar.gz /usr/local/
RUN mv /usr/local/apache-tomcat-8.5.47 /usr/local/tomcat && \
sed -i '1a JAVA_OPTS="-Djava.security.egd=file:/dev/./urandom"' /usr/local/tomcat/bin/catalina.sh
WORKDIR /usr/local/tomcat
EXPOSE 8080
ENTRYPOINT ["./bin/catalina.sh", "run"]
1
2
3
4
# 构建
[root@Docker solo]# docker build -t 172.17.70.242/test/tomcat:v1 .
# 推送 项目会基于这个tomcat构建服务
[root@Docker solo]# docker push 172.17.70.242/test/tomcat:v1

Jenkins基本配置

全局工具配置 git jdk maven

系统配置

1
2
3
4
5
6
7
8
# jenkins 安装ssh插件
# 配置 SSH remote hosts
# jenkins配置免交互 访问 docker主机

[root@Jenkins solo]# ssh-copy-id root@172.17.70.244

# 添加用户凭据 credentials -> 全局 -> 加入公钥
[root@Jenkins solo]# cat /root/.ssh/id_rsa

1
别忘记保存

Jenkins创建项目

安装 Maven 插件

1
Maven Integration

创建sola项目

1
2
3
4
5
6
7
8
1. 配置好源码管理 jenkins到git 免交互访问
git@172.17.70.242:/home/git/solo.git

2. 每10分钟拉取一次代码
*/30 * * * *

3. 跳过项目的测试用例
clean package -Dmaven.test.skip=true

立即构建 测试一次

1
2
3
4
5
6
7
8
9
cd /var/jenkins_home/workspace/solo_blog/target
[root@Jenkins target]# ls -l
total 21880
drwxr-xr-x 3 root root 4096 Nov 4 15:42 classes
drwxr-xr-x 3 root root 4096 Nov 4 15:42 generated-sources
drwxr-xr-x 2 root root 4096 Nov 4 15:42 maven-archiver
drwxr-xr-x 3 root root 4096 Nov 4 15:42 maven-status
drwxr-xr-x 12 root root 4096 Nov 4 15:42 solo
-rw-r--r-- 1 root root 22380877 Nov 4 15:42 solo.war # 实际要部署的包

增加构建后操作

  1. 把项目打包到镜像 推送到镜像仓库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 构建后 到当前目录 写dockerfile文件 构建镜像并推送到公共仓库

cd $WORKSPACE
docker login -u admin -p 123456 172.17.70.242
cat > Dockerfile << EOF
# BASE
FROM 172.17.70.242/test/tomcat:v1
# WHO
MAINTAINER leo 365042337@qq.com
# COPY
COPY target/solo.war /tmp/ROOT.war
# RUN
RUN rm -rf /usr/local/tomcat/webapps/* && \
unzip /tmp/ROOT.war -d /usr/local/tomcat/webapps/ROOT && \
rm -f /tmp/ROOT.war

ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
EOF

docker build -t 172.17.70.242/test/solo:v1 .
docker login -u admin -p 123456 172.17.70.242
docker push 172.17.70.242/test/solo:v1

项目镜像传给 docker服务器 运行

  1. 使用项目构建后操作
1
2
3
4
5
6
7
8
9
10
11
# 远程登录docker服务器,然后拉取项目镜像 run
# 1. 考虑镜像需要清理 容器需要清理 再拉取运行
# 2. 挂上jdk 从而减少容器的大小
# 3. 后期要考虑项目版本构建 每次的构建版本不同
# 4. jenkins 判断状态码 删除没有的容器 echo$? = 1 所以加上 | true
# --net solo 指定自定义网络是因为solo需要mysql 在docker服务上启动了一个

docker rmi -f 172.17.70.242/test/solo:v1 | true
docker rm -f solo | true
docker login -u admin -p 123456 172.17.70.242
docker run -d -it --name solo --net solo -p 88:8080 -v /usr/local/jdk1.8.0_231:/usr/local/jdk 172.17.70.242/test/solo:v1

构建后查看

1
2
3
4
[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc910d9d1bb9 172.17.70.242/test/solo:v1 "/usr/local/tomcat/b…" 8 seconds ago Up 7 seconds 0.0.0.0:88->8080/tcp solo
8395404a43b5 mysql:5.6 "docker-entrypoint.s…" 13 hours ago Up 11 minutes 3306/tcp solo_mysql

测试maven 构建 solo项目

1
2
3
4
# 仅仅是测试
[root@Jenkins solo]# /usr/local/apache-maven-3.5.0/bin/mvn clean package -Dmaven.test.skip=true

# 依赖是再 pom.xml 文件中指定好的 第一次拉取需要下载 形成缓存

使用 pipeline 构建项目

把整体工作放在流水线中

基础使用 阶段演示

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
node {

stage('git check') {
sh "echo 1"
}

stage('build') {
sh "echo 2"
}

stage('deploy') {
sh "echo 3"
}

}

使用pipeline的优点

  1. 项目发布可视化,明确阶段,方便问题处理
  2. jenkinsfile文件管理整个项目的生命周期
  3. jenkinsfile可以放到整个项目代码中版本管理
  4. 使用pipeline 是ci/cd 最佳实践
1
2
3
4
5
1. 构建过程更加清晰可见
2. 每个阶段都可以查看过程日志,可以更清晰的定位问题
3. 通过脚本实现各个环节
4. 可以放到git仓库中,从仓库中后去直接构建
5. 可以与项目放在一起 项目周期一致

配置 solo pipeline

丢弃旧的构建

代码版本参数

maven的配置

1
2
3
4
5
1. 我这个jenkins是容器启动的 挂载了本地的maven环境
2. -v /usr/local/apache-maven-3.5.0:/usr/local/maven
3. maven是要用的的是容器路径 /usr/local/maven
4. jdk也是 /usr/local/jdk
5. 这些环境与jenkins的全局工具配置路径一致就可以找到

流水线脚本

1
2
3
4
5
6
7
8
# 这里我发现 我的jenkins是容器安装的...没法指定node也没办法远程 我就吧docker先部署到本地了 ,后面我在想办法改回来
[root@Jenkins local]# docker network create solo

docker run -d \
--name solo_mysql \
--net solo \
-e MYSQL_ROOT_PASSWORD=123456 \
-e MYSQL_DATABASE=solo mysql:5.6 --character-set-server=utf8
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
node {   // 指定Slave标签 我这用的master 上面有git和maven环境
// 拉取代码
stage('Git Checkout') { // 别忘记设置ssh免登录 访问到git服务器 Tag是根据版本号码进行构建自定义传值
checkout([$class: 'GitSCM', branches: [[name: '$Tag']], doGenerateSubmoduleConfigurations: false, extensions: [], submoduleCfg: [], userRemoteConfigs: [[url: 'git@172.17.70.242:/home/git/solo.git']]])
}
// 代码编译
stage('Maven Build') {
sh '''
export JAVA_HOME=/usr/local/jdk
/usr/local/maven/bin/mvn clean package -Dmaven.test.skip=true
'''
}
// 项目打包到镜像并推送到镜像仓库
// REPOSITORY = 镜像仓库地址 项目名/版本号
stage('Build and Push Image') {
sh '''
REPOSITORY=172.17.70.242/test/solo:${Tag}
cat > Dockerfile << EOF
FROM 172.17.70.242/test/tomcat:v1
MAINTAINER leo 365042337@qq.com
RUN rm -rf /usr/local/tomcat/webapps/*
COPY target/solo.war /usr/local/tomcat/webapps/ROOT.war
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh", "run"]
EOF
docker build -t $REPOSITORY .
docker login -u admin -p 123456 172.17.70.242
docker push $REPOSITORY
'''
}
// 部署到Docker主机
stage('Deploy to Docker') {
sh '''
REPOSITORY=172.17.70.242/test/solo:${Tag}
docker rm -f blog-solo |true
docker image rm $REPOSITORY |true
docker login -u admin -p 123456 172.17.70.242
docker run -d --name blog-solo --net solo -p 88:8080 -v /usr/local/jdk1.8.0_231:/usr/local/jdk $REPOSITORY
'''
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# 查看git配置
[root@Jenkins solo]# cd /opt/test/solo/
[root@Jenkins solo]# cat .git/config
[core]
repositoryformatversion = 0
filemode = true
bare = false
logallrefupdates = true
[remote "origin"]
url = root@172.17.70.242:/home/git/solo.git
fetch = +refs/heads/*:refs/remotes/origin/*
[branch "master"]
remote = origin
merge = refs/heads/master
[user]
name = leo
email = 365042337@qq.com

模拟版本发布

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 创建个文件 形成新版本代码
[root@Jenkins solo]# touch src/main/webapp/test01

# 提交到本地
[root@Jenkins solo]# git add .

[root@Jenkins solo]# git commit -m "test01"
[master 2602e3a] test01
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 src/main/webapp/test01

# 打tag
[root@Jenkins solo]# git tag 1.0.3

# push 到主分支
[root@Jenkins solo]# git push origin 1.0.3
root@172.17.70.242's password:
Counting objects: 10, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 438 bytes | 0 bytes/s, done.
Total 6 (delta 3), reused 0 (delta 0)
To root@172.17.70.242:/home/git/solo.git
* [new tag] 1.0.3 -> 1.0.3

开始构建

1
2
3
4
5
6
# 容器启动
[root@Jenkins local]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
46bdaf3cb6cc 172.17.70.242/test/solo:1.0.3 "/usr/local/tomcat/b…" 21 seconds ago Up 20 seconds 0.0.0.0:88->8080/tcp blog-solo
6c856f6c9f08 mysql:5.6 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 3306/tcp solo_mysql
8bfb5bbc017e jenkins:v1 "/sbin/tini -- /usr/…" 19 hours ago Up 4 hours 0.0.0.0:8080->8080/tcp, 50000/tcp jenkins
1
2
3
4
# 进入容器 查看是否存在新版本文件
[root@Jenkins local]# docker exec -it blog-solo bash

[root@46bdaf3cb6cc tomcat]# cat webapps/ROOT/test01

Consul 容器服务自动注册与发现

安装与部署

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1、介绍
Consul是一个分布式、高可用性,在基础设施中发现和配置服务的工具。

2、安装
下载二进制Consul包:https://www.consul.io/downloads.html
# unzip consul_0.9.2_linux_amd64.zip
# mv consul /usr/bin

3、部署
consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.17.70.243 -client=0.0.0.0 -node=server01

# server 模式启动 集群的主节点 存储数据 处理请求
# ui web管理系统
# data-dir= 数据目录
# bind 绑定地址
# node 节点名
1
2
3
4
[root@Jenkins opt]# ls -l consul_0.9.2_linux_amd64.zip 
[root@Jenkins opt]# unzip consul_0.9.2_linux_amd64.zip

[root@Jenkins opt]# mv consul /usr/bin
1
2
3
4
5
6
# 后台启动 端口8500 

[root@Jenkins opt]# nohup consul agent -server -bootstrap -ui -data-dir=/var/lib/consul-data -bind=172.17.70.243 -client=0.0.0.0 -node=server01 &>/var/log/caonsul.log &
[root@Jenkins opt]# tailf /var/log/caonsul.log
# web访问
http://39.106.100.108:8500/ui/dc1/services

基础使用

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
查看集群信息:
consul members
consul info |grep leader
consul catalog services

通过HTTP API获取集群信息:
curl 127.0.0.1:8500/v1/status/peers # 集群server成员
curl 127.0.0.1:8500/v1/status/leader # 集群Raft 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 # 集群节点详细信息

服务注册:
curl -X PUT -d \
'{"id": "jetty","name": "service_name","address": "192.168.0.212","port": 8080,"tags": ["test"],"checks": [{"http":
"http://192.168.0.212:8080/","interval": "5s"}]}' \
http://192.168.0.211:8500/v1/agent/service/register

实现容器服务自动加入Nginx集群 Docker + Registrator + Consul

  1. consul-template:一个守护程序,用于实时查询consul集群数据,并更新文件系统上的任意数量的指定模板,生成配置文件,更新完成后可以选择运行任何Shell命令。
    • 让它生成nginx配置文件 从集群中拿去 再去放入nginx里 执行重载
  2. gliderlabs/registrator:检查容器运行状态自动注册和注销Docker容器的服务到服务配置中心。目前支持Consul、etcd和SkyDNS2。
    • 检查容器服务状态、注销和配置服务中心 运行在docker主机,如果创建新的docker就捕捉出来,注册到Consul
1
2
https://github.com/hashicorp/consul-template
https://releases.hashicorp.com/consul-template/0.19.3/consul-template_0.19.3_linux_amd64.zip
  1. 模拟在一台docker主机上跑多个nginx服务

  2. 让他们自动加入一个nginx LB上

registrator 容器部署

1
2
3
4
5
6
# Docker主机启动注册器
# 172.17.70.244
# registrator
# docker服务

# docker run -d --name=registrator --net=host -v /var/run/docker.sock:/tmp/docker.sock --restart=always gliderlabs/registrator:latest -ip=172.17.70.244 consul://172.17.70.243:8500
1
2
3
4
5
6
7
8
[root@Docker ~]# docker run -d --name=registrator --net=host --volume=/var/run/docker.sock:/tmp/docker.sock gliderlabs/registrator:latest consul://172.17.70.243:8500
[root@Docker ~]# docker logs registrator
[root@Docker ~]# docker run -it -d -p 88:80 nginx:1.16

[root@Docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
27bc99e5993e nginx:1.16 "nginx -g 'daemon of…" About a minute ago Up About a minute 0.0.0.0:88->80/tcp cranky_rosalind
deca47a38063 gliderlabs/registrator:latest "/bin/registrator co…" 3 minutes ago Up 3 minutes registrator

  1. 他会自动将本地的容器 注册到 consul中

安装 nginx

1
2
3
4
5
6
7
8
# 172.17.70.243  
# consul
# nginx
# consul-template 需要与nginx负载节点一起 本地配置文件生成 加载nginx

[root@Jenkins ~]# yum install nginx

# 修改配置文件 先把/etc/nginx/nginx.conf下的80监听注释掉

安装 consul-template

  1. 需要与nginx同一台机器
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@Jenkins opt]# unzip consul-template_0.19.3_linux_amd64.zip 
[root@Jenkins opt]# mv consul-template /usr/bin/

[root@Jenkins consul_nginx]# vim nginx.ctmpl

upstream http_backend {
# ip_hash;
{{range service "nginx"}}
server {{ .Address }}:{{ .Port }};
{{ end }}
}

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}


# {{range service "nginx"}} 获取 consul 下 nginx名字 循环获取IP地址和端口

生成配置文件 并 reload nginx

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
[root@Jenkins consul_nginx]# cd /opt/consul_nginx
[root@Jenkins consul_nginx]# consul-template -consul-addr 39.106.100.108:8500 -template "./nginx.ctmpl:/etc/nginx/conf.d/site.conf:nginx -s reload"

# 自定生成了配置文件 并加入了 docker的nginx地址

[root@Jenkins ~]# vim /etc/nginx/conf.d/site.conf

upstream http_backend {
# ip_hash;

server 172.17.70.243:88;

}

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}

# 再启动一个docker
[root@Docker ~]# docker run -it -d -p 89:80 nginx:1.16


# 查看配置文件是否自动添加
[root@Jenkins nginx]# cat /etc/nginx/conf.d/site.conf
upstream http_backend {
# ip_hash;

server 172.17.70.243:88;

server 172.17.70.243:89;

}

server {
listen 80;
server_name localhost;
location / {
proxy_pass http://http_backend;
}
}