4

docker高级篇-docker-compose容器编排介绍及实战

 1 year ago
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高级篇-docker-compose容器编排介绍及实战_docker

Docker-compose是Docker官方推出 的一个工具软件,可以管理多个Docker容器组成的一个应用。你需要编写一个一个YAML格式的配置文件:docker-compose.yml。写好多个容器之间的调用关系。然后,只需要一个命令,就能同时启动/关闭这些容器了。

怎么理解:

docker高级篇-docker-compose容器编排介绍及实战_mysql_02

docker建议我们每一个容器只运行一个服务,因为docker容器本身占用资源极少,所以最好是将每一个服务单独地分割,但是这样,我们面临了一个问题:

docker高级篇-docker-compose容器编排介绍及实战_Docker_03

官方地址:

 ​https://docs.docker.com/compose/compose-file/compose-file-v3/​

官方下载:

 ​https://docs.docker.com/compose/install/​

安装步骤:

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文件中定义

docker高级篇-docker-compose容器编排介绍及实战_docker_04

compose使用的三个步骤

1:编写Dockerfile定义各个微服务应用并构建出对应的镜像文件

2:使用docker-compose.yml定义一个完整业务单元,安排好整个应用中的各个容器服务

3:最后 ,执行docker-compose up命令,来启动并运行整个应用程序,完成部署上线

compose常用命令

docker高级篇-docker-compose容器编排介绍及实战_mysql_05

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

docker高级篇-docker-compose容器编排介绍及实战_mysql_06

启动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

docker高级篇-docker-compose容器编排介绍及实战_mysql_07

本地编写完用户微服务后,mvn package后,上传的docker的宿主机后,构建镜像:

docker build -t order:1.0.2 

docker高级篇-docker-compose容器编排介绍及实战_docker_08

启动镜像:

docker run -d -p 6001:6001 be1face5d825

docker高级篇-docker-compose容器编排介绍及实战_docker_09

docker ps查看是否启动成功:

docker高级篇-docker-compose容器编排介绍及实战_Docker_10

发现三个服务都启动了。

所以我们可以得到如下对比:

docker高级篇-docker-compose容器编排介绍及实战_mysql_11

启动后,swagger测试:

访问swagger-ui:宿主机id:端口/swagger-ui.html#

 ​http://192.168.50.131:6001/swagger-ui.html#​

docker高级篇-docker-compose容器编排介绍及实战_Docker_12

访问正常。从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相关配置

命令转化:

docker高级篇-docker-compose容器编排介绍及实战_Docker_13

同理redis和mysql也是一样的。

networks:   kaigejava_net: 这个相当于是:docker network create kaigejava_net

2:修改微服务工程中mysql和redis连接的ip.将ip修改成服务名称

docker高级篇-docker-compose容器编排介绍及实战_mysql_14

更新微服务配置文件后,重新packer。然后上传到docker宿主机后,重新生成镜像:

docker build -t order:1.0.2 . 

3:执行docker-compose up或者执行docker-compose up -d

注意:执行命令的时候,最好在docker-compose.yml文件目录

docker高级篇-docker-compose容器编排介绍及实战_mysql_15

我们可以看到mysql\redis\ms01都done了。

注意到了吗?order微服务我们给contener的名字设置了ms01.redis和mysql没有设置容器名称。可以看到会自动以当前文件夹名称为前缀,追加mysql前面

验证是否真的成了。

1:验证网络是否添加了kaigejava_net

docker network ls

docker高级篇-docker-compose容器编排介绍及实战_Docker_16

使用docker ps命令查看:

docker高级篇-docker-compose容器编排介绍及实战_mysql_17

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=''

通过页面访问用户的新增和根据用户id获取。

一切正常。OK

docker-compose stop

docker高级篇-docker-compose容器编排介绍及实战_Docker_18

一键停服务。

docker高级篇-docker-compose容器编排介绍及实战_Docker_19

如操作有问题欢迎去 我的 ​ ​个人博客(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高级篇2-分布式存储之三种算法​

 ​docker高级篇第二章-分布式存储之实战案例:3主3从redis集群扩容配置​

 ​docker高级篇第二章-分布式存储之实战案例:主从容错切换迁移案例​

 ​Docker高级:Redis集群实战!4主4从缩容到3主3从,怎么处理?​

 ​Dockerfile介绍及常用保留指令​

 ​docker高级篇第三章-dockerfile案例之制作自己的centos镜像​

 ​docker的虚悬镜像是什么?​

 ​docker高级篇:实战-自己开发的微服务怎么在docker上面运行?​

 ​Docker网络中篇-docker网络的四种类型​

 ​【Docker学习教程系列汇总】笔记及遇到问题解决文章​

大家好,我是凯哥Java(kaigejava),乐于分享,每日更新技术文章,欢迎大家关注“凯哥Java”,及时了解更多。让我们一起学Java。也欢迎大家有事没事就来和凯哥聊聊~~~


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK