yaml规则
docker-compose.yaml 核心
Reference documentation | Docker Documentation
# 3层
version: '' #版本
services: #服务
服务1:web
# 服务配置
images
build
network
....
服务2:redis
...
服务3:redis
#其他配置 网络/卷、全局规则
volumes:
networks:
configs:
此web项目依赖于redis 和postgres,所以启动的时候启动顺序很重要。
学习,要掌握规律!
1.官网文档
Compose file | Docker Documentation
2.开源项目 compose.yaml
开源项目
Quickstart: Compose and WordPress | Docker Documentation
博客
下载程序,安装数据库, 配置…
compose应用。=>一键启动
1.下载项目(docker-compose.yaml)
2.如果需要文件Dockerfile
3.文件准备齐全(直接一键启动项目)
前台启动
docker-d
后台启动
docker-compose up -d
[root@kuangshen home]# mkdir my_wordpress
[root@kuangshen home]# cd my_wordpress/
[root@kuangshen my_wordpress]# ll
total 0
[root@kuangshen my_wordpress]# vim docker-compose.yml
version: "3.9"
services:
db:
image: mysql:5.7
volumes:
- db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: somewordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}
[root@kuangshen my_wordpress]# docker-compose up
点击 安装文字新闻这个选项 ,然后安装成功后,登录就可以了
实战
1.创建spring项目
2.编写项目微服务
3.dockerfile构建镜像
4.docker-compose.yaml编排项目
5.丢到服务器中启动 docker-compose up
controller HelloController.java
package com.kuang.demo1.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class HelloController {
@Autowired
StringRedisTemplate redisTemplate;
@GetMapping("/hello")
public String hello(){
Long views = redisTemplate.opsForValue().increment("views");
return "hello, kuangshen, thank you, views:" + views;
}
}
application.properties
server.port=8080
spring.redis.host=redis
Dockerfile
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java", "-jar", "/app.jar"]
docker-compose.yml
version: '3.9'
services:
kuangapp:
build: .
image: kuangapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
打包
在Xftp7下创建一个文件"kuangapp"
小结:
未来项目只要有docker-compose 文件。按照这个规则,启动编排容器。
公司:有docker-compose文件, 直接启动
网上开源项目 :docker-compose 一键搞定
假设项目要重新部署打包
docker-compose up --build #重新构建
项目启动成功的页面:
总结:
工程、服务、容器
项目compose:三层
- 工程Project
- 服务
- 容器 运行实例! docker直接管理 k8s
Docker Swarm
集群
购买服务器
4台服务器 2G
点击下一步:
然后点击下一步
到此,服务器购买完毕! 1主 3 从
填写名称和主机号之后, 点击连接
重复上面的步骤 配置剩余的三个
4台机器安装Docker
和单机一样
技巧:xshell直接同步操作,省时间!
1.yum安装gcc相关环境(需要确保虚拟机可以上外网)
yum -y install gcc
yum -y install gcc-c++
#1.卸载旧的版本
yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine
# 2.需要的安装包
yum install -y yum-utils
# 3.设置镜像的仓库
yum-config-manager \
--add-repo \
https://download.docker.com/linux/centos/docker-ce.repo
# 建议安装阿里云
yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
#4更新yum软件包索引
yum makecache fast
# 5安装docker相关的内容 docker-ce 社区 ee企业版
yum install -y docker-ce docker-ce-cli containerd.io
#6 启动docker
systemctl start docker
#7.使用 docker version 查看是否安装成功
# 8 配置镜像加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": ["https://g6yrjrwf.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
工作模式
操作都在manager上
Raft一致性算法
搭建集群
初始化节点docker swarm init --advertise-addr
docker swarm join加入一个节点!
#获取令牌
docker swarm join-token manager #主节点令牌
docker swarm join-token worker
集群搭建完毕:
1.生成主节点
2.加入(管理者、 worker 两种角色)
Raft协议
双主双从:假设一个节点挂了, 其他节点是否可用?
Raft协议:保证大多数节点存活才可用。只要 >1 集群至少大于3台!
实验:
1.将docker1机停止,相当于宕机!双主,另外一个节点也不能用了
#停止的命令
systemctl stop docker
# 启动命令
systemctl start docker
# 离开集群
docker swarm leave
2.可用将其他节点离开
3.worker就是工作的,管理节点里面使用的命令worker使用不了,管理命令只能在管理节点里面操作。
三台机器设置为了管理节点:
把docker1停止之后,docker3,4都可以正常使用。
继续把docker3停止了, docker-4就使用不了了
集群要保证可用性, 必须有3个主节点。要有 > 1台管理节点存活!
Raft协议:保证大多数节点存活, 才可以使用,高可用!
体会
弹性 扩缩容 集群
docker-compose up !启动一个项目,单机
集群:swarm docker service
容器=> 服务
容器=> 服务 =>副本
体验:创建服务, 动态扩展服务,动态更新服务!
灰度发布,金丝雀发布:升级不影响使用。
docker run 容器启动! 不具有扩缩容器功能
docker service 服务!具有扩缩容器功能,滚动更新,灰度发布!
查看服务: REPLICAS 副本
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service create -p 8888:80 --name my-nginx nginx
ywksjagryj2n7mojxqeujyp9u
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service ps my-nginx # 查看服务
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
dezedmyjs0u8 my-nginx.1 nginx:latest iZ2vc9rba8rjfr8lqdfan7Z Running Running 2 minutes ago
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ywksjagryj2n my-nginx replicated 1/1 (只启动了一个副本) nginx:latest *:8888->80/tcp
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]#
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service inspect my-nginx
动态扩缩容:
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service update --replicas 3 my-nginx
my-nginx
overall progress: 3 out of 3 tasks
1/3: running [==================================================>]
2/3: running [==================================================>]
3/3: running [==================================================>]
verify: Service converged
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ywksjagryj2n my-nginx replicated 3/3 nginx:latest *:8888->80/tcp
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d5c3494b21c6 nginx:latest "/docker-entrypoint.…" About a minute ago Up About a minute 80/tcp my-nginx.3.jjqt8p1t5ry5bjz7e4l9tqkmc
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]#
就是设置的4台服务器都可以访问
设置了10个my-nginx 服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!
回滚到一个:
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service update --replicas 1 my-nginx
my-nginx
overall progress: 1 out of 1 tasks
1/1: running [==================================================>]
verify: Service converged
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]#
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service scale my-nginx=5
移除服务:
[root@iZ2vc9rba8rjfr8lqdfan9Z ~]# docker service rm my-nginx #移除服务
my-nginx
docker swarm 只要会搭建集群,会启动服务,动态管理容器就可以了!
概念总结
swarm
集群的管理和编号。docker可以初始化一个swarm集群,其他节点可以加入(管理,工作者)
Node
就是一个docker节点。多个节点就组成了一个网络集群。
Service
任务,可以在管理节点或者工作节点来运行。核心,用户访问!
Task
容器内的命令,细节任务。
命令->管理->api->调度->工作节点(创建Task容器维护创建)
服务副本与全局服务
调整service以什么方式运行
--mode string
Service mode (replicated or global) (default "replicated")
docker service create --mode replicated --name mytom tomcat:7 默认的
docker service create --mode global --name haha alpine ping baidu.com
#场景,日志收集
每一个节点都有自己的日志收集器,过滤。把所有的日志最终再传给日志中心
服务监控 状态性能
扩展:网络模式:“PublishMode”:“ingress”
Swarm:
Overlay:
ingress:特殊的Overlay网络!负载均衡的功能! IPVS VIP
虽然docker在4台机器上,实际上网络是一同一个!ingress网络,是一个特殊的Overly网络!