docker编配和服务发现

参考:https://blog.csdn.net/tpmamba/article/details/78292448
主要包括三个领域:
compose:容器编配,。在多个宿主机,每宿主机多个容器,每容器多个应用的场景下,实现自动配置、协作和管理应用。
consul:分布式服务发现
swarm:docker的编排和集群

7.1 docker compose
1 compose安装
mac通过pip安装的实例如下 
wget https://bootstrap.pypa.io/get-pip.py –no-check-certificate
sudo python get-pip.py
验证docker compose是否安装成功:
docker-compose --version

2 构建python flask镜像
需要两个容器:1)应用容器  2)Redis容器
mkdir composeapp
cd composeapp
获取应用程序源代码:wget https://www.dockerbook.com/code/7/composeapp/app.py
注:Flask追踪保存在Redis里的计数器。(每次访问根路径/时,计数器会自增。)
获取requirements.txt保存应用程序的依赖关系:wget https://www.dockerbook.com/code/7/composeapp/requirements.txt
获取Dockerfile:wget https://www.dockerbook.com/code/7/composeapp/Dockerfile
构建flask应用的镜像: docker build -t jamtur01/composeapp .

3 docker-compose.yml文件
compose的配置文件,即通过yml文件定义一组要启动的服务,并且定义这些服务启动
wget https://www.dockerbook.com/code/7/composeapp/docker-compose.yml
内容如下:
version: '3'
services:
  web:
    image: jamtur01/composeapp
    command: python app.py
    ports:
     - "5000:5000"
    volumes:
     - .:/composeapp
  redis:
    image: redis

image:指定了要使用的镜像。
command:自定服务启动时执行的命令
ports:指定服务要映射到的端口
volumes:指定卷

4 运行compose
docker-compose up
从输出内容可以看到,创建了两个新的服务(即容器),composeapp_redis_1和composeapp_web_1,
容器名字规则:目录名+服务名+数组。然后输出的是两个服务的日志。

效果:访问http://localhost:5000/ 可以看到结果

使用 ctrl+c退出上面的日志

5 docker-compose的基础命令
docker-compose up -d 以后台进程的方式打开
docker-compose down
docker-compose ps 查看服务的运行状态
docker-compose logs 查看服务的日志
docker-compose stop 关闭正在运行的服务
docker-compose kill 强制关闭正在运行的服务
docker-compose start 启动服务
docker-compose rm 删除服务
docker-compose up和start 
up是重新加载yml配置文件,start是仅仅重新启动服务,所以改动了docker-compose.yml里的内容,则必须down之后再up
docker-compose down和stop
down = stop + rm两个操作,更加彻底。


7.2 consul的介绍和使用
服务发现的一种实现:允许某个组件想要与别的组件交互时,能自动找到对方。
由于应用本身是分布式的,服务发现机制也需要是分布式的,且足够动态、可靠,可以快速且一直的共享服务的数据。

consul使用raft一致性算法,暴露键值存储和服务分类系统,提供高可用性、高容错能力,并保证强一致性。

1 构建Consul镜像
mkdir consul
cd consul
获取Dockerfile:wget https://www.dockerbook.com/code/7/consul/Dockerfile
consul会使用到一些端口:
53/udb dns服务器
8500 提供http api和网页界面
8400 rpc接入点
8300 服务器rpc
8301+udp serf的lan端口
8302+udp serf的wan端口

获取consul配置文件:wget https://www.dockerbook.com/code/7/consul/consul.json
docker build -t jamtur01/consul .

2 执行一个本地Consul节点
docker run -p 8500:8500 -p 53:53/udp -h node1 jamtur01/consul -server -bootstrap
-h:指定了容器的主机名为node1,也是consul节点的名字
-server 告诉consul代理以服武器的模式运行
-bootstrap 告诉consul本节点可以自选举为集群领导者

3 使用docker运行consul集群
另外找一些宿主机分别执行如下操作
1)拉取consul镜像,执行:docker pull jamtur01/consul
2)每台宿主机获取公共IP地址,并设置给环境变量
一般linux机器:
PUBLIC_IP="$(ifconfig eth0 | grep "inet " | awk '{ print $2}')"
echo $PUBLIC_IP

