Docker Compose使用

news2025/1/15 6:26:11

Docker-Compose是什么

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

如果我需要同时部署好多个服务,难道要每个服务单独写Dockerfile然后在构建镜像,构建容器,这样累都累死了,所以docker官方给我们提供了docker-compose多服务部署的工具

例如要实现一个Web微服务项目,除了Web服务容器本身,往往还需要再加上后端的数据库mysqI服务容器,redis服务容器,注册中心naocs,甚至还包括负载均衡容器等等。。。

Compose允许用户通过一个单独的docker-compose.yml模板文件(YAML 格式)来定义一组相关联的应用容器为一个项目(project),
可以很容易地用一个配置文件定义一个多容器的应用,然后使用一条指令安装这个应用的所有依赖,完成构建。Docker-Compose 解决了容器与容器之间如何管理编排的问题。

Docker Compose 是一个用于定义和运行多容器 Docker 应用程序的工具。它使用一个 YAML 文件来配置应用程序的服务,然后使用一个单一的命令部署和启动应用程序的全部服务。

使用 Docker Compose 的主要优势包括:

  1. 简化容器编排: Compose 允许你在单个配置文件中定义整个应用程序栈,包括不同的服务、网络和存储卷等。这大大简化了容器编排的复杂性。
  2. 一致的开发环境: Compose 确保开发、测试和生产环境的一致性,因为所有环境都使用相同的 Compose 文件。
  3. 快速部署: Compose 可以一次性启动应用程序的所有服务,大大加快了部署速度。
  4. 扩展性: Compose 允许你轻松地扩展应用程序的任何服务。

使用 Docker Compose 的一般流程如下:

  1. 创建一个 docker-compose.yml 文件,定义应用程序的服务。
  2. 在终端中运行 docker-compose up 命令来启动应用程序。
  3. 运行 docker-compose down 命令来停止并删除容器。

Compose 支持多种配置选项,例如指定服务的镜像、端口映射、环境变量、依赖关系等。这使得管理复杂的多容器应用程序变得更加简单和高效。

下载安装

如果你的网很慢,访问不了外网,可以去这里的百度盘直接下载,也包括下面微服务用到的jar包

链接:https://pan.baidu.com/s/1LcwN-LbfKt10ul8d9_-sCA 
提取码:wzyy

官网地址

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

在 CentOS 下下载最新版本的 Docker Compose 文件,可以使用以下命令:

curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

这个命令会:

  1. 使用 curl 命令从 GitHub 上下载最新版本的 Docker Compose 文件。
  2. 将文件保存到 /usr/local/bin/docker-compose 目录下。

下载完成后,还需要执行以下命令来赋予可执行权限:

chmod +x /usr/local/bin/docker-compose

这样就可以在 CentOS 系统上使用 docker-compose 命令了。

如果你想确认当前安装的 Docker Compose 版本,可以执行以下命令:

docker-compose --version

这将显示已安装的 Docker Compose 版本信息。

需要注意的是,这个命令下载的是最新版本的 Docker Compose。如果你需要使用特定版本,可以在下载链接中指定版本号,例如:

curl -L https://github.com/docker/compose/releases/download/v2.17.3/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose

这将下载 v2.17.3 版本的 Docker Compose。

执行上述命令

[root@localhost ~]# curl -L https://github.com/docker/compose/releases/latest/download/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
  0     0    0     0    0     0      0      0 --:--:--  0:00:01 --:--:--     0
100 60.0M  100 60.0M    0     0   156k      0  0:06:33  0:06:33 --:--:--  570k
[root@localhost ~]# chmod +x /usr/local/bin/docker-compose
[root@localhost ~]# docker-compose --version
Docker Compose version v2.27.0
[root@localhost ~]# 

如果想要卸载,执行

rm /usr/local/bin/docker-compose

核心概念

Docker Compose 的核心概念包括以下几点,其中最重要的是服务配置文件工程

