在上一篇中我们讲解了容器编排是什么、能干什么、怎么安装、使用步骤,如果没有看的大家可以先看下:https://blog.csdn.net/u011837804/article/details/128335166,然后继续看这一篇,好了,我们继续。
1、Docker Componse常用命令
| 命令 | 描述 | 
|---|---|
| docker compose --help | 查看容器编排命令帮助文档 | 
| docker compose up | 创建并启动编排的所有容器 | 
| docker compose up -d | 创建并启动编排的所有容器并后台运行 | 
| docker compose down | 停止并删除容器、网络、卷、镜像 | 
| docker compose exec docker-compose.yml文件中写的服务id /bin/bash | 进入容器实例内部 | 
| docker compose ps | 展示当前docker-compose编排过的运行的所有容器 | 
| docker compose top | 展示当前docker-compose编排过的容器进程 | 
| docker compose logs yml里面的服务id | 查看容器输出日志 | 
| docker compose config | 检查docker-compose.yml 配置是否正确 | 
| docker compose config -q | 检查配置,有问题才有输出 | 
| docker compose restart | 重启服务 | 
| docker compose start | 启动服务 | 
| docker compose stop | 停止服务 | 
| docker compose rm | 移除已停止的服务容器 | 
| docker compose kill 服务id | 强制停止服务容器 | 
| docker compose images 服务id | 列出创建服务容器用到的镜像 | 
| docker compose pause 服务id | 暂停服务容器 | 
| docker compose unpause 服务id | 暂停后,恢复容器 | 
经常用的就是这些命令,我们在编排微服务项目中,看看这些命令怎么用
2、componse文件编写规范
最新官网编写规范:https://github.com/compose-spec/compose-spec/blob/master/spec.md
官网文档:Compose specification | Docker Documentation
Compose文件是一个YAML文件,在这个文件中定义了services (这个是必须的,说白了就是需要哪些镜像), networks(网络), volumes(容器卷), configs(配置) and secrets(秘钥)。
Compose文件名可以是compose.yamlcompose.ymldocker-compose.yamldocker-compose.ymlcompose.yaml但是首选的是compose.yaml ,可以多个同时存在,但时候需要设置执行先后顺序。在下面微服务项目中我们就用compose.yml 作为文件名字。
实例:我们再编写微服务项目的时候,以这个参考改写即可
# 定义服务
services:
  # 这个是我们微服务项目
  goods_test:
    # 使用那个镜像
    image: goods:1.0
    # 端口映射
    ports:
      - "8080:8080"
    # 使用网络
    networks:
      - my-net
    # 配置
    configs:
      - httpd-config
    # 秘钥
    secrets:
      - server-certificate
    # 依赖服务,这里表示  需要先启动 redis01 服务然后再启动 咱们的微服务项目 goods_test
    depends_on:
      - redis01
    # 在什么环境下启动本服务 这个和我们微服务yml文件比较类似,这里表示 在test环境下启动goods_test服务        
    profiles:
      - test
  # redis服务
  redis01:
    # redis服务使用镜像
    image: redis:6.0.8
    # 容器卷
    volumes:
      - /usr/local/tool/volumn/redis/node-2:/data
    networks:
      - my-net
# 容器卷
volumes:
  db-data:
    driver: flocker
    driver_opts:
      size: "10GiB"
# 配置
configs:
  httpd-config:
    external: true
# 定义秘钥
secrets:
  server-certificate:
    external: true
# 定义网络
networks:
  my-net: {}3、使用Docker Componse 编排微服务项目
概述:我们创建jdk1.8的springboot项目hello_docker,并且连接redis,提供redis crud接口
2.1、开发springboot项目
- 项目整体结构

