docker高级篇-docker-compose容器编排介绍及实战
Docker-compose是什么?能干嘛?解决了哪些痛点?
是什么?
Docker-compose是Docker官方推出 的一个工具软件,可以管理多个Docker容器组成的一个应用。你需要编写一个一个YAML格式的配置文件:docker-compose.yml。写好多个容器之间的调用关系。然后,只需要一个命令,就能同时启动/关闭这些容器了。
怎么理解:
能干嘛?
docker建议我们每一个容器只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每一个服务单独地分割,但是这样,我们面临了一个问题:
去哪下?
官方地址:
https://docs.docker.com/compose/compose-file/compose-file-v3/
官方下载:
https://docs.docker.com/compose/install/
安装步骤:
1:下载
curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
2:给目录赋权限
chmod +x /usr/local/bin/docker-compose
3:查看compose的版本号
docker-compose --version
卸载步骤:
rm /usr/local/bin/docker-compose
compose核心概念
一个文件,两个要素:
一个文件:docker-compose.yml
两个要素:
服务*(service):一个个应用容器实例,比如订单服务、库存服务、mysql容器、nginx容器等
工程(project):由一组关联的应用容器组成一个完整的业务单元,在docker-compose.yml文件中定义
compose使用的三个步骤
1:编写Dockerfile定义各个微服务应用并构建出对应的镜像文件
2:使用docker-compose.yml定义一个完整业务单元,安排好整个应用中的各个容器服务
3:最后 ,执行docker-compose up命令,来启动并运行整个应用程序,完成部署上线
compose常用命令
compose编排微服务
需求描述:
user服务,增删改查。查询的时候,如果缓存中,没有就去数据库中查询。
注意:数据库使用docker中mysql的,redis也使用docker里面的。
我们不使用docker-compose情况下:
启动mysql容器:
docker run -d -p 3306:3306 --privileged=true -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -e MYSQL_ROOT_PASSWORD=123456 --name mysql57 mysql:5.7
启动redis容器:
docker run -p 6379:6379 --name reids608 --privileged=true -v /app/redis/redis.conf:/etc/redis/redis.conf -v /app
/redis/data:/data -d redis:6.0.8 redis-server /etc/redis/redis.conf
本地编写完用户微服务后,mvn package后,上传的docker的宿主机后,构建镜像:
docker build -t order:1.0.2
启动镜像:
docker run -d -p 6001:6001 be1face5d825
docker ps查看是否启动成功:
发现三个服务都启动了。
所以我们可以得到如下对比:
启动后,swagger测试:
访问swagger-ui:宿主机id:端口/swagger-ui.html#
http://192.168.50.131:6001/swagger-ui.html#
访问正常。从swagger新建用户,然后从数据库和redis中都可以查询到。
虽然上面来看,是没问题了。那么这种没有使用compose会有哪些问题呢?
问题如下:
1:先后启动顺序要求固定的,先mysql+redis,然后才是微服务镜像,启动微服务,访问成功
2:多个run命令。。。。
3:容器间的停机或宕机,有可能导致ip地址对应的容器实例变化,映射出问题。要么生产ip写死(虽然可以,但是不推荐),要么通过服务调用。
当很多微服务的时候,那就疯了。所以,我们引入docker-compose文件统一管理起来。
使用docker-compose文件实战
使用docker-composy.yml服务编排,一套带走。
步骤:
1:编写docker-compose.yml文件
version: "3"
services:
microService:
image: order:1.0.2
container_name: ms01
ports:
- "6001:6001"
volumes:
- /app/microService:/data
networks:
- kaigejava_net
depends_on:
- redis
- mysql
redis:
image: redis:6.0.8
ports:
- "6379:6379"
volumes:
- /app/redis/redis.conf:/etc/redis/redis.conf
- /app/redis/data:/data
networks:
- kaigejava_net
command: redis-server /etc/redis/redis.conf
mysql:
image: mysql:5.7
environment:
MYSQL_ROOT_PASSWORD: '123456'
MYSQL_ALLOW_EMPTY_PASSWORD: 'no'
MYSQL_DATABASE: 'db2021'
MYSQL_USER: 'kaigejava'
MYSQL_PASSWORD: 'kaigejava123'
ports:
- "3306:3306"
volumes:
- /app/mysql/db:/var/lib/mysql
- /app/mysql/conf/my.cnf:/etc/my.cnf
- /app/mysql/init:/docker-entrypoint-initdb.d
networks:
- kaigejava_net
command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks:
kaigejava_net:
文件详解:
version:xanzai都用3版本
services:服务
image:image的名字:TAG版本
container_name:容器名称
ports:端口映射
volumes:数据卷挂载地址
networks:网络名称
depends_on:依赖于redis 和mysql
redis:redis相关配置
mysql:mysql相关配置
命令转化:
同理redis和mysql也是一样的。
networks: kaigejava_net: 这个相当于是:docker network create kaigejava_net
2:修改微服务工程中mysql和redis连接的ip.将ip修改成服务名称
更新微服务配置文件后,重新packer。然后上传到docker宿主机后,重新生成镜像:
docker build -t order:1.0.2 .
3:执行docker-compose up或者执行docker-compose up -d
注意:执行命令的时候,最好在docker-compose.yml文件目录
我们可以看到mysql\redis\ms01都done了。
注意到了吗?order微服务我们给contener的名字设置了ms01.redis和mysql没有设置容器名称。可以看到会自动以当前文件夹名称为前缀,追加mysql前面
验证是否真的成了。
1:验证网络是否添加了kaigejava_net
docker network ls
使用docker ps命令查看:
mysql、redis、微服务都正常启动了。
4:进入mysql容器实例并创建数据库db2021+新表t_user
使用mysql客户端连接到mysql中,发现数据库db2021已经存在了。创建表:
CREATE TABLE `t_user` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` varchar(50) NOT NULL DEFAULT '' COMMENT '',
`password` varchar(50) NOT NULL DEFAULT '' COMMENT '',
`sex` tinyint(4) NOT NULL DEFAULT '0' COMMENT '0=1=',
`deleted` tinyint(4) unsigned NOT NULL DEFAULT '0' COMMENT '01',
`update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '',
`create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '',
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT=''
5:测试
通过页面访问用户的新增和根据用户id获取。
一切正常。OK
6:关停
docker-compose stop
一键停服务。
结束语
如操作有问题欢迎去 我的 个人博客(www.kaigejava.com)留言或者 微信公众号(凯哥Java)留言交流哦。
本系列教程直通车
直通车,本系列教程已发布文章,快速到达,《Docker学习系列》教程已经发布的内容如下:
【图文教程】Windows11下安装Docker Desktop
【填坑】在windows系统下安装Docker Desktop后迁移镜像位置
【Docker学习系列】Docker学习1-docker安装
【Docker学习系列】Docker学习2-docker设置镜像加速器
【Docker学习系列】Docker学习3-docker的run命令干了什么?docker为什么比虚拟机快?
【Docker学习系列】Docker学习2-常用命令之启动命令和镜像命令
【Docker学习系列】Docker学习系列3:常用命令之容器命令
【Docker学习系列】Docker学习4-常用命令之重要的容器命令
【Docker教程系列】Docker学习5-Docker镜像理解
【Docker教程系列】Docker学习6-Docker镜像commit操作案例
【Docker学习教程系列】7-如何将本地的Docker镜像发布到阿里云
【Docker学习教程系列】8-如何将本地的Docker镜像发布到公司镜像服务器上?
「Docker学习系列教程」10-Docker容器数据卷案例
docker高级篇1-dockeran安装mysql主从复制
docker高级篇第二章-分布式存储之实战案例:3主3从redis集群扩容配置
docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例
Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?
docker高级篇第三章-dockerfile案例之制作自己的centos镜像
docker高级篇:实战-自己开发的微服务怎么在docker上面运行?
小福利:【凯哥优惠淘】
凯哥自己开发的,领取外卖、打车、咖啡、买菜、各大电商的优惠券的公¥众¥号【凯哥优惠淘】。如下图:
大家好,我是凯哥Java(kaigejava),乐于分享,每日更新技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~
docker高级篇-docker-compose容器编排介绍及实战的更多相关文章
- AspNetCore容器化(Docker)部署(三) —— Docker Compose容器编排
一.前言 上一篇部署了一个最基础的helloworld应用,创建了两个容器和一个network,还算应付得过来. 如果该应用继续引入mysql.redis.job等若干服务,到时候发布一次得工作量之大 ...
- Docker应用:Docker-compose(容器编排)
阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) 前言: 昨天完成了Docker入门示例(Docker应用:Hello World),示 ...
- Win10上的Docker应用:Docker-compose(容器编排)
阅读目录: Docker应用:Hello World Docker应用:Docker-compose(容器编排) 前言: 昨天完成了Docker入门示例(Docker应用:Hello World),示 ...
- Docker | 第七章:Docker Compose服务编排介绍及使用
前言 前面章节,我们学习了如何构建自己的镜像文件,如何保存自己的镜像文件.大多都是一个镜像启动.当一个系统需要多个子系统进行配合时,若每个子系统也就是镜像需要一个个手动启动和停止的话,那估计实施人员也 ...
- Docker Compose 容器编排 NET Core 6+MySQL 8+Nginx + Redis
环境: CentOS 8.5.2111Docker 20.10.10Docker-Compose 2.1.0 服务: db redis web nginx NET Core 6+MySQL 8+N ...
- Docker+etcd+flanneld+kubernets 构建容器编排系统(1)
Docker: Docker Engine, 一个client-server 结构的应用, 包含Docker daemon,一个 用来和daemon 交互的REST API, 一个命令行应用CLI. ...
- docker第二篇 Docker基础用法
Docker中的容器 lxc -> libcontainer -> runC OCI (Open Container Initiative) 由Linux基金会主导于2015年6月创立 作 ...
- Docker Compose容器编排
Compose是Docker官方的开源项目,可以实现对Docker容器集群的快速编排.Compose 中有两个重要的概念:服务(service):一个应用的容器,实际上可以包括若干运行相同镜像的容器实 ...
- Docker Compose 容器编排
1. 前言 Docker Compose 是 Docker 容器进行编排的工具,定义和运行多容器的应用,可以一条命令启动多个容器. 使用Compose 基本上分为三步: Dockerfile 定义应用 ...
- 物联网架构成长之路(24)-Docker练习之Compose容器编排
0.前言 一开始学的之后,是想一步到位直接上Kubernetes(K8s)的,后面没想到,好像有点复杂,有些概念不是很懂.因此学习东西还是要循序渐进,慢慢来.先了解单机编排技术Docker Compo ...
随机推荐
- 结合RNN与Transformer双重优点,深度解析大语言模型RWKV
本文分享自华为云社区<[云驻共创]昇思MindSpore技术公开课 RWKV 模型架构深度解析>,作者:Freedom123. 一.前言 Transformer模型作为一种革命性的神经网络 ...
- 尝试官方的第一个SpringNative 0.11程序(WSL2)
Spring Native是Spring推出微服务体系Spring Cloud之后的又一大举动,从名字可以猜出,Spring Native是一门面向云原生的技术.如果你还对这个概念不太理解,可以多看一 ...
- Mysql 分表分库的策略
为什么要分表? 当一张的数据达到几百万时,你查询一次所花的时间会变多,如果有联合查询的话,有可能会死在那儿了. 分表的目的就在于此,减小数据库的负担,缩短查询时间. 日常开发中我们经常会遇到大表的情况 ...
- WOE编码与IV值
参考: WOE与IV值浅谈 机器学习-变量筛选之IV值和WOE 0. Introduction WOE (weight of evidence): 证据权重 IV (information value ...
- 新一代云原生日志架构 - Loggie的设计与实践
Loggie萌芽于网易严选业务的实际需求,成长于严选与数帆的长期共建,持续发展于网易数帆与网易传媒.中国工商银行的紧密协作.广泛的生态,使得项目能够基于业务需求不断完善.成熟.目前已经开源:https ...
- TypeScript 学习笔记 — 类型补充void,any, tuple ,enum,nerver, Symbol , BigInt ,unknown(三)
目录 空值void 及(与Null 和 Undefined的区别) 任意值Any 元组类型 枚举类型 常量枚举 never 类型 1. 函数无法到达终点 2.通常校验逻辑的完整性,可以利用 never ...
- C#从6.0~9.0都更新了什么?
一.C#6中新增的功能 get 只读属性 简洁的语法来创建不可变类型,仅有get访问器: public string FirstName { get; } public string LastName ...
- iOS开发基础135-Core Data
Objective-C (OC) 中使用 Core Data 是iOS应用开发中管理模型层对象的一种有效工具.Core Data 使用 ORM (对象关系映射) 技术来抽象化和管理数据.这不仅可以节省 ...
- StringBuilder,一种可变的string
StringBuilder 是 Java 中用于操作字符串的可变对象.它允许在字符串中进行修改.添加.删除字符等操作,而不会像普通的字符串操作(例如使用 String 类)那样产生新的字符串对象.这种 ...
- [香橙派开发系列]使用wiringPi控制26个引脚
目录 前言 一.香橙派使用的包 二.使用wiringPi包的命令 1.下载wiringOP 2.gpio readall信息分析 3.设置gpio的模式 4.设置gpio输出的电平 三.wiringP ...