1. 常用docker命令
#安装docker
yum install docker
#启动docker
systemctl start docker
#重启docker
systemctl restart docker
#设置开机启动
systemctl enable docker
#查看本地所有镜像文件
docker images
#拉取镜像
docker pull 镜像名
#根据镜像id删除镜像
docker rmi 镜像id
#查看正在运行的容器
docker ps
#查看所有容器
docker ps -a
#创建并启动容器
#参数说明
## 命令参数详解
#-i:表示运行容器
#-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端(如果只加it两个参数,创建后就会自动进去容器)。
#-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器)。
#--name :为创建的容器命名。
#-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
#-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
docker run 参数 镜像名称:镜像标签 /bin/bash
#停止正在运行的容器
docker stop 容器id
#启动容器
docker start 容器名称(或者容器ID)
#删除容器
docker rm 容器id
#进入正在运行的容器
docker exec -it 容器id /bin/bash
#想要修改容器中配置文件的信息时,先利用下面的命令将文件从容器中拷出到宿主机上
docker cp [容器id]:docker容器中配置文件路径 主机路径
docker cp e4b322a429d1:/etc/grafana/grafana.ini /home/grafana.ini
#在宿主机修改后再利用下面的命令将文件覆盖回容器中
docker cp 主机文件路径 [容器id]:docker容器中配置文件路径
docker cp /home/grafana.ini e4b322a429d1:/etc/grafana/grafana.ini
2.docker部署mysql
#拉mysql镜像
docker pull mysql:5.7
#创建并运行容器,设置端口、目录映射
#参数说明
#-p 3307:3306:将容器的 3306 端口映射到宿主机的 3307 端口。
#-v /root/mysql/logs:/logs:将主机目录(/root/mysql)下的 logs 目录挂载到容器中的 /logs。日志目录
#-v /root/mysql/data:/var/lib/mysql :将主机目录(/root/mysql)下的data目录挂载到容器的 /var/lib/mysql 。数据目录
#-e MYSQL_ROOT_PASSWORD=123456:初始化 root 用户的密码。
docker run -p 3307:3306 --name mysql1 -e MYSQL_ROOT_PASSWORD=gxa123456 -d mysql:5.7
3.docker部署tomcat
#拉取镜像
docker pull tomcat:8.5-jdk8-corretto-al2
#创建并运行容器
#参数说明
#-p 8080:8080:将容器的8080端口映射到主机的8080端口
#-v /root/tomcat/webapps:/usr/local/tomcat/webapps:将主机目录(/root/tomcat/webapps)挂载到容器的webapps
docker run --name tomcat1 -p 9091:8080 -v /root/tomcat/webapp1:/usr/local/tomcat/webapps -d tomcat:8.5-jdk8-corretto-al2
3.docker部署redis
#拉取镜像
docker pull docker.io/redis
#创建并运行容器,设置端口映射
docker run -id --name=myredis -p 6379:6379 docker.io/redis:latest
4.docker部署kafka
#拉取zookeeper
docker pull wurstmeister/zookeeper
#创建并运行zk容器
docker run -d --name zookeeper -p 2181:2181 -t wurstmeister/zookeeper
#安装kafka
docker pull wurstmeister/kafka
#创建并运行容器
#参数说明
#KAFKA_ZOOKEEPER_CONNECT为zk的ip和端口号
#KAFKA_ADVERTISED_HOST_NAME为当前主机的ip
docker run -d --name kafka -p 9092:9092 --link zookeeper -e KAFKA_ZOOKEEPER_CONNECT=101.43.251.178:2181 -e KAFKA_ADVERTISED_HOST_NAME=101.43.251.178 -e KAFKA_HEAP_OPTS="-Xmx256M -Xms128M" -e KAFKA_ADVERTISED_PORT=9092 -v /etc/localtime:/etc/localtime wurstmeister/kafka
#安装kafka图形界面
docker pull sheepkiller/kafka-manager
#启动容器
docker run -itd --name=kafka-manager -p 9000:9000 -e ZK_HOSTS="82.157.232.148:2181" sheepkiller/kafka-manager
5.springboot整合kafka
导入kafka工具类依赖
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
配置yml
spring:
kafka:
#kafka的地址
bootstrap-servers: 49.234.116.49:9092
producer:
# 发生错误后,消息重发的次数。
retries: 0
#当有多个消息需要被发送到同一个分区时,生产者会把它们放在同一个批次里。该参数指定了一个批次可以使用的内存大小,按照字节数计算。
batch-size: 16384
# 设置生产者内存缓冲区的大小。
buffer-memory: 33554432
# 键的序列化方式
key-serializer: org.apache.kafka.common.serialization.StringSerializer
# 值的序列化方式
value-serializer: org.apache.kafka.common.serialization.StringSerializer
# acks=0 : 生产者在成功写入消息之前不会等待任何来自服务器的响应。
# acks=1 : 只要集群的首领节点收到消息,生产者就会收到一个来自服务器成功响应。
# acks=all :只有当所有参与复制的节点全部收到消息时,生产者才会收到一个来自服务器的成功响应。
acks: 1
consumer:
# 自动提交的时间间隔 在spring boot 2.X 版本中这里采用的是值的类型为Duration 需要符合特定的格式,如1S,1M,2H,5D
auto-commit-interval: 1S
# 该属性指定了消费者在读取一个没有偏移量的分区或者偏移量无效的情况下该作何处理:
# latest(默认值)在偏移量无效的情况下,消费者将从最新的记录开始读取数据(在消费者启动之后生成的记录)
# earliest :在偏移量无效的情况下,消费者将从起始位置读取分区的记录
auto-offset-reset: earliest
# 是否自动提交偏移量,默认值是true,为了避免出现重复数据和数据丢失,可以把它设置为false,然后手动提交偏移量
enable-auto-commit: false
# 键的反序列化方式
key-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 值的反序列化方式
value-deserializer: org.apache.kafka.common.serialization.StringDeserializer
# 配置使用默认的消费组ID
group-id: defaultConsumerGroup
listener:
# 在侦听器容器中运行的线程数。
concurrency: 5
#listner负责ack,每调用一次,就立即commit
ack-mode: manual_immediate
missing-topics-fatal: false
5.1 kafka入门程序
编写生产者
@RestController
@RequestMapping("/kafka")
@Slf4j
public class HelloKafkaController {
@Autowired
private KafkaTemplate<String,Object> kafkaTemplate;
@GetMapping("/send/{message}")
public String sendMessage(@PathVariable("message")String message){
log.info("发送消息:{}",message);
//创建一个主题为999消息,并将message放入其中
kafkaTemplate.send("999",message);
kafkaTemplate.destroy();
return "发送成功!";
}
}
编写消费者
@Component
@Slf4j
public class KafkaCustomer {
//消费者监听kafka中对应的999主题
@KafkaListener(topics = "999",containerFactory = "kafkaListenerContainerFactory",id = "1")
public void onMessage(ConsumerRecord record){
log.info("消费者收到的消息,topic:{},paration;{}",record.topic(),record.partition());
}
}
5.2 配置初始化主题topic
在项目启动时我们可以根据项目需要为项目生成对应的主题,通过编写java配置类实现
@Configuration
public class KafkaInitialConfiguration {
//项目启动时创建一个名称为aa的主题,分区为1,副本为1
@Bean
public NewTopic initTopic(){
return new NewTopic("sms",1,(short)1);
}
}
5.3 编写带回调的生产者
当生产者发送消息给kafka后,有时候我们需要知道消息是否发送成功,所以这里可以通过带回调的生产者来实现
5.3.1 匿名内部类写法
@GetMapping("/send2/{message}")
public String sendMessage2(@PathVariable("message")String message){
log.info("发送消息:{}",message);
kafkaTemplate.send("999",message).addCallback(new ListenableFutureCallback<SendResult<String, Object>>() {
@Override //失败回调
public void onFailure(Throwable throwable) {
log.info("发送消息失败:{}",throwable.getMessage());
}
@Override //成功回调
public void onSuccess(SendResult<String, Object> result) {
log.info("发送消息成功:{}",result.getProducerRecord().value());
}
});
return "发送成功!";
}
5.3.1 拉姆达表达式写法
@GetMapping("/send3/{message}")
public String sendMessage3(@PathVariable("message")String message){
log.info("发送消息:{}",message);
kafkaTemplate.send("999",message).addCallback(success->{
log.info("消息发送成功:{}",success.getProducerRecord().value());
},failure->{
log.info("消息发送失败:{}",failure.getMessage());
});
return "发送成功!";
}