Docker高级:Compose 容器编排

这篇具有很好参考价值的文章主要介绍了Docker高级:Compose 容器编排。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Docker高级:Compose 容器编排

一、Docker Compose 概述

Compose 是Docker公司推出的一个软件,可以管理多个Docker容器组成一个应用。我们只需要定义一个YAML格式的配置文件 docker-compose.yaml 配置好多个容器之间的调用关系,最后只需要一个命令,就可以同时控制这些容器进行启动 / 关闭。Compose 允许用户通过一个单独的 docker-compose.yaml 模板文件定义一组容器为一个项目。

举个例子:

假设我们一个项目中使用到了Redis、Mysql、nginx等等很多组件技术,那么对应的Docker容器的实例也会变得非常杂乱。如果其中有一个订单的微服务需要运行,那么就需要前面Redis、Mysql…所有容器都必须启动之后,订单服务才可以正常运行。 至此,就面临到了两个问题:

容器实例非常繁多,复杂
容器的启停以及他们之间的启动顺序需要合理的管理

这时,我们就需要一个介质去管理容器实例之间的协作方式,Docker Compose就为我们合理的解决掉了所面临的问题。当我们要进行启动容器时,只需要执行一条命令,就可以启动全部实例,不需要每个容器都再去一遍一遍 的docker run…

PS:最新版本的Docker本身已经自带了Compose 这个工具,直接使用即可。

Docker高级:Compose 容器编排

二、使用 Docker Compose

Docker Compose使用的步骤如下:

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

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

③ 执行docker-compose up命令来启动并运行整个程序,完成一键部署

Docker高级:Compose 容器编排

三、常用命令

  • 创建并启动docker-compose服务
docker-compose up
# 后台运行
docker-compose up -d
  • 停止并删除容器、网络、卷、镜像
docker-compose down
  • 进入容器实例内部
docker-compose exec <yml里面的服务id> /bin/bash
  • 展示当前docker-compose编排过的运行的所有容器
docker-compose ps
  • 展示当前docker-compose编排过的容器进程
docker-compose top
  • 查看容器输出日志
docker-compose log <yml里面的服务id>
  • 检查配置
docker-compose config
# 有问题才输出
docker-compose config -q
  • 重启服务
docker-compose restart
  • 启动服务:(类似 docker start)
docker-compose start
  • 停止服务
docker-compose stop

四、编排微服务

接下来通过一个案例学习使用Compose编排微服务,具体操作如下:

Ⅰ、搭建微服务