可以理解为:通过配置文件 (docker-compose.yml),将多个服务 (Services),组合成一个工程 (project)

  1. 服务 (Services): Docker Compose 的基本构建块是服务。一个服务代表一个 Docker 容器,可以包含应用程序、数据库、消息队列等组件。每个服务都有自己的配置,如镜像、端口映射、环境变量等。
  2. 配置文件 (docker-compose.yml): 所有的 Compose 配置都定义在一个 YAML 格式的配置文件中,通常命名为 docker-compose.yml。该文件描述了整个应用程序的结构,包括各个服务、网络和卷的定义。
  3. 工程 (project):在 Docker Compose 中,Project 表示一组相关的服务,它们会被一起管理和部署。docker-compose.yml 文件定义了 Project 中的所有服务、网络和卷,同一个 Project 可以包含多个 docker-compose.yml 文件,比如一个用于开发环境、一个用于生产环境。
  4. 网络 (Networks): Docker Compose 可以自动创建并管理容器之间的网络连接。你可以为不同的服务指定不同的网络,实现容器之间的隔离和通信。
  5. 卷 (Volumes): Compose 可以管理持久化数据存储,包括创建和挂载卷。这样可以确保数据在容器重启或删除后不会丢失。
  6. 命令行工具 (docker-compose): Compose 提供了一个命令行工具 docker-compose,可用于管理整个应用程序的生命周期,包括构建、启动、停止、查看日志等操作。
  7. 扩展性 (Scaling): Compose 支持轻松地水平扩展服务实例的数量,可以根据需求动态增加或减少容器的数量。
  8. 依赖管理: Compose 会自动处理服务之间的依赖关系,确保先启动依赖服务再启动被依赖服务。

总的来说,Docker Compose 提供了一种声明式的方式来定义和管理整个应用程序的基础设施,使得应用程序的部署和扩展变得更加简单和高效。


使用步骤

  1. 编写Dockerfile定义各个微服务应用并构建出对应的镜像文件。
  2. 使用docker-compose.yml定义一个完整业务单元,安排好整体应用中的各个容器服务。
  3. 最后,执行docker-compose up命令来启动并运行整个应用程序,完成一键部署上线。

常用的命令

Docker Compose 提供了一系列常用的命令,下面是一些常用的命令及其用途:

  1. docker-compose up

    • 启动并运行整个应用程序
    • 可以使用 -d 参数在后台运行
    • 如果镜像不存在,会自动构建

  2. docker-compose down

    • 停止并删除整个应用程序
    • 包括容器、网络和卷


  3. docker-compose ps

    列出当前 Project 中正在运行的容器


  4. docker-compose build

    构建或重新构建服务的镜像


  1. docker-compose start/stop/restart

    分别启动、停止或重启整个应用程序

  2. docker-compose logs 服务id

    查看应用程序的日志输出,可以使用 -f 参数实时查看日志



  3. docker-compose exec 服务id

    进入正在运行的容器内部,可以在容器内部执行命令


  4. docker-compose config

    验证并查看 docker-compose.yml 文件的配置

    docker-compose config -q: 检查配置,只是在出现问题时才会输出信息


  5. docker-compose pull

    拉取服务所需的镜像


  6. docker-compose scale

    动态调整某个服务的容器数量

这些只是 Docker Compose 最常用的一些命令,实际上 Compose 还有更多功能和命令可供使用。


编写配置文件

写一个docker-compose.yml,并进行服务编排

要确保下面配置中,所有的volumes:下面的挂载点目录已存在,不存在要先创建
(注意:目前新版的docker-compose默认可以不用写version了)

services:
  #自定义的服务名,必须小写
  eureka7001:
  	#指定dockerfile来构建镜像并运行实例,context用来指定Dockerfile所在的目录
    build:
      context: /wzy/cloud-images/eureka
      dockerfile: Dockerfile
    #image: eureka_docker:1.0 #如果有现成的镜像,可以在这里指定,直接用来运行容器,使用此项要注释掉build及其内容
    #container_name: eureka01 指定容器的名字,如果不指定,会由docker自动生成
    ports:
      - "7001:7001"
    #挂载容器卷  
    volumes:
      - /wzy/eurekaService:/data 
    #指定使用的网络,所有服务的网络一致,即可以使用服务名通信忽略ip地址  
    networks:
      - wzy_net
  
  #自定义的服务名,必须小写
  payment8001:
    build:
      context: /wzy/cloud-images/pay8001
      dockerfile: Dockerfile  
    #image: payment01_docker:1.0
    #container_name: payment01
    ports:
      - "8001:8001"
    volumes:
      - /wzy/paymentMysqlService:/data 
    networks:
      - wzy_net
     #指定本服务依赖的服务,会等依赖的服务运行后在运行本服务 
    depends_on:
      - eureka7001	
      - mysql    
      
  #自定义的服务名,必须小写    
  payment8002:
    build:
      context: /wzy/cloud-images/pay8002
      dockerfile: Dockerfile  
    #image: payment02_docker:1.0
    #container_name: payment02
    ports:
      - "8002:8002"
    volumes:
      - /wzy/paymentRedisService:/data 
    networks:
      - wzy_net
    depends_on:
      - eureka7001
      - redis  
      
  #自定义的服务名,必须小写,也可以叫别的,springboot服务可以在yaml中将redis的ip换成这个名字    
  redis:
    image: redis:6.2.6
    ports:
      - "6379:6379"
    volumes:
      - /wzy/redis/redis.conf:/etc/redis/redis.conf
      - /wzy/redis/data:/data 
    networks:
      - wzy_net
    #运行指令  
    command: redis-server /etc/redis/redis.conf   
  
  #自定义的服务名,必须小写,也可以叫别的,springboot服务可以在yaml中将redis的ip换成这个名字     
  mysql:
    image: mysql:latest
    #环境参数配置
    environment:
      #注意这里的密码要和微服务连接mysql的配置对应上
      MYSQL_ROOT_PASSWORD: '123456'
      MYSQL_ALLOW_EMPTY_PASSWORD: 'NO'
      MYSQL_DATABASE: 'mybatis-plus'
      MYSQL_USER: 'wzy'
      MYSQL_PASSWORD: '123456'
    ports:
      - "3306:3306"
    volumes: 
      - /wzy/mysql/log:/var/log/mysql
      - /wzy/mysql/data:/var/lib/mysql
      - /wzy/mysql/conf:/etc/mysql/conf.d
    networks:
      - wzy_net
    command: --default-authentication-plugin=mysql_native_password #解决外部无法访问
         

