docker高级篇-docker-compose容器编排介绍及实战
source link: https://blog.51cto.com/kaigejava/5979129
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
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/
安装步骤:
2:给目录赋权限
3:查看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容器:
启动redis容器:
/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 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文件
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已经存在了。创建表:
`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=''
通过页面访问用户的新增和根据用户id获取。
一切正常。OK
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学习系列教程」9-Docker容器数据卷介绍
「Docker学习系列教程」10-Docker容器数据卷案例
Docker学习11-Docker常规方式安装软件
「Docker学习系列教程」基础篇小总结及高级篇预告
docker高级篇1-dockeran安装mysql主从复制
docker高级篇第二章-分布式存储之实战案例:3主3从redis集群扩容配置
docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例
Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?
docker高级篇第三章-dockerfile案例之制作自己的centos镜像
docker高级篇:实战-自己开发的微服务怎么在docker上面运行?
【Docker学习教程系列汇总】笔记及遇到问题解决文章
大家好,我是凯哥Java(kaigejava),乐于分享,每日更新技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK