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

Docker-compose是什么?能干嘛?解决了哪些痛点?

8307b59a65c92ea1846331f1d05ef558.png

是什么?

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

怎么理解:

image.png

能干嘛?

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

image.png

去哪下?

官方地址:

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

官方下载:

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

安装步骤:

1:下载

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-(uname -s)-(uname -m)" -o /usr/local/bin/docker-compose
</pre>

2:给目录赋权限

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">chmod +x /usr/local/bin/docker-compose
</pre>

3:查看compose的版本号

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">docker-compose --version
</pre>

卸载步骤:

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">rm /usr/local/bin/docker-compose
</pre>

compose核心概念

一个文件,两个要素:

一个文件:docker-compose.yml

两个要素:

服务*(service):一个个应用容器实例,比如订单服务、库存服务、mysql容器、nginx容器等

工程(project):由一组关联的应用容器组成一个完整的业务单元,在docker-compose.yml文件中定义

image.png

compose使用的三个步骤

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

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

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

compose常用命令
b794ecb40b2f09cd949f7d1d2936eea2.png

compose编排微服务

需求描述:

user服务,增删改查。查询的时候,如果缓存中,没有就去数据库中查询。

注意:数据库使用docker中mysql的,redis也使用docker里面的。

我们不使用docker-compose情况下:

启动mysql容器:

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">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
</pre>

image.png

启动redis容器:

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">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
</pre>

image.png

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

docker build -t order:1.0.2

8e0d29e2cfd1c63161b70ec9fbcffd70.png

启动镜像:

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">docker run -d -p 6001:6001 be1face5d825
</pre>

image.png

docker ps查看是否启动成功:

image.png

发现三个服务都启动了。

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

06a7b12a105da455c3d59bb4d1943bca.png

启动后,swagger测试:

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

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

image.png

访问正常。从swagger新建用户,然后从数据库和redis中都可以查询到。

虽然上面来看,是没问题了。那么这种没有使用compose会有哪些问题呢?

问题如下:

1:先后启动顺序要求固定的,先mysql+redis,然后才是微服务镜像,启动微服务,访问成功

2:多个run命令。。。。

3:容器间的停机或宕机,有可能导致ip地址对应的容器实例变化,映射出问题。要么生产ip写死(虽然可以,但是不推荐),要么通过服务调用。

当很多微服务的时候,那就疯了。所以,我们引入docker-compose文件统一管理起来。

使用docker-compose文件实战

使用docker-composy.yml服务编排,一套带走。

步骤:

1:编写docker-compose.yml文件

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">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:
    </pre>

文件详解:

version:xanzai都用3版本

services:服务

image:image的名字:TAG版本

container_name:容器名称

ports:端口映射

volumes:数据卷挂载地址

networks:网络名称

depends_on:依赖于redis 和mysql

redis:redis相关配置

mysql:mysql相关配置

命令转化:

image.png

同理redis和mysql也是一样的。

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

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

image.png

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

docker build -t order:1.0.2 .

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

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

image.png

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

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

验证是否真的成了。

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

docker network ls

image.png

使用docker ps命令查看:

image.png

mysql、redis、微服务都正常启动了。

4:进入mysql容器实例并创建数据库db2021+新表t_user

使用mysql客户端连接到mysql中,发现数据库db2021已经存在了。创建表:

<pre style="margin: 0.5em 0px; padding: 0.4em 0.6em; border-radius: 8px; background: rgb(43, 43, 43); color: rgb(169, 183, 198); font-family: "JetBrains Mono", monospace; font-size: 12pt;">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=''
</pre>

5:测试

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

一切正常。OK

6:关停

docker-compose stop

image.png

一键停服务。

082599d297705a2fdddd115647972877.png

本系列教程直通车

直通车,本系列教程已发布文章,快速到达,《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。也欢迎大家有事没事就来和凯哥聊聊~~~

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 215,133评论 6 497
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,682评论 3 390
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,784评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,508评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,603评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,607评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,604评论 3 415
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,359评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,805评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,121评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,280评论 1 344
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,959评论 5 339
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,588评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,206评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,442评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,193评论 2 367
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,144评论 2 352

推荐阅读更多精彩内容