Docker--Docker Compose容器编排工具

Docker Compose

现在很多应用都是通过多个微服务组成一个完整应用。例如订单管理、用户管理、品类管理等组成一个电商平台,然而部署和管理大量的服务容器非常繁琐,而Docker Compose就是来解决这个问题的。

Docker Compose 是一个安装在Docker主机上的Docker 容器编排外部工具。其通过一个声明式的配置文件描述整个应用,然后通过一条命令完成应用部署。部署成功后,可通过一系列简单命令完成其生命周期管理。

Docker Compose 的前身是Fig(无花果)

Compose文件

Docker Compose 使用YAML文件来定义服务,默认文件名为compose.yml,同时也支持docker-compose.yml。

由于一个compose文件为一个项目服务,所以一般在创建compose文件前,先建一个目录,目录名称一般为项目名称,然后再将项目所需的所有镜像、微服务的Dockerfile 放入该目录,并在该目录中新建compose文件。

compose文件包含6个顶级属性:version、services、networks、volumes、configs、secrets,及其子属性。

  • version:顶级属性,但是已过时,不再需要出现在compose文件中。

  • networks:顶级属性,用于定义与创建网络。常用属性如下:

    services:
      apps: # 服务名称
        networks:
          - app_bridge: # 这里使用的不是网络名称
    networks:
      app_bridge:
        name: appBGnet #这才是网络名称
        driver: bridge # 网络驱动,缺省为bridge
        attachable:    #true表示除了当前compose中定义的服务外,其他独立容器也可以连接到此网络,并能与该网络的其他独立容器通信,缺省状态为false
    
  • volumes:顶级属性,用于定义和创建应用中所用到的所有volume。

  • services:顶级属性,用于定义一个应用所包含的服务。Docker Compose 会将每个服务部署在各自容器中。

常用命令

docker-compose pull # 拉取compose中服务依赖的全部镜像或指定镜像。
docker-compose config # 检查compose文件是否正确,添加-q 表示只有存在问题才有输出
docker-compose up # 启动所有容器
docker-compose logs # 查看所有服务或指定服务的运行日志。
docker-compose ps # 列出所有服务或指定服务
docker-compose top # 列出正在运行的所有服务或指定服务
docker-compose images # 列出所有服务镜像或指定镜像
docker-compose port # 列出指定容器的指定端口所映射的宿主机端口
docker-compose run # 在指定服务上执行一条命令
docker-compose exec # 进入指定容器
docker-compose pause # 暂停compose中所有容器或指定容器
docker-compose unpause # 恢复处于暂停状态的compose中所有容器或指定容器
docker-compose stop # 停止compose中所有容器或指定容器
docker-compose restart # 重新启动compose中所有容器或指定容器
docker-compose start # 启动compose中所有容器或指定容器
docker-compose kill #停止指定容器
docker-compose rm # 删除处于停止状态的容器或指定容器
docker-compose down # 停止并删除所有容器、网络、镜像、数据卷

安装

  1. 下载安装包

    curl -SL https://github.com/docker/compose/releases/download/v2.12.2/docker-compose-linux-x86_64 -o /usr/local/bin/docker-compose
    

    下载比较慢,多尝试几次!

  2. 添加可执行权限

    chmod +x /usr/local/bin/docker-compose
    
  3. 测试安装是否成功

    docker-compose version
    

项目构建