mac机器 
PUBLIC_IP="$(ifconfig en0 | grep "inet " | awk '{ print $2}')"
echo $PUBLIC_IP

mac:10.7.84.137
test1:172.16.1.155
test2:172.16.1.10

启动其中的mac为自启动的主机,来启动整个集群。所以需要将mac的ip告诉test1和test2,让其知道要连接到consul集群的哪个节点。
在test1和test2中增加mac的ip为环境变量JOIN_IP,分别执行如下内容:
JOIN_IP=10.7.84.137
echo $JOIN_IP

为了更易使用consul,修改每台宿主机上docker守护进程的网络配置。主要修改docker守护进程的dns查找设置,包括:
1)本地docker的IP地址,以便使用consul来解析DNS
2)google的dns地址,解析其他请求
3)为consul查询指定搜索域

在宿主机上分别执行如下操作:
获取docker0的IP地址:
ip addr show docker0
修改/etc/default/docker文件中的docket启动配置,将
DOCKER_OPTS="--dns 8.8.8.8 --dns 8.8.4.4" 修改为:
DOCKER_OPTS='--dns 172... --dns 8.8.8.8 --dns-search service.consul'

然后再每台宿主机上重启docker守护进程
service docker restart


启动具有自启动功能的consul节点:mac
docker run -d -h $HOSTNAME \
-p 8300:8300 -p 8301:8301 \
-p 8301:8301/udp -p 8302:8302 \
-p 8302:8302/udp -p 8400:8400 \
-p 8500:8500 -p 53:53/udp \
--name mac_agent jamtur01/consul \
-server -advertise $PUBLIC_IP -bootstrap-expect=3
参数说明:
-server 运行在服务器模式
-advertise 告诉代通过$PUBLIC_IP指定的IP广播自己
-booststrap-expect 告诉consul集群中的代理个数

docker logs larry_agent用来查看对应的日志


现在集群已经启动好了,将剩下的test1和test2节点加入
test1执行如下命令:
docker run -d -h $HOSTNAME \
-p 8300:8300 -p 8301:8301 \
-p 8301:8301/udp -p 8302:8302 \
-p 8302:8302/udp -p 8400:8400 \
-p 8500:8500 -p 53:53/udp \
--name test1_agent jamtur01/consul \
-server -advertise $PUBLIC_IP -join $JOIN_IP
-join含义:告诉consul要连接由环境变量$JOIN_IP指定的mac主机的IP所在的consul集群

test2
docker run -d -h $HOSTNAME \
-p 8300:8300 -p 8301:8301 \
-p 8301:8301/udp -p 8302:8302 \
-p 8302:8302/udp -p 8400:8400 \
-p 8500:8500 -p 53:53/udp \
--name test2_agent jamtur01/consul \
-server -advertise $PUBLIC_IP -join $JOIN_IP
说明:除了名称为test2_agent,其余与test1无差别


7.3 docker swarm
原生的docker集群管理工具,将多台docker主机作为一个集群,并在集群级别上以标准的docker api提供服务,非常强大。

安装swarm
在joker和smoker两台机器上安装,分别执行如下内容:
拉取swarm镜像 
docker pull swarm

创建swarm集群
要求集群中的每台主机都运行一个swarm节点作为代理,该代理负责将其所在主机上的相关docker守护进程注册到集群中。
和节点代理相对的是swarm管理者,管理集群。

默认通过docker hub实现集群注册和发现,原理如下:
用户在docker hub中注册一个集群,然后返回一个集群ID,之后可以使用该集群id向集群添加额外的节点。

1 创建swarm集群:
在smoker主机上
docker run --rm swarm create
返回了集群的ID,记录该字符串,后面需要使用:2dsdjbsdi99999s88

2 运行swarm代理
在smoker上
docker run -d swarm join --addr=10.0.0.125:2375 token://2dsdjbsdi99999s88
在joker上运行swarm代理
docker run -d swarm join --addr=10.0.0.135:2375 token://2dsdjbsdi99999s88
--addr:后面加的是本机的IP地址 
token后面加的是swarm集群的Id
join:每个代理都会绑定到它们所在主机的IP地址上,每个代理都会加入swarm集群中。

