栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

docker-compose(3):入门与实战

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

docker-compose(3):入门与实战

文章目录

一、docker-compose介绍二、部署使用

1. 单容器单服务的使用2. 多服务多容器依赖3. 多服务多容器独立4.单服务多服务部署 三、关于docker-compose向项目配置文件传参四、常用指令参考文档

一、docker-compose介绍

在真实项目,我们需要对微服务项目进行调测,此时我们必然需要部署多个微服务实例,才可以进行测试,这个操作过程非常繁琐,而且相互之间的依赖关系,会有启动顺序的影响,容易出错。
而此时compose应用而生,docker-compose用于定义运行多个容器,通过docker-compose.yml来实现对容器集群的编排工作。
Docker-compose管理三个内容:

工程:docker-compose的运行即可一个工程服务: 对应工程的子项目容器:服务对应的实例,一个实例可以对应多个容器。 二、部署使用 1. 单容器单服务的使用

    我们新建一个springboot工程
package com.it2.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class HelloController {
    @GetMapping("/test1")
    public String hello(){
        log.info("test1!!!");
        return "hello test1";
    }
}
    编写Dockerfile
FROM openjdk:8
EXPOSE 8080
ADD target
    @Bean
    RedisTemplate redisTemplate(RedisConnectionFactory redisConnectionFactory) {

        RedisTemplate template = new RedisTemplate<>();
        template.setConnectionFactory(redisConnectionFactory);

        //使用Jackson2JsonRedisSerializer来序列化和反序列化redis的value值
        Jackson2JsonRedisSerializer serializer = new Jackson2JsonRedisSerializer(Object.class);

        ObjectMapper mapper = new ObjectMapper();
        mapper.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        mapper.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        serializer.setObjectMapper(mapper);

        template.setValueSerializer(serializer);
        //使用StringRedisSerializer来序列化和反序列化redis的key值
        template.setKeySerializer(new StringRedisSerializer());
        template.setHashKeySerializer(new StringRedisSerializer());
        template.setHashValueSerializer(serializer);
        template.afterPropertiesSet();
        return template;
    }

}
    稍微改动HelloController,实现每次访问自增+1
package com.it2.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class HelloController {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/test1")
    public String hello(){
        log.info("test1!!!");
        Long counter = redisTemplate.opsForValue().increment("counter");
        return "hello test1,counter:"+counter;
    }
}
    修改docker-compose.yml,添加对redis的依赖
# 使用的yml版本
version: "3.9"
services:
  # 服务名称,可以自定义
  test1:
    # 容器名称,可以自定义
    container_name: mytest1
    # 指定Dockerfile所在的目录
    build: .
    # 映射端口
    ports:
      - "8888:8080"
    depends_on:
      - myredis
    environment:
      - REDIS_HOST=myredis
      - REDIS_PORT=6379

  myredis:
    image: "redis:latest"
    重新打包上传文件
    启动编排运行docker-compose up --build

8 测试访问

9 停止

docker-compose down
3. 多服务多容器独立

根据《 2. 多服务多容器依赖》的案例,我们继续扩展新增一个test2子项目

    新建test2子项目
    controller
package com.it2.controller;

import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@Slf4j
@RestController
public class HelloController {
    @GetMapping("/test2")
    public String hello(){
        log.info("test2!!!");
        return "hello test2";
    }
}

Dockerfile

FROM openjdk:8
EXPOSE 8081
ADD target/*.jar /app.jar
ENTRYPOINT ["java", "-jar", "app.jar"]
    编写docker-compose.yml
# 使用的yml版本
version: "3.9"
services:
  # 服务名称,可以自定义
  test1:
    # 容器名称,可以自定义
    container_name: mytest1
    # 指定Dockerfile所在的目录
    build: ./test1
    # 映射端口
    ports:
      - "8888:8080"
    depends_on:
      - myredis
    environment:
      - REDIS_HOST=myredis
      - REDIS_PORT=6379
  test2:
    # 容器名称,可以自定义
    container_name: mytest2
    # 指定Dockerfile所在的目录
    build: ./test2
    # 映射端口
    ports:
      - "8889:8081"
  myredis:
    image: "redis:latest"
    # 服务名称,可以自定义
    打包上传文件到服务器
    启动编排运行docker-compose up --build


5. 测试访问

4.单服务多服务部署

服务和容器是可以一对多的,那么这样我们可以将一个服务启动多个容器。但是由于compose是单机运行,服务名称是唯一的,所以我们不能指定名称,也不只能映射端口,只能让docker随机映射端口。
接下来,我们继续使用test2子工程的代码。

    编辑docker-compose.yml
# 使用的yml版本
version: "3.9"
services:
  # 服务名称,可以自定义
  test2:
    # 指定Dockerfile所在的目录
    build: .
    # 映射端口
    ports:
      - "8081"
    上传文件如图
    编排运行
#test2启动了两个容器
docker-compose up --build --scale test2=2


4. 访问测试

三、关于docker-compose向项目配置文件传参

除了《2. 多服务多容器依赖》中介绍的直接在docker-compose.yml的environment参数声明文件,同样可以采用env文件传参。

    新建docker-compose2.yml文件
# 使用的yml版本
version: "3.9"
services:
  # 服务名称,可以自定义
  test1:
    # 容器名称,可以自定义
    container_name: mytest1
    # 指定Dockerfile所在的目录
    build: .
    # 映射端口
    ports:
      - "8888:8080"
    depends_on:
      - myredis
    env_file:
      - test.env
  myredis:
    image: "redis:latest"
    新建test.env文件
REDIS_HOST=myredis
REDIS_PORT=6379

    上传文件

    启动运行

docker-compose -f docker-compose2.yml up


5. 测试访问

四、常用指令

以下命令中出现得[]里得参数都是可选的

1、ps命令
列出所有运行容器
docker-compose ps

2、logs命令
查看容器日志输出,-f表示查看实时日志,容器名表示启动后的容器名,不指定则查看所有启动的容器
docker-compose logs [-f] [容器名]

3、port命令
打印绑定的公共端口,下面命令可以输出demo1服务8080端口所绑定的公共端口
docker-compose port demo1 8080

4、build命令
构建或者重新构建服务
docker-compose build

5、start命令
启动指定停止的容器, 如下实例中demo1为一个容器,如果不指定,则启动所有已存在的
docker-compose start [demo1]

6、stop命令
停止已运行的容器,不指定则停止所有的
docker-compose stop [demo1]

7、rm命令
删除指定容器,必须为已停止的,如果不指定容器名,则删除所有
docker-compose rm [demo1]

8、up命令
构建和启动容器,-d为后台运行
docker-compose up [-d]

9、kill命令
通过发送SIGKILL信号来停止容器,不指定容器名则停止所有启动中的容器
docker-compose kill [demo1]

10、-f指定文件运行
指定文件运行
docker-compose -f doccker-compose2.yml up

参考文档

使用Docker compose发布SpringBoot项目

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/786175.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号