spring boot项目 整个一个Redis和MySQL服务器。

  1. POM文件

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>4.0.6</version>
            <relativePath/> <!-- lookup parent from repository -->
        </parent>
        <groupId>com.ali</groupId>
        <artifactId>docker-compose-project</artifactId>
        <version>0.0.1-SNAPSHOT</version>
        <name>docker-compose-project</name>
        <description>docker-compose-project</description>
        <url/>
        <licenses>
            <license/>
        </licenses>
        <developers>
            <developer/>
        </developers>
        <scm>
            <connection/>
            <developerConnection/>
            <tag/>
            <url/>
        </scm>
        <properties>
            <java.version>17</java.version>
        </properties>
        <dependencies>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-data-redis</artifactId>
            </dependency>
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
            </dependency>
            <dependency>
                <groupId>org.mybatis.spring.boot</groupId>
                <artifactId>mybatis-spring-boot-starter</artifactId>
                <version>4.0.1</version>
            </dependency>
            <dependency>
                <groupId>mysql</groupId>
                <artifactId>mysql-connector-java</artifactId>
                <version>8.0.30</version>
            </dependency>
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>druid</artifactId>
                <version>1.1.23</version>
            </dependency>
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
                <version>1.2</version>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-test</artifactId>
            </dependency>
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
            </plugins>
        </build>
    
    </project>
    
    
  2. 实体类

    @Data
    public class Product implements Serializable {
    
        private Integer id;
        private String name;
        private Double rate;
        private Double amount;
        private Double raised;
        private Integer cycle;
        private String endTime;
    }
    
  3. sql文件

    CREATE DATABASE IF NOT EXISTS `test`; 
    USE `test`; 
    DROP TABLE IF EXISTS `product`; 
    CREATE TABLE `product` ( 
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(20) DEFAULT NULL, 
    `rate` double DEFAULT NULL, 
    `amount` double DEFAULT NULL, 
    `raised` double DEFAULT NULL, 
    `cycle` int(11) DEFAULT NULL, 
    `endTime` char(10) DEFAULT '0', 
    PRIMARY KEY (`id`) 
    ) ENGINE=InnoDB AUTO_INCREMENT=9 DEFAULT CHARSET=utf8; 
    
    INSERT INTO `product` VALUES (1,'TXTY',2.76,50000,20000,30,'2022-07-10'),(2,'GTTY',2.86,30000,30000,60,'2
    022-07-12'),(3,'GTGX',2.55,60000,50000,90,'2022-07-09'),(4,'GFMA',2.96,30000
    ,20000,7,'2022-05-10'),(5,'TYXD',2.65,80000,60000,20,'2022-07-05'),(6,'HNSY'
    ,3.05,30000,20000,10,'2022-06-10'),(7,'HNSX',2.76,50000,30000,30,'2022-07-02
    '),(8,'LXSY',2.86,30000,20000,20,'2022-07-11'); 
    
  4. controller类

    @RestController
    public class ProductController {
    
        @Autowired
        private ProductService productService;
    
        @GetMapping("/")
        public String index() {
            List<Product> allProducts = productService.getAllProducts();
            StringBuilder sb = new StringBuilder();
            for (Product product : allProducts) {
                sb.append(product).append("<br>");
            }
            return sb.toString();
        }
    }
    

    后面还有乱起八糟的Service 、ServiceImpl 、Dao、Xml映射文件等就不列出了。

  5. 配置文件

    spring:
        datasource:
          url: jdbc:mysql://192.168.192.101:3306/your_database_name?useSSL=false&serverTimezone=UTC
          username: your_username
          password: your_password
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
        redis: # 配置单机版
            host: 192.168.192.101
            port: 6379
    
    mybatis:
        # 注册映射文件
        mapper-locations: classpath:mapper/*.xml
        # 注册实体类所在的包
        type-aliases-package: com.example.yourpackage.model
    logging:
      file:
        name: "/var/applogs/finance.log"
      level:
        root: INFO
        com.example.yourpackage: DEBUG
      pattern:
        file: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
        console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
    
  6. 启动类:启动类加@EnableCaching 注解

定义Dockerfile

在Docker 主机的任意目录中新建一个目录,名称与项目名称相同。然后新建Dockerfile文件。

FROM swr.cn-north-4.myhuaweicloud.com/ddn-k8s/docker.io/openjdk:17
MAINTAINER zhangsan zs@163.com 
LABEL version="1.0" description="this is a spring boot application" 
COPY ssrm-0.0.1-SNAPSHOT.jar ssrm.jar 
ENTRYPOINT ["java", "-jar", "ssrm.jar"] 
EXPOSE 8080 

然后将项目打成jar包,并上传到对应的目录。

手动启动项目

  1. 启动MySQL容器

    docker run --name mysql -e MYSQL_ROOT_PASSWORD=111 -v /root/mysql/log:/var/log/mysql -v /root/mysql/data:/var/lib/mysql -v /root/mysql/conf:/etc/mysql/conf.d -dp 3306:3306 mysql:5.7 
    

    然后进入MySQL并准备数据。

  2. 启动Redis容器

    docker run --name myredis -v /root/redis/redis.conf:/etc/redis/redis.conf -v /root/redis/data:/data -dp 6379:6379 redis:7.0 redis-server /etc/redis/redis.conf 
    
  3. 启动应用容器

​ 构建应用镜像

docker build -t finance:1.0 .

启动容器

docker run --name myapp -v /root/myapp/log:/var/applogs -dp 9000:8080 finance:1.0 

然后就可以使用9000端口进行访问了!

Compose 编排启动项目

  1. 定义compose.yml

    在刚才的目录中新建一个compose.yml

    services:
      app:
        build: ./
        container_name: myapp
        ports:
          - 9000:8080
        volumes:
          - ./logs:/var/applogs
        depends_on: 
          - mysql
          - redis
      mysql:
        image: mysql:5.7
        environment:
          MYSQL_ROOT_PASSWORD: 111
        ports:
          -3306:3306
        volumes:
          - /root/mysql/log:/var/log/mysql 
          - /root/mysql/data:/var/lib/mysql 
          - /root/mysql/conf:/etc/mysql/conf.d
          
      redis:
        image: redis:7.0
        ports:
          - 6379:6379
        volumes: 
          - /root/redis/redis.conf:/etc/redis/redis.conf 
          - /root/redis/data:/data
        command: redis-server /etc/redis/redis.conf
    
  2. 修改应用。

    修改配置文件,将主机名修改为对应的服务名称

    spring:
        datasource:
          url: jdbc:mysql://mysql:3306/your_database_name?useSSL=false&serverTimezone=UTC
          username: your_username
          password: your_password
          driver-class-name: com.mysql.cj.jdbc.Driver
          type: com.alibaba.druid.pool.DruidDataSource
        redis: # 配置单机版
            host: redis
            port: 6379
    
    mybatis:
        # 注册映射文件
        mapper-locations: classpath:mapper/*.xml
        # 注册实体类所在的包
        type-aliases-package: com.example.yourpackage.model
    logging:
      file:
        name: "/var/applogs/finance.log"
      level:
        root: INFO
        com.example.yourpackage: DEBUG
      pattern:
        file: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
        console: "%d{yyyy-MM-dd HH:mm:ss} %-5level %logger{36} - %msg%n"
    
  3. 重新打包上传

  4. 启动所有容器

无标4题

此时就部署完成了。

指定各组件名称

前面compose.yml 文件中,应用生成的镜像、mysql与redis 生成的容器、加入的bridge网络都是默认的名称。

其实这些名称是可以指定的。

  1. 定义compose2.yml

    services:
      app:
        build: ./
        container_name: someapp
        image: finance:2.0
        ports:
          - 9000:8080
        volumes:
          - ./logs:/var/applogs
        networks:
          - ab
        depends_on: 
          - mysql
          - redis
      mysql:
        image: mysql:5.7
        container_name: somemysql
        environment:
          MYSQL_ROOT_PASSWORD: 111
        ports:
          -3306:3306
        volumes:
          - /root/mysql/log:/var/log/mysql 
          - /root/mysql/data:/var/lib/mysql 
          - /root/mysql/conf:/etc/mysql/conf.d
        networks:
          - ab
      redis:
        image: redis:7.0
        container_name: someredis
        ports:
          - 6379:6379
        volumes: 
          - /root/redis/redis.conf:/etc/redis/redis.conf 
          - /root/redis/data:/data
        networks:
          - ab
        command: redis-server /etc/redis/redis.conf
        
    networks:
      ab:
    
  2. 启动所有容器,通过-f 指定要使用的compose 文件。

    docker-compose -f compose2.yml up -d
    
  3. 查看容器

无5标题

  1. 查看网络

    此时可看到一个新生成的网络

无6标题

posted @ 2026-06-03 17:25  NE_STOP  阅读(36)  评论(0)    收藏  举报