① 创建测试数据库表:t_user

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 '删除标志,默认0不删除,1删除',
  `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='用户表'

② 搭建SpringBoot测试工程

Docker高级:Compose 容器编排
编写配置文件

server.port=6001
# ========================alibaba.druid相关配置=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://47.109.24.39:3306/docker_boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis相关配置=====================
spring.redis.database=0
spring.redis.host=47.109.24.39
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis相关配置===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.zhao.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true

搭建好服务后,我们编写两个测试Controller(这里主要介绍Compose 相关使用,具体Java代码不过多纠结):

@Api(description = "用户User接口")
@RestController
@Slf4j
public class UserController {
    @Resource
    private UserService userService;

    @ApiOperation("新增用户 新增3条")
    @RequestMapping(value = "/user/add",method = RequestMethod.POST)
    public void addUser(){
        for (int i = 0; i <=3 ; i++) {
            User user = new User();
            user.setDeleted((byte)0);
            user.setUpdateTime(new Date());
            user.setCreateTime(new Date());
            user.setUsername("zp"+i);
            user.setPassword(IdUtil.simpleUUID().substring(0,6));
            user.setSex((byte) new Random().nextInt(2));
            userService.addUser(user);
        }
    }

    @ApiOperation("查询用户")
    @RequestMapping(value = "/user/find/{id}",method = RequestMethod.GET)
    public User findUser(@PathVariable Integer id){
        return userService.findUserById(id);
    }
}

③ 使用maven将编好的SpringBoot工程进行打包,放至linux服务器中

Docker高级:Compose 容器编排

Ⅱ、编写Dockerfile构建镜像

编写Dockerfile将SpringBoot工程构建为镜像,命令如下:

# 基础镜像 java
FROM java:8
# 作者 xiaozhao
MAINTAINER xiaozhao
# 指定临时文件位 /temp
VOLUME /temp
# 将jar包添加到容器 更名为zp_docker
ADD docker_boot-0.0.1-SNAPSHOT.jar zp_docker.jar
# 运行 jar
RUN bash -c 'touch /zp_docker.jar'
ENTRYPOINT ["java","-jar","/zp_docker.jar"]
# 暴露6001端口
EXPOSE 6001

将编写好的Dockerfile文件放至SpringBoot工程同一目录下

Docker高级:Compose 容器编排
执行命令构建镜像

Docker高级:Compose 容器编排

Docker高级:Compose 容器编排

Ⅲ、启动容器,测试服务

启动容器,使用Swagger进行测试

Docker高级:Compose 容器编排

访问Swagger成功,搭建微服务完成。

Docker高级:Compose 容器编排

Ⅳ、使用Compose编排容器

① 在Dockerfile同级目录下编写docker-compose.yml文件

# 版本
version: "3"

#服务容器实例
services:
# 服务名
  microService:
  	# 镜像名 + 版本号
    image: zp_docker:1.0
    # 容器名称
    container_name: my01
    # 端口配置
    ports:
      - "6001:6001"
    # 容器数据卷
    volumes:
      - /app/microService:/data
    # 网络(一下容器运行在同一个网段内)
    networks: 
      - xiaozhao_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: 
      - xiaozhao_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: 'docker_boot'
    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:
      - xiaozhao_net 
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
networks: 
   xiaozhao_net : 

Docker高级:Compose 容器编排

② 修改微服务中的配置,将mysql和redis的IP地址换为docker-compose.yml文件中的服务名。避免宕机重启IP变更引发问题。

server.port=6001
# ========================alibaba.druid相关配置=====================
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
#spring.datasource.url=jdbc:mysql://47.109.24.39:3306/docker_boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.url=jdbc:mysql://mysql:3306/docker_boot?useUnicode=true&characterEncoding=utf-8&useSSL=false
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.druid.test-while-idle=false
# ========================redis相关配置=====================
spring.redis.database=0
#spring.redis.host=47.109.24.39
spring.redis.host=redis
spring.redis.port=6379
spring.redis.password=
spring.redis.lettuce.pool.max-active=8
spring.redis.lettuce.pool.max-wait=-1ms
spring.redis.lettuce.pool.max-idle=8
spring.redis.lettuce.pool.min-idle=0
# ========================mybatis相关配置===================
mybatis.mapper-locations=classpath:mapper/*.xml
mybatis.type-aliases-package=com.zhao.docker.entities
# ========================swagger=====================
spring.swagger2.enabled=true

③ 重新将微服务打包放至linux服务器中

Docker高级:Compose 容器编排

④ 重新构建镜像

Docker高级:Compose 容器编排
⑤ 执行命令,检查docker-compose.yml配置

docker-compose config -q

Docker高级:Compose 容器编排

没有出现报错,配置正常。

⑥ 执行启动命令,一键启动所有容器

# 后台启动所有容器
docker-compose up -d

Docker高级:Compose 容器编排
当在docker-compose.yml文件中不设置容器名称时,默认为:当前文件所处的目录名称_镜像名_容器数量

⑦ 查看容器启动情况,可以看到所有容器启动成功

Docker高级:Compose 容器编排

⑧ 使用Swagger测试服务

测试添加用户功能

Docker高级:Compose 容器编排
Docker高级:Compose 容器编排

测试查询功能

Docker高级:Compose 容器编排

测试成功,功能接口正常,Mysql,redis服务正常!!

五、总结

在以上的测试项目中,我们用到了redis、Mysql组件,再加上搭建的SpringBoot工程镜像,一共三个对应容器。当我们不使用Compose 去编排服务时,我们总会遇到如下的问题:

  1. 启动容器的先后顺序要求固定,必须先启动Mysql、Redis才能微服务访问成功。
  2. 每次启动都要执行多个run命令。
  3. 容器间的启停或宕机,有可能导致IP地址对应的容器实例变化,映射出错。

在有了Compose 后容器间的管理就非常丝滑了,本次分享的文章到这里就结束了,希望对大家有所帮助。兄弟们,快快用起来吧!

Docker高级:Compose 容器编排文章来源地址https://www.toymoban.com/news/detail-459929.html

到了这里,关于Docker高级:Compose 容器编排的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • Docker六 | Docker Compose容器编排

    目录 Docker Compose 基本概念 使用步骤  常用命令  Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。Compose可以管理多个Docker容器组成一个应用。 需要定义一个YAML格式的配置文件docker-compose.yml,写好多个容器之间的调用关系,然后只需一个命令就能同时

    2024年02月02日
    浏览(13)
  • docker (十)-docker compose容器编排

    在实际工作中,部署一个应用可能需要部署多个容器,一个一个部署非常不方便。docker compose可以一键部署和启动多个容器,它使用yaml文件来编排服务。github和docker hub很多项目都提供了docker-compose.yaml文件,我们可以一键部署项目,非常方便。 这里可以使用 vscode 去学习dock

    2024年02月21日
    浏览(13)
  • Docker——compose单机容器集群编排

    Docker——compose单机容器集群编排

    Docker-compose是一个基于Docker的容器编排工具。它使用一个YAML文件来定义和配置多个容器的集群。通过使用Docker-compose,我们可以轻松地定义、配置和协同运行多个Docker容器,而无需手动管理它们的启动和通信。 1.为何需要Docker-compose 在现代应用程序开发中,容器化技术已经成

    2024年02月16日
    浏览(11)
  • Docker Compose容器的快速编排

    Docker Compose容器的快速编排

    Docker Compose项目是Docker官方的开源项目,负责实现对Docker容器集群的快速编排(使用一个模板文件定义多个应用容器的启动参数和依赖关系,并使用Docker Compose来根据这个模板文件的配置来启动容器)。 项目/工程 - 包含一个或多个服务 - 包含一个或多个容器 默认使用项目的目

    2024年02月15日
    浏览(10)
  • docker笔记9:Docker-compose容器编排

    docker笔记9:Docker-compose容器编排

    目录 1.是什么? 2. 能干嘛? 3.去哪下? 4.安装步骤  ​编辑 5.卸载步骤   6.Compose核心概念  6.1概念 6.2 Compose常用命令   7.Compose编排微服务 7.1改造升级微服务工程docker_boot 7.2不用Compose 7.2.1 单独的mysql容器实例 7.3 swagger测试 7.4上面成功了,有哪些问题? 7.5 使用Compose  7.5.1

    2024年02月09日
    浏览(11)
  • 尚硅谷Docker-笔记12:Compose容器编排

    尚硅谷Docker-笔记12:Compose容器编排

    Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启动/关闭这些容器。 docker建议我们每一个容器中只运行一个服务,因为docker容

    2024年01月18日
    浏览(10)
  • Docker进阶:Docker Compose(容器编排) 管理多容器应用—实战案例演示

    Docker进阶:Docker Compose(容器编排) 管理多容器应用—实战案例演示

    💖The Begin💖点点关注,收藏不迷路💖 在开始之前,我们需要确保已经安装了 Docker 。 前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如

    2024年02月08日
    浏览(12)
  • 4.docker容器编排(docker compose 与 docker swarm)

    4.docker容器编排(docker compose 与 docker swarm)

    容器编排:就是针对容器生命周期的管理,对容器的生命周期进行更快速方便的方式进行管理。 实例:一个java程序,依赖了mysql,redis,要想把 java 程序运行起来,则必须要先启动 mysql、redis。那么这三者这件就存在了依赖关联。   容器编排存在的意义: 依赖管理,当一个容

    2024年02月03日
    浏览(17)
  • docker-compose容器编排使用详解+示例

    docker-compose容器编排使用详解+示例

    Docker-Compose是Docker官方的开源项目,负责实现对Docker容器集群的快速编排。 Compose 是 Docker 公司推出的一个工具软件,可以管理多个 Docker 容器组成一个应用。你需要定义一个 YAML 格式的配置文件docker-compose.yml,写好多个容器之间的调用关系。然后,只要一个命令,就能同时启

    2023年04月22日
    浏览(16)
  • 【云原生】Docker-compose单机容器集群编排

    【云原生】Docker-compose单机容器集群编排

    Compose是单机编排容器集群或者是分布式服务容器的应用工具。通过Compose,可以使用YAML文件来配置应用程序的服务。然后,使用一个命令,就可以从配置中创建并启动所有服务。 Docker-Compose是一个容器编排工具。通过一个.yml或.yaml文件,将所有的容器的部署方法、文件映射、

    2024年02月09日
    浏览(20)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包