Docker Compose
简介
Docker
DockerFile build run 手动操作,单个容器!
微服务。100个微服务!依赖关系。
Docker Compose 来轻松高效的管理容器。定义运行多个容器!
官方介绍
定义、运行多个容器。
YAML file 配置文件
single command 命令有哪些
三步骤
- Dockerfile 保证我们的项目在任何地方可以运行。
- services
docker-compose.yml 这个文件怎么写! - docker-compose up 启动项目
作用:批量容器编排。
Compose 是Docker官方的开源项目。需要安装!
Dockerfile 让程序在任何地方运行。
docker-compose.yaml
version: "3.9" # optional since v1.27.0
services:
web:
build: .
ports:
- "5000:5000"
volumes:
- .:/code
- logvolume01:/var/log
links:
- redis
redis:
image: redis
volumes:
logvolume01: {}
Compose:重要的概念
- 服务service,容器。应用。(web、redis、mysql。。。)
- 项目project。一组关联的容器。博客。web、mysql
安装docker-compose
# -o 下载docker-compose 到本地
curl -L "https://get.daocloud.io/docker/compose/releases/download/1.28.5/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 不知道为什么上面那个有时候会报错,就用下面这个
curl -L "https://github.com/docker/compose/releases/download/1.23.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
# 授权,否则会报权限不够
chmod +x /usr/local/bin/docker-compose
# 出现版本则安装成功
docker-compose version
# 卸载docker-compose
# docker-compose卸载只需要删除二进制文件就可以了。
sudo rm /usr/local/bin/docker-compose
docker-compose命令
# 重启
docker-compose restart
# 日志
docker-compose logs -f 容器id/名称
体验
python应用。计数器。redis!
- 应用 app.py
- Dockerfile 应用打包为镜像(单机玩具!)
- docker-compose yaml文件(定义整个服务,需要的环境。web、redis)完整的上线服务!
- 启动 compose 项目(docker-compose up,停止是down,得再docker-compose.yml文件下输入命令)
就是四个文件
app.py
docker-compose.yml
Dockerfile
requirements.txt
内容在:
https://docs.docker.com/compose/gettingstarted/
流程:
- 创建网络
- 执行 Docker-compose yaml
- 启动服务
Docker compose yaml
Creating composetest_redis_1 ... done
Creating composetest_web_1 ... done
文件名定义规则
- 文件名 composetest
- 服务
- 1 就是集群中的第一个节点
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
redis:
image: "redis:alpine"
网络规则
一个项目中有10个服务,所有服务都在同个网络下。
"ConfigOnly": false,
"Containers": {
"ae9d28941ef9a6be84856341bae784d45bf5e1c9f2f1cbdbf89d406fc7a48215": {
"Name": "composetest_redis_1",
"EndpointID": "f113bba0f037b68f4a780684246dd531334bd24a23df3a851fd75d288fe8c697",
"MacAddress": "02:42:ac:14:00:03",
"IPv4Address": "172.20.0.3/16",
"IPv6Address": ""
},
"cd9727b5c5643c9af07c6296643684b904755e48b499c9ffb335a76506066cb5": {
"Name": "composetest_web_1",
"EndpointID": "59835d4adafaa0b682a8987fcb60f44957244a14edd093668a635929724d4253",
"MacAddress": "02:42:ac:14:00:02",
"IPv4Address": "172.20.0.2/16",
"IPv6Address": ""
}
如果在同一个网络下,我们能可以直接通过域名(name)访问。
以前都是单个 docker run 启动容器。
现在通过 docker-compose 编写yaml配置文件,可以通过compose一键启动所有服务,停止!
Docker小结:
- Docker镜像。run -> 容器
- DockerFile 构建镜像(服务打包)
- docker-compose 启动项目(编排、多个微服务/环境)
- Docker网络
yaml规则
# 三层!!!
version:'' # 版本,向下兼容
services: # 服务
服务1:web
# 服务配置(就是说这里可以配置docker容器的配置)
images
build
network
# docker容器并不能自动读取宿主机的hosts,所以需要配置
# 配置后需要停止容器,再启动才会读取到配置
extra_hosts:
- "www.baidu.com:11.0.9.1"
...
服务2:redis
# 其他配置 网络/卷、全局规则
volumes:
network:
configs:
depends_on 启动顺序
配置域名解析
extra_hosts:
- "somehost:162.242.195.82"
- "otherhost:50.31.209.229"
dns: 8.8.8.8
dns:
- 8.8.8.8
- 9.9.9.9
开源项目
实战
- 编写项目微服务
package com.example.demo.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 stringRedisTemplate;
@GetMapping("/hello")
public String hello(){
Long views = stringRedisTemplate.opsForValue().increment("views");
return "hello,kuangshen,thx,views" + views;
}
}
- Dockerfile 构建镜像
FROM java:8
COPY *.jar /app.jar
CMD ["--server.port=8080"]
EXPOSE 8080
ENTRYPOINT ["java","-jar","/app.jar"]
- docker-compose.yml 编排项目
version: '3.8'
services:
kuangapp:
build: . # .代表当前目录下的Dockerfile
image: kuangapp
depends_on:
- redis
ports:
- "8080:8080"
redis:
image: "library/redis:alpine"
- 丢到服务器,docker-compose up 启动
总结
工程、服务、容器
项目 compose:三层
- 工程 Project
- 服务 服务
- 容器 运行实例! docker k8s
todo docker和jenkins的知识点乱了些,有时间再整理吧
docker 与 Jenkins
随着云计算和容器化技术的兴起,Docker和Jenkins成为了现代软件开发和运维中不可或缺的工具。Docker提供了轻量级的容器化解决方案,而Jenkins则是一个功能强大的自动化服务器,可以集成到项目中实现持续集成和持续部署(CI/CD)。
一、Docker简介
Docker是一个开源的容器化平台,它允许开发者将应用程序及其依赖项打包到一个可移植的容器中,并在任何Docker支持的平台上运行。通过Docker,我们可以轻松实现应用程序的隔离、版本控制和自动化部署。
二、Jenkins简介
Jenkins是一个开源的自动化服务器,用于自动化各种任务,如构建、测试和部署软件。它提供了丰富的插件生态系统,可以轻松地与各种工具和平台集成。Jenkins可以定时触发构建任务,监控代码仓库的变化,并在检测到新代码提交时自动触发构建和部署流程。
三、Docker与Jenkins的结合
将Docker与Jenkins结合使用,可以实现项目的自动化打包和部署。具体步骤如下:
- 安装Docker和Jenkins
在服务器上安装Docker和Jenkins。确保Docker服务已启动并正常运行。
- 配置Jenkins
打开Jenkins界面,进行必要的配置,如设置管理员账号、安装插件等。
- 安装Docker插件
在Jenkins中安装Docker插件,该插件允许Jenkins与Docker进行交互,实现容器的创建、停止和管理等操作。
- 创建Jenkins任务
在Jenkins中创建一个新的构建任务,配置任务的相关参数,如源码管理、构建触发器、构建步骤等。
- 配置Docker构建步骤
在构建步骤中,添加Docker构建步骤。指定Dockerfile的位置,配置构建镜像的相关参数,如镜像名称、标签等。
- 配置Docker部署步骤
在构建步骤中,添加Docker部署步骤。配置目标Docker主机的信息,指定要部署的容器名称、端口映射等。
- 保存并触发构建
保存配置后,手动触发或等待Jenkins自动触发构建任务。Jenkins将自动拉取源码、构建镜像、部署容器,完成整个项目的打包和部署过程。
四、实际应用中的优势
通过Docker与Jenkins的结合,我们可以实现以下优势:
- 自动化部署:Jenkins可以自动触发构建和部署流程,减少人工干预,提高工作效率。
- 环境一致性:Docker容器提供了隔离的环境,确保应用程序在不同环境中的一致性。
- 快速回滚:如果部署出现问题,可以迅速回滚到之前的版本,减少故障对业务的影响。
- 持续集成与持续部署:通过Jenkins的持续集成和持续部署功能,可以实时监控代码仓库的变化,并在代码提交后自动构建和部署。
- 可视化监控:Jenkins提供了丰富的可视化界面,可以实时监控构建和部署的状态,方便问题排查和管理。
五、总结
Docker与Jenkins的结合为现代软件开发和运维带来了极大的便利。通过自动化打包和部署,我们可以提高工作效率,减少人工错误,并确保应用程序在不同环境中的一致性。在实际应用中,我们可以根据项目的需求进行灵活的配置和扩展,以满足不同的业务需求。
Docker Swarm 适合十台服务器以下,k8s适合十台以上,现在k8s用的多,所以下面的了解一下就可以,我自己也没觉得下面有多详细,
Docker Swarm
集群
购买服务器并安装docker
4台服务器 1核2G!
工作模式
- 管理节点之间可以相互通信
- 操作都在 manager(管理节点)
- Raft 一致性算法
搭建集群
swarm命令
- 生成主节点 init
- 加入(管理者、worker)
- 目标:双主双从
[root@iZ2ze7eg85rq92ilowwya5Z ~]# docker swarm --help
Usage: docker swarm COMMAND
Manage Swarm
Commands:
ca Display and rotate the root CA
init Initialize a swarm
join Join a swarm as a node and/or manager
join-token Manage join tokens
leave Leave the swarm
unlock Unlock swarm
unlock-key Manage the unlock key
update Update the swarm
私网、公网!
用私网的,不要钱,ip addr,eth0,172.22.80.249
# 初始化swarm节点
docker swarm init --advertise-addr 172.22.80.249
# 初始化节点后就会生成这个,在别的服务器上输入就可以加入该初始化节点
# docker swarm join --token SWMTKN-1-3o1dlg1iv4ritpj32lm0jhiy9lnwvjncdwzxcn82yur2y1p2ge-5fdhgkkqx6neglmevopfk9dtu 172.22.80.249:2377
# 加入一个节点
docker swarm join
# 获取令牌
docker swarm join-token manager
docker swarm join-token worker
# 主节点
[root@iZ2ze7eg85rq92ilowwya2Z ~]# docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
9lttrciqnitzalg6zd62nnen3 * iZ2ze7eg85rq92ilowwya2Z Ready Active Reachable 20.10.5
c0201mzwwyhir4zn2spdrxlsc iZ2ze7eg85rq92ilowwya3Z Ready Active 20.10.5
hx2x19h34lz1bolne0vbn8sjc iZ2ze7eg85rq92ilowwya4Z Ready Active 20.10.5
vxdbials4mo4qgyhnkiysxzc4 iZ2ze7eg85rq92ilowwya5Z Ready Active Leader 20.10.5
Raft协议
双主双从:假设一个节点挂了!其他节点是否可用!
Raft协议:保证大多数节点存活才可以用。只要>1,集群至少大于3台。
实验:
- 将docker1机器停止。宕机!双主,另外一个主节点也不能使用了!
- 将其他非主节点离开集群
# 节点离开集群
docker swarm leave
- worker就是工作的,管理节点操作!3台机器设置为了管理节点
# 在管理节点输入命令
docker swarm join-token manager
十分简单:集群,可用!3个主节点。>1台管理节点存活!
Raft协议:保证大多数节点存货,才可以使用 ,高可用!
体会
弹性、扩缩容!集群!
以后告别 docker run!
docker-compose up! 启动一个项目。单机!
集群:swarm docker service
容器 => 服务
容器 => 服务 => 副本
redis服务 => 10个副本!(同时开启10个redis容器)
docker service 命令
体验:创建服务、动态扩展服务、动态更新服务。
[root@iZ2ze7eg85rq92ilowwya5Z ~]# docker service --help
Usage: docker service COMMAND
Manage services
Commands:
create Create a new service
inspect Display detailed information on one or more services
logs Fetch the logs of a service or task
ls List services
ps List the tasks of one or more services
rm Remove one or more services
rollback Revert changes to a service's configuration
scale Scale one or multiple replicated services
update Update a service
灰度发布:金丝雀发布!(发布不会影响网站的运行)
动态扩缩容
# 容器启动!不具有扩缩容器
docker run
# 服务!具有扩缩容器,滚动更新!
docker service
# 查看服务
docker service ps 服务名
# 查看节点
docker service ls
# 动态扩缩容
# 添加三个nginx服务到集群,是一共3个不是添加3个
# 此时会把3个服务分配到不同的服务器,但有一个服务器不会有nginx服务
# 但依然可以对nginx进行访问
# 如果此时,想要动态回滚到两个节点,只需要把以下命令改为2
docker service update --replicas 3 mynginx
# 和上面命令是一样的
docker service scale mynginx=5
# 删除服务
docker service rm mynginx
服务,集群中任意的节点都可以访问。服务可以有多个副本动态扩缩容实现高可用!
docker swarm 其实并不难
只要会搭集群、会启动服务、动态管理容器就可以了!
概念总结
- swarm
集群的管理和编排。docker可以初始化一个 swarm 集群,其他节点可以加入。(管理、工作者) - node
就是一个docker节点。多个节点就组成了一个网络集群。 - service
任务,可以在管理节点或者工作节点来运行。核心。 - Task
容器内的命令,细节任务!
张嘉佳