#创建网络
networks:
  wzy_net:    


微服务展示

除了docker中的redis及mysql之外,这里还用了三个springcloud服务做演示:

  • mysql的微服务实现向mysql数据库插入数据
  • redis的微服务实现向redis插入数据
  • eureka中会注册上面两个微服务

eureka的服务

主要展示配置文件,代码就不展示了,需要的话去上面的下载安装标题处提取

主要是hostname,这里写成了eureka7001,就是上面编排文件的eureka的服务名,因为配置网络后可以直接忽略ip使用服务名,可以解决网络ip变动服务通信失败问题

server:
  port: 7001

eureka:
  instance:
    #用docker服务名,不用ip
    hostname: eureka7001
  client:
    #表示是否将自己注册进eureka,本moudle本身就是注册中心,不需要注册
    register-with-eureka: false
    #表示自己就是注册中心,维护服务实例,其他服务要注册到本moudle中
    fetch-registry: false
    #设置与Eureka Server交互的地址查询服务和注册服务都需要依赖这个地址
    service-url:
      #defaultZone: http://erueka7002.com:7002/eureka #集群配置指向另一个服务注册中心
     defaultZone: http://${eureka.instance.hostname}:${server.port}/eureka/   #单机配置
  #Eureka自我保护模式:当微服务在默认90秒内不发送心跳给eureka注册中心后,不会立刻抹除微服务得信息
  server:
    enable-self-preservation: false  #禁用自我保护
    eviction-interval-timer-in-ms: 5000       #毫秒,设置多少毫秒微服务不可用就剔除

mysql的微服务

sql

代码中要用到的表

