Docker容器

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

本文主要是介绍docker高级篇-docker-compose容器编排介绍及实战,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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

https://img3.sycdn.imooc.com/63ae44660001473204320223.jpg

是什么?

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

怎么理解:

https://img3.sycdn.imooc.com/63ae47f400014b6005530206.jpg

能干嘛?

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

https://img2.sycdn.imooc.com/63ae47f90001dcb105530170.jpg

去哪下?

官方地址:

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

https://img1.sycdn.imooc.com/63ae47ff0001a3d105530195.jpg

compose使用的三个步骤

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

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

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

compose常用命令

https://img1.sycdn.imooc.com/63ae48050001601a05530228.jpg

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

https://img1.sycdn.imooc.com/63ae480a00013d7a05530032.jpg

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

https://img4.sycdn.imooc.com/63ae480f0001747305530056.jpg

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

docker build -t order:1.0.2 

https://img1.sycdn.imooc.com/63ae4812000146e105530268.jpg

启动镜像:

docker run -d -p 6001:6001 be1face5d825

https://img2.sycdn.imooc.com/63ae48150001f11605530062.jpg

docker ps查看是否启动成功:

https://img1.sycdn.imooc.com/63ae48190001b48a05530040.jpg

发现三个服务都启动了。

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

https://img1.sycdn.imooc.com/63ae481c0001173605530131.jpg

启动后,swagger测试:

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

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

https://img1.sycdn.imooc.com/63ae48210001ff8605530230.jpg

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

命令转化:

https://img4.sycdn.imooc.com/63ae48290001015405530143.jpg

同理redis和mysql也是一样的。

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

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

https://img1.sycdn.imooc.com/63ae482d0001e4a305530154.jpg

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

docker build -t order:1.0.2 . 

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

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

https://img1.sycdn.imooc.com/63ae48300001176e05530158.jpg

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

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

验证是否真的成了。

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

docker network ls

https://img3.sycdn.imooc.com/63ae48340001388905530119.jpg

使用docker ps命令查看:

https://img1.sycdn.imooc.com/63ae483700011ee705530041.jpg

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

https://img4.sycdn.imooc.com/63ae483c00010ae105530128.jpg

一键停服务。

https://img1.sycdn.imooc.com/63ae484000018e4905530244.jpg




这篇关于docker高级篇-docker-compose容器编排介绍及实战的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!