Docker初始化服务 包括flink+dinky(详细)
AliLinux是基于CentOS的。
1、java 环境
2、mysql环境
3、kafka环境
4、flink环境
5、dinky环境
mysql 3306
kafka 9092
kafka-console-ui 7766
flink-jobmanager 8081
这些环境,本想直接dnf安装在宿主机上,思来想去,还是用docker方便学习,也方便统一管理和使用
1、先更新系统环境的dnf的包
sudo dnf update && sudo dnf upgrade
老版本
sudo yum update && sudo yum upgrade
2、安装docker
2.1、熟悉docker的命令
Docker 是一个广泛使用的容器化平台,提供了一系列的命令用于管理容器、镜像和容器化应用程序。以下是 Docker 的一些常用命令及其简要介绍:
docker run: 创建并运行一个新的容器。可以指定所使用的镜像、容器名称、端口映射、环境变量等选项。
docker start: 启动已经被创建但处于停止状态的容器。
docker stop: 停止正在运行的容器。
docker restart: 重启容器。
docker rm: 删除一个或多个容器。
docker ps: 列出正在运行的容器。
docker images: 列出本地存在的镜像。
docker pull: 从远程仓库下载镜像。
docker push: 将本地的镜像推送到远程仓库。
docker exec: 在运行中的容器中执行命令。
docker logs: 查看容器的日志输出。
docker inspect: 获取容器或镜像的详细信息。
docker build: 根据 Dockerfile 构建一个镜像。
docker-compose: 使用 Compose 文件定义和管理多个容器的应用程序。
docker network: 管理 Docker 网络,如创建自定义网络、连接容器到网络等。
这只是 Docker 命令的一小部分,Docker 还提供了许多其他有用的命令和选项,用于管理容器、镜像、卷、网络和其他资源。你可以通过运行 docker --help 或者 docker [command] --help 来获取更详细的命令帮助文档。
2.2、添加Docker存储库
dnf remove docker \
> docker-client \
> docker-client-latest \
> docker-common \
> docker-latest \
> docker-latest-logrotate \
> docker-logrotate \
> docker-engine
sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf config-manager --remove-repo=https://download.docker.com/linux/centos/docker-ce.repo
sudo dnf config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
异常问题解决
sudo yum erase podman buildah
centos 7
yum install -y yum-utils device-mapper-persistent-data lvm2
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
需要注意不同的linux的版本,因为还有很多linux版本,比如redhat,fedora,centos等。
2.3、安装Docker
sudo dnf install docker-ce docker-ce-cli containerd.io
- sudo: 在命令前加上sudo表示以超级用户(root)权限来执行该命令。这样做是因为安装Docker通常需要超级用户权限
- dnf: DNF(Dandified Yum)是Fedora和CentOS等Linux发行版的包管理器,用于安装、更新和删除软件包。
- install: install是DNF命令的一个选项,用于安装指定的软件包。
- docker-ce: docker-ce是Docker社区版(Community Edition)的软件包名称,它包含了Docker引擎和其他相关组件。
- docker-ce-cli: docker-ce-cli是Docker社区版的命令行工具软件包,提供了与Docker引擎进行交互的命令。
- containerd.io: containerd.io是containerd容器运行时的软件包,它是一个行业标准的容器运行时,专注于简单性、稳健性和可移植性。
因此,运行sudo dnf install docker-ce docker-ce-cli containerd.io命令将会下载并安装Docker引擎、Docker命令行工具和containerd容器运行时,以便你可以在Linux系统上使用Docker来构建和管理容器化应用程序。
2.4、启动Docker服务
sudo systemctl start docker
使Docker服务在系统启动时自动启动:
sudo systemctl enable docker
2.5、验证Docker安装
docker --version
本人的环境
[root@iZbp1bvzo2rsslr2bubzlnZ ~]# docker --version
Docker version 25.0.3, build 4debf41
++接下来就是docker的世界了++!
使用docker安装其他服务
1、java 环境
2、mysql环境
3、kafka环境
4、flink环境
5、dinky环境
1、docker安装java
1.1、拉取jdk镜像服务
docker pull openjdk:11
1.2、运行jdk
docker run -d -it --name java-11 openjdk:11
命令解释
命令 docker run -d -it --name java-11 openjdk:11 的含义如下:
docker run: 运行一个新的容器。
-d: 在后台(detached)模式下运行容器,即容器在后台执行,不会阻塞终端。
-it: 分配一个伪终端(pseudo-TTY),并保持标准输入(stdin)打开。这允许你与容器进行交互。
--name java-11: 容器名称,这里是 "java-11"。
openjdk:11: 指定要运行的镜像,这里是 OpenJDK 11。
综合起来,该命令的作用是在后台运行一个基于 OpenJDK 11 的容器,并分配一个伪终端,使用户能够与容器进行交互。容器的名称被设置为 "java-11"。
1.3、进入java容器
docker exec -it java-11 /bin/bash
命令解释
docker exec docker的执行命令
-it: 分配一个伪终端(pseudo-TTY),并保持标准输入(stdin)打开。这允许你与容器进行交互。
-- java-11 :容器名称
/bin/bash : 进入命令
1.4、显示版本
java
java -version
本机显示
root@d4e8342175d9:/# java -version
openjdk version "11.0.16" 2022-07-19
OpenJDK Runtime Environment 18.9 (build 11.0.16+8)
OpenJDK 64-Bit Server VM 18.9 (build 11.0.16+8, mixed mode, sharing)
2、docker安装mysql
2.1、拉取Mysql的镜像
docker pull mysql
2.2、运行mysql镜像
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
2.3、查看容器情况
docker ps
如果看到名为 "mysql" 的容器在运行,则表示 MySQL 容器已成功启动。
2.4、进入mysql容器
docker exec -it mysql mysql -uroot -p12345
命令解释
docker run -d --name mysql -e MYSQL_ROOT_PASSWORD=123456 -p 3306:3306 mysql
这个命令的意思是: docker run: 运行一个新的容器。 -d: 在后台(detached)模式下运行容器,即容器在后台执行,不会阻塞终端。 --name mysql: 为容器指定一个名称,这里是 "mysql"。 -e MYSQL_ROOT_PASSWORD=123456: 设置 MySQL 容器的环境变量,其中 123456 是你自己设置的 MySQL root 用户的密码。 -p 3306:3306: 将容器的 3306 端口映射到主机的 3306 端口,允许从主机上的应用程序连接到容器中运行的 MySQL 服务。 mysql: 指定要运行的镜像,这里是 MySQL 镜像。 综合起来,该命令的作用是在后台运行一个名为 "mysql-container" 的容器,使用提供的 MySQL 镜像。容器将暴露 3306 端口,允许从主机上的应用程序连接到 MySQL 服务。MySQL root 用户的密码将通过环境变量传递给容器。 这个命令将创建并运行一个 MySQL 容器,你可以使用 MySQL 客户端工具连接到容器中的 MySQL 服务,并使用设置的密码进行身份验证。
配置华为云
/etc/docker/daemon.json
registry-mirrors
{
"registry-mirrors": [
"https://mirror.ccs.tencentyun.com"
]
}
{
"registry-mirrors": [
"https://registry.cn-hangzhou.aliyuncs.com"
]
}
systemctl daemon-reload && systemctl restart docker
https://jpom.top/pages/practice/docker-cli/#%E6%B7%BB%E5%8A%A0-docker
docker 开启 ssh服务。
容量大
就可以使用挂载
mkdir mysql
mkdir mysql/conf
mkdir mysql/data
优化执行命令
docker run --name mysql -v /root/mysql/conf:/etc/mysql -v /root/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 -d -p 3307:3307 mysql:5.7 --defaults-file=/etc/mysql/my.cnf
其中,--name 指定容器名称,-v /path/to/mysql:/etc/mysql/conf.d 将主机的 mysql 目录挂载到容器内的 /etc/mysql/conf.d 目录,-v /path/to/mysql/data:/var/lib/mysql 将主机的 mysql/data 目录挂载到容器内的 /var/lib/mysql 目录,-e MYSQL_ROOT_PASSWORD=<password> 指定 MySQL 的 root 用户的密码,-d 表示以后台模式启动容器,-p 3306:3306 将容器的 3306 端口映射到主机的 3306 端口。
修改 MySQL 配置文件
在主机的 mysql 目录中创建一个名为 my.cnf 的文件,用于修改 MySQL 的配置。例如,以下是一个简单的配置文件示例:
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
在这个示例中,我们指定了 MySQL 的字符集和排序规则。
重启 MySQL 容器
在主机的 mysql 目录中修改 my.cnf 文件后,需要重启 MySQL 容器使配置生效。使用以下命令重启容器:
docker restart mysql
连接 MySQL
使用以下命令连接到 MySQL:
mysql -h 127.0.0.1 -P 3306 -u root -p
其中,-h 指定 MySQL 的 IP 地址,-P 指定 MySQL 的端口,-u 指定用户名,-p 表示需要输入密码。
以上就是在 Docker 中部署 MySQL 并挂载配置文件的步骤。需要注意的是,MySQL 的配置文件可以根据实际需求进行自定义,可以参考 MySQL 官方文档进行配置。
3、安装kafka
https://blog.csdn.net/m0_64210833/article/details/134199061
kafka依赖Zookeeper,当然也可以用内置的kraft。
安装前提条件
1.安装Zookeeper
1.1运行ZooKeeper容器
2.运行Kafka容器
2.1启动Kafka容器
3.验证
3.1进入Kafka容器
3.2查看容器状态
3.3查看容器日志
3.4重新启动容器
3.5创建测试主题
3.1、拉取Zookeeper镜像
docker pull bitnami/zookeeper
3.2、运行ZooKeeper容器
使用以下命令运行一个ZooKeeper的Docker容器:
markdown
docker run -d --restart=always -e ALLOW_ANONYMOUS_LOGIN=yes --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name zookeeper -p 2181:2181 -v /etc/localtime:/etc/localtime bitnami/zookeeper:latest
这个命令会启动一个名为"zookeeper"的Docker容器,并且映射它的2181端口到你的机器的2181端口。
3.3、拉取Kafka镜像
接下来,你需要运行Kafka的Docker容器,并且配置它连接到你刚刚启动的ZooKeeper实例。如果你还没有Kafka的Docker镜像,你可以使用如下命令拉取:
docker pull bitnami/kafka
3.4、启动kafka容器
docker run -d --log-driver json-file --log-opt max-size=100m --log-opt max-file=2 --name kafka -p 9092:9092 -e KAFKA_BROKER_ID=0 -e KAFKA_ZOOKEEPER_CONNECT=150.158.119.225:2181/kafka -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://150.158.119.225:9092 -e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092 -v /etc/localtime:/etc/localtime bitnami/kafka:latest
docker run: 这是Docker命令的起始点,用于创建和运行一个新的容器。
-d: 这个选项告诉Docker在后台(detached mode)运行容器,这样容器将在后台运行而不会占用当前终端。
--log-driver json-file: 这个选项指定了容器的日志驱动程序。在这种情况下,它使用json-file驱动程序,将容器的日志输出到文件中。
--log-opt max-size=100m: 这个选项设置日志文件的最大大小为100兆字节(MB)。当日志文件大小达到该限制时,Docker将创建一个新的日志文件。
--log-opt max-file=2: 这个选项设置日志文件的最大数量为2个。当达到最大数量时,Docker会循环使用这些日志文件,最早的日志文件会被覆盖。
--name kafka: 这个选项为容器指定一个名称"kafka",以便后续对容器进行引用。
-p 9092:9092: 这个选项将主机的端口9092映射到容器的端口9092。Kafka通常使用9092端口进行客户端连接。
-e KAFKA_BROKER_ID=0: 这个选项设置Kafka的Broker ID为0。每个Kafka Broker都应具有唯一的Broker ID。
-e KAFKA_ZOOKEEPER_CONNECT=150.158.119:2181/kafka: 这个选项设置Kafka连接到的Zookeeper的地址和端口。在这种情况下,Kafka将连接到地址为150.158.119的Zookeeper实例的2181端口,并使用"/kafka"作为Kafka在Zookeeper中的根目录。
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://150.158.119:9092: 这个选项设置Kafka的广告侦听器(advertised listeners)。它指定Kafka广告的监听器的地址和端口。在这种情况下,Kafka将使用地址为150.158.119的主机的9092端口作为广告的监听地址。
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092: 这个选项设置Kafka的监听器。它指定Kafka监听的地址和端口。在这种情况下,Kafka将监听所有可用的网络接口(0.0.0.0)上的9092端口。
-v /etc/localtime:/etc/localtime: 这个选项将主机系统的时区设置挂载到容器内的/etc/localtime文件,以确保容器和主机具有相同的时区设置。
bitnami/kafka:latest: 这是要使用的Docker镜像的名称和标签。在这种情况下,它使用Bitnami提供的Kafka镜像,并使用"latest"标签来获取最新的版本。
参考网址https://www.jianshu.com/p/26495e334613
其实kafka客户端访问kafka是分两步走:
第一步,不管什么方式,客户端只要能连接到KAFKA_LISTENERS标识的地址,成功完成必要的认证后,就可以得到一个brokers返回地址。
第二步,通过返回的brokers重新建立和kafka的连接,生成producer/consumer。这个返回的brokers就是KAFKA_ADVERTISED_LISTENERS的值。
注意,如果要连外网,需要修改
--env KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://localhost:9092
localhost改为 当前公网ip 118.31.250.73 (当前ali买的服务器的的公网IP)
别用我的ip
3.5、进入kafka容器
docker exec -it kafka /bin/bash
cd /opt/bitnami/kafka/bin
注意:可能出现报错:Error response from daemon: Container 62b9c056c0aa9d6ba917690abae1c6fe16c750a96fe428cdaa43f4c692a146ca is not running
说明kafka并没有运行。
3.6、创建测试主题
在Kafka容器中,运行以下命令创建一个测试主题:
./kafka-topics.sh --create --topic test-kafka --bootstrap-server localhost:9092
3.7、使用生产者发送消息
打开一个生产者,来输入测试主题的消息(也需要进入kafka容器哈):
markdown
./kafka-console-producer.sh --topic test-kafka --bootstrap-server localhost:9092
然后你可以输入一些消息(比如输入hello按下enter)。
3.8、使用消费者接收消息
在另一个终端窗口中,打开一个消费者来读取测试主题的消息(也需要进入kafka容器哈):
./kafka-console-consumer.sh --topic test-kafka --from-beginning --bootstrap-server localhost:9092
如果一切设置正确,你应该能在消费者终端中看到你在生产者终端输入的消息。
这就完成了使用Docker运行ZooKeeper和Kafka,并进行基本验证的过程。
在生产者页面输入测试内容:
{"id":1,"name":"arvin"}
4、安装Kafka图形界面
待更新。
kafka-console-ui
https://github.com/xxd763795151/kafka-console-ui
4.1、拉取kafka-console-ui镜像
markdown
docker pull wdkang/kafka-console-ui
4.2、启动服务并挂载,持久化
markdown
docker run -d -p 7766:7766 -v $PWD/data:/app/data -v $PWD/log:/app/log wdkang/kafka-console-ui
4.3、访问
markdown
http://150.158.119.225:7766
5、安装flink
5.1、拉取flink镜像,创建网络
markdown
docker pull flink
docker network create flink-network
5.2、创建 jobmanager
# 创建 JobManager
docker run \
-itd \
--name=jobmanager \
--publish 8081:8081 \
--network flink-network \
--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \
flink:latest jobmanager
5.3、创建 TaskManager
# 创建 TaskManager
docker run \
-itd \
--name=taskmanager \
--network flink-network \
--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \
flink:latest taskmanager
5.4、访问公网ip
访问 http://150.158.119.225/:8081/
5.5 修改Task Slots
默认的Slots num是1,我们可以修改为5:
修改的目录是jobmanager和taskmanager的/opt/flink/conf
的flink-conf.yaml
文件:
修改taskmanager.numberOfTaskSlots:
即可。
注意:默认的docker容器中没有vi/vim命令,可以使用docker cp命令,复制出来修改,然后在复制回去,如下:
markdown
docker cp taskmanager:/opt/flink/conf/flink-conf.yaml .
docker cp flink-conf.yaml taskmanager:/opt/flink/conf/
5.6、通过flinksql消费Kafka
并且通过python,简单写一个生产者
Python生产、消费Kafka
5.7 导入flink-sql-connector-kafka jar
顾名思义,用于连接flinksql和kafka。
进入flink
bash
docker exec -it jobmanager /bin/bash
进入 flink的bin目录
bash
cd /opt/flink/bin
查看flink版本:
bash
flink --version
根据自己的flink版本,下载对应的 flink-sql-connector-kafka jar包
https://mvnrepository.com/artifact/org.apache.flink/flink-sql-connector-kafka
因为我是1.18.0,所以选择下图的版本包:
将下载的jar包,分别在jobmanager,taskmanager /opt/flink/lib
目录下,注意,是两个都要放,如下图:
可以使用docker cp test.txt jobmanager:/opt/flink/lib
命令,用户宿主机和docker容器文件传输。把test.txt换成对应的jar包即可
markdown
docker cp test.txt jobmanager:/opt/flink/lib
docker cp test.txt taskmanager:/opt/flink/lib
5.8 flinksql消费kafka
java结合日志
kafka.send("GatewayLog", JSONUtil.toJsonStr(gatewayLog));
GatewayLog是topic
yaml的服务配置
markdown
spring:
kafka:
bootstrap-servers: "10.10.10.155:9092"
consumer:
group-id: "teleGatewayGroup"
我在本地生成了一条log,将使用flinksql处理这个数据。
进入jobmanager中,执行
bash
cd /opt/flink/bin
sql-client.sh
Flink SQL执行以下语句:
CREATE TABLE GatewayLog (
platform VARCHAR,
serviceId VARCHAR,
targetServer VARCHAR,
requestPath VARCHAR,
requestMethod VARCHAR,
schema VARCHAR,
requestContentType VARCHAR,
headers VARCHAR,
requestBody VARCHAR,
ip VARCHAR,
startTime TIMESTAMP,
endTime VARCHAR,
executeTime VARCHAR,
status VARCHAR,
nickName VARCHAR,
account VARCHAR,
accountType VARCHAR,
serviceName VARCHAR,
orgCode VARCHAR
) WITH (
'connector' = 'kafka',
'topic' = 'GatewayLog',
'properties.bootstrap.servers' = '150.158.119.225:9092',
'properties.group.id' = 'flinKGroup',
'scan.startup.mode' = 'earliest-offset',
'format' = 'json'
);
select * from GatewayLog;
可以看到Flink在消费kafka数据,如下图:
中间缺少很多包。
flink-connector-kafka
https://mvnrepository.com/artifact/org.apache.flink/flink-connector-kafka/3.1.0-1.18
依赖的kafka-clients
https://mvnrepository.com/artifact/org.apache.kafka/kafka-clients/3.6.1
然后在Linux需要看权限问题。
markdown
chmod -R 777 /lib
把文件夹都改成777 所有人。
然后执行
sql最好先改成varchar,变成成功。
最后select * from table
执行成功。
6、安装dinky
dinky环境
不用管。
安装flink
markdown
CREATE CATALOG kfksc WITH (
'type' = 'inmemory'
);
USE CATALOG kfksc;
CREATE DATABASE topic;
USE topic;
CREATE TABLE kfksc.topic.GatewayLog (
platform VARCHAR,
serviceId VARCHAR,
targetServer VARCHAR,
requestPath VARCHAR,
requestMethod VARCHAR,
schema VARCHAR,
requestContentType VARCHAR,
headers VARCHAR,
requestBody VARCHAR,
ip VARCHAR,
startTime TIMESTAMP,
endTime TIMESTAMP,
executeTime BIGINT,
status INT,
nickName VARCHAR,
account VARCHAR,
accountType VARCHAR,
serviceName VARCHAR,
orgCode VARCHAR
) WITH (
'connector' = 'kafka',
'topic' = 'GatewayLog',
'properties.bootstrap.servers' = '150.158.119.225:9092',
'properties.group.id' = 'flinKGroup',
'scan.startup.mode' = 'earliest-offset',
'format' = 'json'
);
show tables;
select * from GatewayLog;