Docker Compose快速部署多容器服务实战的实例详解

bangongJIAO1@c 发布于 2025-12-19 阅读(5)
目录
  • 1 什么是Docker Compose
  • 2 安装Docker Compose
  • 3 Docker Compose文件格式的简单介绍
  • 4 Docker Compose常用命令
  • 5 使用Docker Compose一键部署Spring Boot+Redis实战
    • 5.1 构建应用
      • 5.1.1 Spring Boot项目
      • 5.1.2 Redis配置文件
    • 5.2 打包应用并构建目录
      • 5.2.1 打包Spring Boot项目
      • 5.2.2 上传redis.conf配置文件
    • 5.3 编写Dockerfile
      • 5.3.1 Spring Boot容器的Dockerfile
      • 5.3.2 redis容器的Dockerfile
    • 5.4 编写docker-compose.yml
      • 5.5 运行并测试部署结果
      • 6 小总结

        1 什么是Docker Compose

        前面我们使用 Docker 的时候,定义 Dockerfile 文件,然后使用 docker build、docker run 等命令操作容器。然而微服务架构的应用系统一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,那么效率之低,维护量之大可想而知。

        使用 Docker Compose 可以轻松、高效的管理容器,它是一个用于定义和运行多容器 Docker 的应用程序工具

        2 安装Docker Compose

        安装命令:

        [root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
        [root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# chmod +x /usr/local/bin/docker-compose

        检查是否安装成功:

        [root@iZ2ze4m2ri7irkf6h6n8zoZ ~]# docker-compose -v

        3 Docker Compose文件格式的简单介绍

        Docker Compose文件一般命名为docker-compose.yml,并且执行Docker-compose命令时在该文件所在目录下执行。

        Docker Compose 分为三层,分别是工程(project)、服务(service)/引用标签、容器(container)

        例如:

        docker-compose.yml   # 一个文件代表一个project
         serveices:          # 服务
           container-name:   # 容器
             build: 
              - xxx:xxx
         network:            # 引用标签
           xxx:

        下面是一个标准的docker-compose.yml文件

        version: "3"  # 指定版本
        services:     # services
          proxy:      # 自定义容器名称
            build: ./proxy  # Dockerfile所在目录,用于构建容器
            networks: # 自定义容器网络
              - frontend
          app:       
            build: ./app
            networks:
              - frontend
              - backend
          db:
            image: postgres
            networks:
              - backend
        networks:
          frontend:
            driver: custom-driver-1
          backend:
            driver: custom-driver-2
            driver_opts:
              foo: "1"
              bar: "2"

        4 Docker Compose常用命令

        ps:列出所有运行容器

        docker-compose ps

        logs:查看服务日志输出

        docker-compose logs

        port:打印绑定的公共端口,下面命令可以输出 eureka 服务 8761 端口所绑定的公共端口

        docker-compose port eureka 8761

        build:构建或者重新构建服务

        docker-compose build

        start:启动指定服务已存在的容器

        docker-compose start eureka

        stop:停止已运行的服务的容器

        docker-compose stop eureka

        rm:删除指定服务的容器

        docker-compose rm eureka

        up:构建、启动容器

        docker-compose up

        kill:通过发送 SIGKILL 信号来停止指定服务的容器

        docker-compose kill eureka

        pull:下载服务镜像

        docker-compose pull eureka

        scale:设置指定服务运气容器的个数,以 service=num 形式指定

        docker-compose scale user=3 movie=3

        run:在一个服务上执行一个命令

        docker-compose run web bash

        5 使用Docker Compose一键部署Spring Boot+Redis实战

        5.1 构建应用

        5.1.1 Spring Boot项目

        依赖:

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <!--redis-->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>

        配置文件:

        spring:
          redis:
            #host: 127.0.0.1
            host: ymx.redis
            port: 6379
            password:
            jedis:
              pool:
                max-active: 8
                max-wait: -1
                max-idle: 500
                min-idle: 0
            lettuce:
              shutdown-timeout: 0

        controller代码:

        @RestController
        public class HelloController {
        
            @Autowired
            private RedisTemplate<String, String> redisTemplate;
            @RequestMapping("/hello/{id}")
            public String hello(@PathVariable("id") Integer id) {
                return redisTemplate.opsForValue().get(String.valueOf(id));
            }
            @RequestMapping("/save/{id}/{name}")
            public String save(@PathVariable("id") Integer id, @PathVariable("name") String name) {
                try {
                    redisTemplate.opsForValue().set(String.valueOf(id), "Hello " + name + "!");
                } catch (Exception e) {
                    return "false";
                }
                return "success";
        }

        5.1.2 Redis配置文件

        只是将redis自带的redis.conf做了一点修改

        #注释掉bind 127.0.0.1
        # bind 127.0.0.1 -::1
        #修改protected-mode yes->no
        protected-mode no

        5.2 打包应用并构建目录

        5.2.1 打包Spring Boot项目

        Docker Compose快速部署多容器服务实战的实例详解

        5.2.2 上传redis.conf配置文件

        5.2.3 目录结构

        - mycompose
          - docker-compose.yml 
          - rd  
            - Dockerfile  
            - redis.conf
          - sp
            - Dockerfile  
            - sp_redis-0.0.1-SNAPSHOT.jar

        5.3 编写Dockerfile

        5.3.1 Spring Boot容器的Dockerfile

        FROM java:8
        
        MAINTAINER YMX "1712229564@qq.com"
        COPY sp_redis-0.0.1-SNAPSHOT.jar /root/sp_redis-0.0.1-SNAPSHOT.jar
        EXPOSE 8080
        ENTRYPOINT ["java", "-jar","/root/sp_redis-0.0.1-SNAPSHOT.jar"]

        5.3.2 redis容器的Dockerfile

        FROM redis
          
        MAINTAINER ymx 1712229564@qq.com
        COPY redis.conf /usr/local/etc/redis/redis.conf
        EXPOSE 6379
        CMD ["redis-server","/usr/local/etc/redis/redis.conf" ]

        5.4 编写docker-compose.yml

        version: "2.8" # 表示该 Docker-Compose 文件使用的是 Version 2 file
        services:
          sp-demo:       # 指定服务名称
            build: ./sp  # 指定 Dockerfile 所在路径
            ports:       # 指定端口映射
              - "9001:8080"
            links:
              - re-demo:ymx.redis # 进行容器链接
          re-demo:
            build: ./rd

        5.5 运行并测试部署结果

        运行:

        [root@iZ2ze4m2ri7i mycompose]# docker-compose up
        Creating network "mycompose_default" with the default driver
        Building re-demo
        Sending build context to Docker daemon  96.77kB
        Step 1/5 : FROM redis
        latest: Pulling from library/redis
        ......

        测试:

        [root@iZ2ze4m2ri7i mycompose]# curl http://localhost:9001/save/2/Ymx
        success
        [root@iZ2ze4m2ri7i mycompose]# curl http://localhost:9001/hello/2
        Hello Ymx!

        6 小总结

        在Spring Boot配置文件中,redis的host没有使用localhost或者127.0.0.1,而是使用了域名ymx.redis,这一域名在docker-compose.yml文件中进行了映射,进而Spring Boot的容器能够链接到redis容器,但是这一情况依赖于一个默认条件,就是docker的网络默认是桥接模式,两个容器都在同一子网中,因此才能够互相访问。

        因此,links并不是唯一的容器网络解决方案,在容器较多时,需要使用networks进行网络的管理。

        参考文章:

        https://www.jianshu.com/p/658911a8cff3

        https://www.jianshu.com/p/3004fbce4d37

        https://blog.csdn.net/luo15242208310/article/details/88642187

        https://blog.csdn.net/qq_36781505/article/details/86612988