CREATE TABLE `number_test` (
  `one` int NOT NULL,
  `two` varchar(255) DEFAULT NULL,
  `three` varchar(255) DEFAULT NULL,
  `four` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`one`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

ymal

数据库datasourceurl处使用编排文件的服务名,eurekaservice-urldefaultZone用编排文件中erueka注册中心的服务名

server:
  port: 8001


spring:
  application:
    name: cloud-payment-service

  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    #mysql:3306,使用docker服务名,不用ip
    url: jdbc:mysql://mysql:3306/mybatis-plus?nullCatalogMeansCurrent=true&useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
    username: wzy
    password: 123456

mybatis-plus:
  mapper-locations: classpath:/mapper/*Mapper.xml


eureka:
  client:
    #表示是否将自己注册进eureka
    register-with-eureka: true
    #是否从eurekaServer抓取已有注册信息,默认为true。单点无所谓,集群必须设置true才能配合Ribbon使用负载均衡
    fetchRegistry: true
    #入驻的eureka服务地址
    service-url:
    #############使用docker服务名,不用ip#############
      defaultZone: http://eureka7001:7001/eureka #单机版
      #defaultZone: http://erueka7001.com:7001/eureka,http://erueka7002.com:7002/eureka #集群版
  #配置eureka前台界面服务名字的status名字显示
  instance:
    instance-id: payment8001
    prefer-ip-address: true  #访问路径可以显示ip地址
    #Eureka客户端向服务端发送心跳的时间间隔,单位秒
    lease-renewal-interval-in-seconds: 10
    #Eureka服务端在收到最后一次心跳后等待时间上限,单位秒(默认是90秒),超时将认为服务不可用
    lease-expiration-duration-in-seconds: 20

Controller

@RestController
@RequestMapping("ntest")
public class NumberTestController {

    @Autowired
    private NumberTestService numberTestService;

    @GetMapping("save")
    public boolean insertTest(){
        NumberTest test = new NumberTest();
        test.setOne(1);
        test.setTwo("2");
        test.setThree("3");
        test.setFour("4");
        return numberTestService.save(test);
    }

}

访问地址

http://localhost:8001/ntest/save

redis的微服务

yaml

host处使用编排redis的服务名,因为本微服务要连接docker的redis容器

server:
  port: 8002


spring:
  application:
    name: cloud-payment-service
  redis:
  #使用docker服务名,不用ip
    host: redis
    port: 6379
    lettuce:
      shutdown-timeout: 0  # 连接超时时间(毫秒)
      pool:
        max-active: 8
        max-wait: -1
        max-idle: 500
        min-idle: 0

eureka:
  client:
    #表示是否将自己注册进eureka
    register-with-eureka: true
    #是否从eurekaServer抓取已有注册信息,默认为true。单点无所谓,集群必须设置true才能配合Ribbon使用负载均衡
    fetchRegistry: true
    #入驻的eureka服务地址
    service-url:
    #############使用docker服务名,不用ip#############
      defaultZone: http://eureka7001:7001/eureka #单机版
      #defaultZone: http://erueka7001.com:7001/eureka,http://erueka7002.com:7002/eureka #集群版
  #配置eureka前台界面服务名字的status名字显示
  instance:
    instance-id: payment8002
    prefer-ip-address: true  #访问路径可以显示ip地址

config

/**
 * SpringBoot自动帮我们在容器中生成了一个RedisTemplate和一个StringRedisTemplate。
 * 但是,这个RedisTemplate的泛型是<Object,Object>,写代码不方便,需要写好多类型转换的代码;
 * 我们需要一个泛型为<String,Object>形式的RedisTemplate。
 * 并且,这个默认的RedisTemplate没有设置数据存在Redis时,key及value的序列化方式。如果不序列化,写入redis会报错
 *
 * */
@Configuration
public class RedisConfig {

    @Bean
    public RedisTemplate<String, Object> redisTemplate(RedisConnectionFactory factory) {
        RedisTemplate<String, Object> template = new RedisTemplate<String, Object>();
        template.setConnectionFactory(factory);
        Jackson2JsonRedisSerializer jackson2JsonRedisSerializer = new Jackson2JsonRedisSerializer(Object.class);
        ObjectMapper om = new ObjectMapper();
        om.setVisibility(PropertyAccessor.ALL, JsonAutoDetect.Visibility.ANY);
        om.enableDefaultTyping(ObjectMapper.DefaultTyping.NON_FINAL);
        jackson2JsonRedisSerializer.setObjectMapper(om);
        StringRedisSerializer stringRedisSerializer = new StringRedisSerializer();
        // key采用String的序列化方式,此处为除hash外其他的类型全部做设置
        template.setKeySerializer(stringRedisSerializer);
        // hash的key也采用String的序列化方式
        template.setHashKeySerializer(stringRedisSerializer);
        // value序列化方式采用jackson
        template.setValueSerializer(jackson2JsonRedisSerializer);
        // hash的value序列化方式采用jackson
        template.setHashValueSerializer(jackson2JsonRedisSerializer);
        template.afterPropertiesSet();
        return template;
    }
}

controller

@RestController
@RequestMapping("payment")
public class payment {

    @Autowired
    private RedisTemplate redisTemplate;

    @GetMapping("/redis")
    public  void setCacheObject() {
        redisTemplate.opsForValue().set("test-key", "test-value");
    }
}    

访问地址

http://localhost:8002/payment/redis


编写Dockerfile

没有写mysql与redis的Dockerfile,因为如果本地没有镜像会自动拉取,我这里复用了以前的镜像,详细安装请参考本专栏的docker安装应用部分:

https://blog.csdn.net/onePlus5T/article/details/139102535

构建eureka的Dockerfile,连同jar包放入编排文件指定的/wzy/cloud-images/eureka目录中

#基础镜像使用java
FROM java:8

#作者
MAINTAINER wzy

#VOLUME指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

#将jar包添加到容器中并更名为wzy_eureka.jar
ADD cloud-eureka-server-1.0-SNAPSHOT.jar wzy_eureka.jar

# 运行jar包
RUN bash -c 'touch /wzy_eureka.jar'
ENTRYPOINT ["java","-jar","/wzy_eureka.jar"]

#暴露7001端口,因为上面的代码的端口也是7001
EXPOSE 7001

构建mysql微服务-8001的Dockerfile,连同jar包放入编排文件指定的/wzy/cloud-images/pay8001目录中

#基础镜像使用java
FROM java:8

#作者
MAINTAINER wzy

#VOLUME指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

#将jar包添加到容器中并更名为wzy_payment8001.jar
ADD cloud-provider-payment8001-1.0-SNAPSHOT.jar wzy_payment8001.jar

# 运行jar包
RUN bash -c 'touch /wzy_payment8001.jar'
ENTRYPOINT ["java","-jar","/wzy_payment8001.jar"]

#暴露8001端口,因为上面的代码的端口也是8001
EXPOSE 8001

构建redis微服务-8002的Dockerfile,连同jar包放入编排文件指定的/wzy/cloud-images/pay8002目录中

#基础镜像使用java
FROM java:8

#作者
MAINTAINER wzy

#VOLUME指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp

#将jar包添加到容器中并更名为wzy_payment8002.jar
ADD cloud-provider-payment8002-1.0-SNAPSHOT.jar wzy_payment8002.jar

# 运行jar包
RUN bash -c 'touch /wzy_payment8002.jar'
ENTRYPOINT ["java","-jar","/wzy_payment8002.jar"]

#暴露8002端口,因为上面的代码的端口也是8002
EXPOSE 8002

运行编排

无论将 docker-compose.yml 文件放在哪里,只要确保在执行 Docker Compose 命令时,能正确地指定 Compose 文件的路径即可。比如:

docker-compose -f /wzy/docker-compose.yml up -d

再执行前,可以检查编排配置文件是否有问题,如果执行如下命令没有如何输出,就是没问题 (这里建议先去yaml在线格式化网站校验一下):

docker-compose config -q

这里建议将docker相关内容进行统一存放,我就是存放在了wzy的路径,直接运行:

[root@localhost wzy]# docker-compose config -q
[root@localhost wzy]# docker-compose -f /wzy/docker-compose.yml up -d
[+] Building 35.9s (20/20) FINISHED                                     docker:default
 => [eureka7001 internal] load build definition from Dockerfile                   0.1s
 => => transferring dockerfile: 579B                                              0.0s
 => [payment8002 internal] load metadata for docker.io/library/java:8            30.8s
 => [eureka7001 internal] load .dockerignore                                      0.0s
 => => transferring context: 2B                                                   0.0s
 => [eureka7001 internal] load build context                                      0.3s
 => => transferring context: 48.86MB                                              0.3s
 => CACHED [payment8002 1/3] FROM docker.io/library/java:8@sha256:c1ff613e8ba258  0.0s
 => [eureka7001 2/3] ADD cloud-eureka-server-1.0-SNAPSHOT.jar wzy_eureka.jar      0.3s
 => [eureka7001 3/3] RUN bash -c 'touch /wzy_eureka.jar'                          1.0s
 => [eureka7001] exporting to image                                               0.2s
 => => exporting layers                                                           0.2s
 => => writing image sha256:7927120cce252cd5db9ac32eca62c814f6f9005029a9585b9927  0.0s
 => => naming to docker.io/library/wzy-eureka7001                                 0.0s
 => [payment8001 internal] load build definition from Dockerfile                  0.0s
 => => transferring dockerfile: 606B                                              0.0s
 => [payment8002 internal] load build definition from Dockerfile                  0.0s
 => => transferring dockerfile: 606B                                              0.0s
 => [payment8002 internal] load .dockerignore                                     0.0s
 => => transferring context: 2B                                                   0.0s
 => [payment8001 internal] load .dockerignore                                     0.0s
 => => transferring context: 2B                                                   0.0s
 => [payment8001 internal] load build context                                     0.5s
 => => transferring context: 66.18MB                                              0.5s
 => [payment8002 internal] load build context                                     0.5s
 => => transferring context: 60.94MB                                              0.5s
 => [payment8001 2/3] ADD cloud-provider-payment8001-1.0-SNAPSHOT.jar wzy_paymen  0.5s
 => [payment8002 2/3] ADD cloud-provider-payment8002-1.0-SNAPSHOT.jar wzy_paymen  0.6s
 => [payment8001 3/3] RUN bash -c 'touch /wzy_payment8001.jar'                    0.9s
 => [payment8002 3/3] RUN bash -c 'touch /wzy_payment8002.jar'                    0.7s
 => [payment8001] exporting to image                                              0.3s
 => => exporting layers                                                           0.3s
 => => writing image sha256:983970a54834e6e04ad037f12e5623fd43fc270d5358173ab8a9  0.0s
 => => naming to docker.io/library/wzy-payment8001                                0.0s
 => [payment8002] exporting to image                                              0.3s
 => => exporting layers                                                           0.3s
 => => writing image sha256:f9ba7c533f0efb7138d0906c10c26a66b4bd3bb73d79317dbd8d  0.0s
 => => naming to docker.io/library/wzy-payment8002                                0.0s
[+] Running 6/6
 ✔ Network wzy_wzy_net          Created                                           0.9s 
 ✔ Container wzy-eureka7001-1   Started                                           1.2s 
 ✔ Container wzy-redis-1        Started                                           1.5s 
 ✔ Container wzy-mysql-1        Started                                           1.6s 
 ✔ Container wzy-payment8001-1  Started                                           4.7s 
 ✔ Container wzy-payment8002-1  Started 
[root@localhost wzy]#

以上全部Started就是成功。

注意:上面编排后生成的名字有一些变化,比如redis服务名变成了wzy-redis-1,这是在没有指定名字的情况下docker自己加的,并不影响使用

建表

这时,mysql会根据编排文件自动建立mybatis-plus库,但并不会自动建表:

[root@localhost wzy]# docker ps
CONTAINER ID   IMAGE             COMMAND                   CREATED         STATUS         PORTS                                                  NAMES
afe3ca78cc28   wzy-payment8002   "java -jar /wzy_paym…"   8 seconds ago   Up 4 seconds   0.0.0.0:8002->8002/tcp, :::8002->8002/tcp              wzy-payment8002-1
6e169d6e50de   wzy-payment8001   "java -jar /wzy_paym…"   8 seconds ago   Up 4 seconds   0.0.0.0:8001->8001/tcp, :::8001->8001/tcp              wzy-payment8001-1
490549ec53e8   wzy-eureka7001    "java -jar /wzy_eure…"   8 seconds ago   Up 6 seconds   0.0.0.0:7001->7001/tcp, :::7001->7001/tcp              wzy-eureka7001-1
2d9e86240ee2   mysql:latest      "docker-entrypoint.s…"   20 hours ago    Up 6 seconds   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   wzy-mysql-1
d8f5e56fde6d   redis:6.2.6       "docker-entrypoint.s…"   20 hours ago    Up 6 seconds   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              wzy-redis-1
[root@localhost wzy]# docker exec -it 2d9e86240ee2 /bin/bash
root@2d9e86240ee2:/# mysql -u wzy -p
Enter password: 
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 8
Server version: 8.0.27 MySQL Community Server - GPL

Copyright (c) 2000, 2021, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| information_schema |
| mybatis-plus       |
+--------------------+
2 rows in set (0.01 sec)

mysql> use mybatis-plus;
Database changed
mysql> select * from number_test;
ERROR 1146 (42S02): Table 'mybatis-plus.number_test' doesn't exist
mysql> 

我们需要手动建表,不然8001服务执行新增会报错:

mysql> CREATE TABLE `number_test` (
    ->   `one` int NOT NULL,
    ->   `two` varchar(255) DEFAULT NULL,
    ->   `three` varchar(255) DEFAULT NULL,
    ->   `four` varchar(255) DEFAULT NULL,
    ->   PRIMARY KEY (`one`)
    -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
Query OK, 0 rows affected (0.05 sec)

mysql> select * from number_test;
Empty set (0.10 sec)

mysql> 

验证

宿主机直接访问我的虚拟机erueka,可以看到有应用列表有8001与8002,二者成功注册到eureka中

image-20240518223908364

或者直接虚拟机里看:

image-20240518224000097

执行8001的controller,插入数据

image-20240518224101215

image-20240518224139541

验证8002-redis服务

先看所有的key,这是没有:

[root@localhost wzy]# docker ps
CONTAINER ID   IMAGE             COMMAND                   CREATED          STATUS          PORTS                                                  NAMES
0bb97a880a91   wzy-payment8001   "java -jar /wzy_paym…"   22 minutes ago   Up 22 minutes   0.0.0.0:8001->8001/tcp, :::8001->8001/tcp              wzy-payment8001-1
918f761ead06   wzy-payment8002   "java -jar /wzy_paym…"   22 minutes ago   Up 22 minutes   0.0.0.0:8002->8002/tcp, :::8002->8002/tcp              wzy-payment8002-1
2d9e86240ee2   mysql:latest      "docker-entrypoint.s…"   22 minutes ago   Up 22 minutes   0.0.0.0:3306->3306/tcp, :::3306->3306/tcp, 33060/tcp   wzy-mysql-1
d8f5e56fde6d   redis:6.2.6       "docker-entrypoint.s…"   22 minutes ago   Up 22 minutes   0.0.0.0:6379->6379/tcp, :::6379->6379/tcp              wzy-redis-1
240276cd95f1   wzy-eureka7001    "java -jar /wzy_eure…"   22 minutes ago   Up 22 minutes   0.0.0.0:7001->7001/tcp, :::7001->7001/tcp              wzy-eureka7001-1

[root@localhost wzy]# docker exec -it d8f5e56fde6d /bin/bash
root@d8f5e56fde6d:/data# redis-cli
127.0.0.1:6379> keys *
(empty array)
127.0.0.1:6379> 

然后虚拟机中请求:

image-20240518224358216

再查看redis:

image-20240518224509531



注意点

如果遇到问题需要重新编排,或者修改了微服务的yaml配置或代码,要记得将镜像与容器一并删除,在重新编排。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1683180.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何彻底搞懂迭代器(Iterator)设计模式?

说起迭代器&#xff08;Iterator&#xff09;&#xff0c;相信你并不会陌生&#xff0c;因为我们几乎每天都在使用JDK中自带的各种迭代器。那么&#xff0c;这些迭代器是如何构建出来的呢&#xff1f;就需要用到了今天内容要介绍的迭代器设计模式。在日常开发过程中&#xff0c…

刷题之将有序数组转换成二叉搜索树(leetcode)

将有序数组转换成二叉搜索树 正常递归&#xff0c;中序遍历 递归经常会把自己绕晕&#xff0c;还是得画图分析 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(null…

【LeetCode 随笔】面试经典 150 题【中等+困难】持续更新中。。。

文章目录 380.【中等】O(1) 时间插入、删除和获取随机元素238.【中等】除自身以外数组的乘积134.【中等】 加油站135.【困难】分发糖果42.【困难】接雨水 &#x1f308;你好呀&#xff01;我是 山顶风景独好 &#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面…

【Docker实操】启动redis服务

一、步骤 1、获取redis镜像 执行获取redis镜像命令&#xff1a;docker pull redis。打印镜像清单&#xff0c;可以看到新拉到的redis镜像。 2、创建redis.conf配置文件 linux主机 mkdir -p /root/www/redis/conf touch /root/www/redis/conf/redis.conf cat << EOF &…

vue中数据已经改变了,但是table里面内容没更新渲染!

解决方案&#xff1a; 给table或者el-table标签上添加一个动态key值&#xff0c;只要数据发生改变&#xff0c;key值变动一下即可 标签上&#xff1a; :key“timeStamp” 初始data&#xff1a;timeStamp:0, 更新数据&#xff1a;this.timeStamp 这样每次更新数据&#xff…

网络的基础理解

文章目录 网络的基础认识 网络协议协议分层OSI七层模型TCP/IP 五层/四层 模型 网络的基础认识 先来看下面几个问题 什么是网络&#xff1f; 网络就是有许多台设备包括计算机单不仅限于计算机&#xff0c;这些设备通过相互通信所组成起来系统&#xff0c;我们称之为网络所以如…

通过 Spring 操作 Redis

要想通过 Java 操作 redis&#xff0c;首先要连接上 redis 服务器&#xff0c;推荐看通过 Java 操作 redis -- 连接 redis 创建项⽬ 勾选 NoSQL 中的 Spring Data Redis 当然, 把 Web 中的 Spring Web 也勾选⼀下.⽅便写接进⾏后续测试. 配置 redis 服务地址 在 application.…

CF451E: Devu and Flowers(容斥原理 + 考虑反面 + golang组合模版)

题目截图 题目翻译 题目分析 正难则反&#xff0c;考虑所有不符合的例子 由于n很小&#xff0c;所以可以状态压缩二进制遍历完全部不符合例子的组合 对于不符合的例子&#xff0c;假设其中第i个不符合&#xff0c;那么就消耗掉fi 1个球 以此类推&#xff0c;减剩下s2个球 这时…

盘点28个免费域名申请大全

盘点28个免费域名申请大全 免费域名推荐学习使用&#xff0c;免费就意味着没任何保障。 名称稳定时间支持解析模式后缀格式说明地址EU.org28 年NS.eu.org/. 国家简写.eu.org需要审核&#xff0c;稳定性高&#xff0c;限制少&#xff0c;国内访问有问题&#xff0c;可 CFeu.orgp…

关于「公 告」根据中华人民共和国法律,Bing 在中国内地暂停 “搜索自动建议” 功能 30 天

当我看见我们大家都这样我可放心了&#xff0c;我打开电脑搜索图片就发生了。 当我看见我们大家都这样我可放心了&#xff0c;坐等攻城狮修复。

前端vue用el-table如何实现表头内容过长换行处理,实现换行效果

前端vue用el-table如何实现表头内容过长换行处理&#xff0c;实现换行效果 这是效果图 有两种方法&#xff0c;一种简易版本&#xff0c;一种万能方法,都是el-table&#xff0c;先看文档 表头标题是可以自定义的 方法一 label的解释写在代码里面了&#xff0c;这里会自动形成换…

六零导航页 file.php 任意文件上传漏洞复现(CVE-2024-34982)

0x01 产品简介 LyLme Spage(六零导航页)是中国六零(LyLme)开源的一个导航页面。致力于简洁高效无广告的上网导航和搜索入口,支持后台添加链接、自定义搜索引擎,沉淀最具价值链接,全站无商业推广,简约而不简单。 0x02 漏洞概述 六零导航页 file.php接口处任意文件上传…

中银基金软件开发工程师春招群面记录

本文介绍2024届春招中&#xff0c;中国银行下属中银基金管理有限公司的软件开发工程师岗位1场面试的基本情况、提问问题等。 2024年04月投递了中国银行的共计4个部门或单位&#xff0c;包括中银基金管理有限公司的软件开发工程师岗位&#xff0c;暂时不清楚所在部门。目前完成了…

AWS安全性身份和合规性之Artifact

AWS Artifact是对您很重要的与合规性相关的信息的首选中央资源。AWS Artifact是一项服务&#xff0c;提供了一系列用于安全合规的文档、报告和资源&#xff0c;以帮助用户满足其合规性和监管要求。它允许按需访问来自AWS和在AWS Marketplace上销售产品的ISV的安全性和合规性报告…

I.MX6Ull交叉编译QT项目并用u盘拷贝到开发板下

1.安装交叉编译器 2.命令行交叉编译Qt项目 3.拷贝编译好的执行程序到开发板运行 下载到虚拟机 修改权限chom u x 名称 执行完后&#xff0c;变色 执行脚本文件&#xff0c;使能 source /opt/fsl-imx-x11/4.1.15-2.1.0/environment-setup-cortexa7hf-neon-poky-linux-gnueabi …

利用远控工具横向

一.横向移动介绍和方式 1.介绍 内网渗透的横向移动是指攻击者在成功进入内网后&#xff0c;通过利用内部系统的漏洞或者获取的合法访问权限&#xff0c;从一个受感染的系统向其他系统扩散或移动。这种横向移动的目的通常是为了获取更多的敏感信息、提升权限、扩大攻击面或者更…

将PCD点云投影到BEV平面得到图片

前言 点云数据作为一种丰富的三维空间信息表达方式&#xff0c;通常用于自动驾驶、机器人导航和三维建模等领域。然而&#xff0c;点云数据的直观性不如二维图像&#xff0c;这限制了它在一些需要快速视觉反馈的应用场景中的使用。本文将探讨如何将点云数据转换为二维图像&…

【传知代码】从零开始搭建图像去雾神经网络-论文复现

文章目录 概述原理介绍网络结构 核心逻辑迁移学习子网数据拟合子网 环境配置训练本次复现代码所用数据集测试本次复现代码所用的评价指标 结果展示在O-Haze数据集上的结果在I-Haze数据集上的结果 小结 本文涉及的源码可从从零开始搭建图像去雾神经网络该文章下方附件获取 本文复…

React中显示数据

SX 会让你把标签放到 JavaScript 中。而大括号会让你 “回到” JavaScript 中&#xff0c;这样你就可以从你的代码中嵌入一些变量并展示给用户。例如&#xff0c;这将显示 user.name&#xff1a; return (<h1>{user.name}</h1> ); 你还可以将 JSX 属性 “转义到 …

内网安全之搭建ADCS证书服务

在域控上安装ADCS服务时&#xff0c;默认会自动配置完LDAPS&#xff0c;如果不是在域控上安装ADCS服务&#xff0c;需要手动配置LDAPS 安装证书服务ADCS 打开服务器管理器——>添加角色和功能 选择“基于角色或基于功能的安装”选项&#xff0c;然后点击下一步 选择“从…