docker logs  swarm代理的id
查看代理容器的日志,了解代理是如何工作的。从日志中可以看出:
代理每隔25秒就会向发现服务进行注册,即告诉docker hub该代理可用,该docker服务器也可以被使用。


docker run -rm swarm list token://2dsdjbsdi99999s88
运行swarm镜像,并指定list标志和集群token,会返回集群中所有节点的列表。
10.0.0.125:2375
10.0.0.135:2375


3)创建了一个新容器运行集群管理者
docker run -d -p 2380:2375 swarm manage token://2dsdjbsdi99999s88
同时将宿主机的2380端口映射到dcoker的标准端口2375,现在就可以使用2380端口和docker集群进行交互了。如:
docker -H tcp://localhost:2380 info
此时会输出所有节点的信息,包括节点IP、每个节点有多少容器,以及cpu和内存等信息
通过-H选项为客户端指定了tcp://localhost:2380地址

通过shell创建6个nginx容器,代码如下:
for i in `seq 1 6`;
do docker -H tcp://localhost:2380 run - d --name www-$i -p 80 nginx;
done
即:创建6个nginx容器:均是以后台方式启动,名称是www-$i,并打开80端口。

docker -H tcp://localhost:2380 ps
上面的指令不是在本地docker进程中运行的,是跨swarm集群运行的。

通过上面的结果可以看到,6个容器均匀分布在三个宿主机上。那么swarm怎么决定每个容器在哪个节点上运行的呢?
过滤器 + 策略

过滤器:
约束过滤器
依赖于用户在启动docker守护进程时给各个节点设置的标签。如:
docke daemon --label datacenter=us-eastl
如果想在设置了上面标签的docker守护进程中启动,可以使用如:
docker -H tcp://localhost:2380 run -e constraint:datacenter==us-estal -d --name www-use1 -p 80 nginx
通过-e选定

亲和过滤器
如在www-use1所在swarm节点上启动一个容器:
docker run -d --name www-use2 -e affinity:container==www-use1 nginx

依赖过滤器
在具备指定卷或容器连接的点上启动容器

端口过滤器
在指定端口可用的节点上启动容器
如:docke  -H tcp://localhost:2380 run -d --name haproxy -p 80:80 haproxy

健康过滤器


策略
允许用户一更加隐式的特性来调度容器。如在cpu或内存等资源充足的节点上启动容器。
具体策略如下:
平铺策略:各个节点上容器个数比较均衡
紧凑策略:先保证某节点被最大程度的使用,避免碎片化。
随机策略:随机分布

第8章docker api
https://www.missshi.cn/api/view/blog/5a63285f0a745f6335000008 -原创

在Docker的生态系统中,存在下列三种API:
Reistry API:与存储Docker镜像的Registry相关的功能。
Docker Hub API:与Docker Hub相关的功能
Docker Remote API:与Docker守护进程相关的功能。
其中,Docker Remote API是使用最为频繁的API类型,后续我们也将针对此类API展开讲解

启动Remote API
Remote API:用于远程访问Docker守护进程从而下达指令的。
因此,我们在启动Docker守护进程时,需要添加-H参数并指定开启的访问端口。
通常,我们可以通过编辑守护进程的配置文件来实现。
不过对于不同操作系统而言,守护进程启动的配置文件也不尽相同。

执行:lsb_release -a 或 cat /etc/redhat-release获取系统类别。
参考:https://blog.csdn.net/dafei4/article/details/79589369

Ubuntu系统:/etc/default/docker文件
Centos系统:/etc/sysconfig/docker文件
在该配置文件最后,添加内容如下:
OPTIONS='-H=tcp://0.0.0.0:2375 -H unix:///var/run/docker.sock'

修改完成后执行如下命令,重启Docker守护进程:
systemctl stop docker
systemctl start docker

其他机器上执行如下命令来测试一下:
docker -H example.com:2375 info

 


为什么有了Compose和Swarm,还会有Kubernetes的出现?
https://www.cnblogs.com/chenqionghe/p/11474486.html
 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值