十七、Docker Compose容器编排第二篇

导读:本篇文章讲解 十七、Docker Compose容器编排第二篇,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com

在上一篇中我们讲解了容器编排是什么、能干什么、怎么安装、使用步骤,如果没有看的大家可以先看下: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项目

  • 项目整体结构

十七、Docker Compose容器编排第二篇

  • 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 .“

十七、Docker Compose容器编排第二篇

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

十七、Docker Compose容器编排第二篇

十七、Docker Compose容器编排第二篇

调用接口向redis存储数据

十七、Docker Compose容器编排第二篇 调用接口从redis中获取数据

十七、Docker Compose容器编排第二篇

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

十七、Docker Compose容器编排第二篇

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/84237.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!