在上一篇中我们讲解了容器编排是什么、能干什么、怎么安装、使用步骤,如果没有看的大家可以先看下: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.yaml
compose.yml
docker-compose.yaml
docker-compose.yml
compose.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中获取数据
以:” docker compose exec redis01 /bin/bash“ 命令进入redis验证数据是否已存储成功。