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日
    浏览(34)
  • Docker 容器编排利器 Docker Compose

    目录 一、Docker Compose 简介 二、Docker Compose 安装 2.1 Mac、Windows 平台默认支持 2.2 Linux 安装(通过包管理) 2.2.1 安装 2.2.2 测试 2.2.3 卸载 2.3 使用PIP 安装与卸载 2.3.1 PIP安装 2.3.2 PIP 卸载 三、基本使用 3.1 术语 3.2 部署Flask 应用 四、Compose 常用命令 4.1 命令对象与格式 4.2 docker-compose

    2024年03月26日
    浏览(40)
  • Docker Compose容器的快速编排

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

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

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

    2024年02月16日
    浏览(34)
  • 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日
    浏览(33)
  • 尚硅谷Docker-笔记12:Compose容器编排

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

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

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

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

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

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

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

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

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

    2024年02月09日
    浏览(43)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包