- 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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.liuchao</groupId>
    <artifactId>hello_docker</artifactId>
    <version>1.0-SNAPSHOT</version>
    <name>hello_docker</name>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.7.0</version>
    </parent>
    <properties>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <maven.compiler.source>1.8</maven.compiler.source>
        <maven.compiler.target>1.8</maven.compiler.target>
        <spring-cloud-alibaba.version>2021.1</spring-cloud-alibaba.version>
    </properties>
    <dependencyManagement>
        <dependencies>
            <!--spring cloud alibaba-->
            <dependency>
                <groupId>com.alibaba.cloud</groupId>
                <artifactId>spring-cloud-alibaba-dependencies</artifactId>
                <version>${spring-cloud-alibaba.version}</version>
                <type>pom</type>
                <scope>import</scope>
            </dependency>
        </dependencies>
    </dependencyManagement>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-redis</artifactId>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-deploy-plugin</artifactId>
                <!--deploy 时忽略-->
                <configuration>
                    <skip>true</skip>
                </configuration>
            </plugin>
        </plugins>
    </build>
</project>
- yml
## 激活对应的profile
spring:
  application:
    name: hello_docker
---
#################################本地环境##########################
server:
  port: 6001
spring:
  redis:
    host: redis01
    port: 6379
  config:
    activate:
      on-profile: local
---
#################################测试环境##########################
server:
  port: 7001
spring:
  redis:
    host: redis01
    port: 6379
  config:
    activate:
      on-profile: test
---
#################################生产环境##########################
server:
  port: 8001
spring:
  redis:
    host: redis01
    port: 6379
  config:
    activate:
      on-profile: prod
---注意:这里连接redis是以服务名称来连接的,应为docker中容器IP可能变化,实际生产中需要以服务名称连接各项中间件。
- 启动类
package com.liuchao.liuchao;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
/**
 * @author liuchao
 * @date 2022/12/13
 */
@SpringBootApplication
public class DockerApplication {
    public static void main(String[] args) {
        SpringApplication.run(DockerApplication.class, args);
    }
}
- controller
package com.liuchao.liuchao.controller;
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.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
/**
 * @author liuchao
 * @date 2022/12/13
 */
@RestController
@RequestMapping("/test")
public class TestController {
    @Autowired
    RedisTemplate redisTemplate;
    /**
     * 存储至redis
     *
     * @param key
     * @param val
     * @return java.lang.String
     * @author liuchao
     * @date 2022/12/16
     */
    @GetMapping("/save/{key}/{val}")
    public String save(@PathVariable String key, @PathVariable String val) {
        redisTemplate.opsForValue().set(key, val);
        return "ok";
    }
    /**
     * 从redis获取
     *
     * @param key
     * @return java.lang.String
     * @author liuchao
     * @date 2022/12/16
     */
    @GetMapping("/get/{key}")
    public String get(@PathVariable String key) {
        return redisTemplate.opsForValue().get(key) + "";
    }
}
2.1、编写Dockerfile文件并构建镜像
- Dockerfile内容
# 基础镜像使用java
FROM java:8
 
# 作者
MAINTAINER liuchao
 
# VOLUME 指定临时文件目录为/tmp,在主机/var/lib/docker目录下创建了一个临时文件并链接到容器的/tmp
VOLUME /tmp
 
# 将jar包添加到容器中并更名为hello_docker.jar
ADD hello_docker-1.0-SNAPSHOT.jar hello_docker.jar
# 运行 这里指定启动环境
RUN bash -c 'touch /hello_docker.jar'
ENTRYPOINT ["java","-jar","/hello_docker.jar", "--spring.profiles.active=test"]
# 暴露端口
EXPOSE 7001 
- 构建镜像
构建命令:”docker build -t hello_docker:1.0 .“

2.2、编写docker-componse.yml文件
# 定义服务
services:
  # 服务项目
  hello_docker:
    # 使用那个镜像
    image: hello_docker:1.0
    # 端口映射
    ports:
      - "7001:7001"
    # 使用网络
    networks:
      - my-net
    depends_on:
      - redis01
  # redis服务
  redis01:
    # redis服务使用镜像
    image: redis:6.0.8
    # 端口映射
    ports:
      - "6379:6379"
    # 容器卷
    volumes:
      - /usr/local/tool/volumn/redis/node-001:/data
    networks:
      - my-net
# 定义网络
networks:
  my-net: {}2.3、创建并启动容器
涉及命令:
- 创建并前台启动容器:docker compose up
- 创建并后台启动容器:docker compose up -d


调用接口向redis存储数据
 调用接口从redis中获取数据
 调用接口从redis中获取数据

以:” docker compose exec redis01 /bin/bash“ 命令进入redis验证数据是否已存储成功。




















