愛在花開的季節 发表于 2024-12-1 11:34:44

docker服务容器化

1 引言

​ 利用docker可以很效率地搭建服务,本文在win10下安装docker-desktop,从镜像的拉取,到容器的创建,最后容器间连合使用,该过程有许多细节,纪录和分享在这里,共勉。
2 多个容器间网络联通

​ 在docker中可以创建网络,作为容器间网络联通前言,网络联通有下面两种方式,首先必要创建网络:
# 创建网络名为flink-network的网络
docker network create flink-network

# 查看网络内的容器信息:
docker network inspect flink-network
2.1 单独创建关联

​ 容器已经创建,但是没有关联网络,必要单独创建关联时
# 这里假设已经创建容器starrocks,关联上已创建的网络flink-network
docker network connect flink-network starrocks
2.2 创建时关联

​ 假如网络已经创建,容器未创建,则可以在创建容器时直接关联网络,如已创建上面的网络flink-network,下面打算创建starrocks容器时
# 已创建上面的网络flink-network,下面打算创建starrocks容器时
docker run -p 19030:9030 -p 18030:8030 -p 18040:8040 \
-itd --name starrocks \
--network flink-network \
starrocks/allin1-ubuntu:3.1.10
# 在运行命令中添加已存在网络flink-network --network flink-network
​ 可以查看网络内的容器信息
# 查看网络内的容器信息:
docker network inspect flink-network
https://i-blog.csdnimg.cn/direct/f4af67b159854d4686eff75a9a5bb931.png#pic_center
3 服务搭建

3.1 镜像清单

​ 我们这里搭建kafka-flink-starrocks的项目服务,以starrocks作为数仓,mysql和redis为业务库,flink和kafka进行CDC和ETL。
repositorytagsizstarrocks/allin1-ubuntu3.1.104.37GBflink1.13.5625MBzookeeper3.4.13150MBwurstmeister/kafka2.13-2.8.1468MBmysql8.0.19546MBredis6.0.8104MB 3.2 容器创建

1)首先,创建starrocks容器,外部挂载磁盘位置E:\tmp\docker_volumes\starrocks\data
# 挂载容器外部磁盘/文件夹「启动」,
docker run -itd --name starrocks \
--network flink-network \
-v E:\tmp\docker_volumes\starrocks\data:/home/zzz/data
-p 19030:9030 -p 18030:8030 -p 18040:8040
starrocks/allin1-ubuntu:3.1.10
# 启动SQL client(Connect to StarRocks with a SQL client)
docker exec -it starrocks \
mysql -P 9030 -h 127.0.0.1 -u root -p 123456 --prompt="StarRocks > "
# 在容器内部,查看fe、be状态
show proc '/frontends' \G
show proc '/backends' \G
2)然后,创建flink容器,JobManager和TaskManager都有创建
# 创建 JobManager
docker run \
-itd \
--name=jobmanager \
--publish 8081:8081 \
--network flink-network \
--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \
flink:1.13.5 jobmanager

# 创建 TaskManager
docker run \
-itd \
--name=taskmanager \
--network flink-network \
--env FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" \
flink:1.13.5 taskmanager

# 从https://mvnrepository.com/检索下面jar包 添加jar到flink/lib/目录
# 在宿主机保存jar包路径下运行下面命令
docker cp flink-sql-connector-mysql-cdc-2.0.2.jar jobmanager:/opt/flink/lib/
docker cp flink-sql-connector-mysql-cdc-2.0.2.jar taskmanager:/opt/flink/lib/

docker cp flink-connector-starrocks-1.1.14_flink-1.13_2.11.jar jobmanager:/opt/flink/lib/
docker cp flink-connector-starrocks-1.1.14_flink-1.13_2.11.jar taskmanager:/opt/flink/lib/

docker cp flink-connector-jdbc_2.11-1.13.5.jar jobmanager:/opt/flink/lib/
docker cp flink-connector-jdbc_2.11-1.13.5.jar taskmanager:/opt/flink/lib/

docker cp flink-sql-connector-kafka_2.11-1.13.5.jar jobmanager:/opt/flink/lib/
docker cp flink-sql-connector-kafka_2.11-1.13.5.jar taskmanager:/opt/flink/lib/
3)创建zookeeper和kafka容器
# 安装zk
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\
--network flink-network \
-p 2181:2181\
-v E:\tmp\docker_volumes\zookeeper\localtime:/etc/localtime zookeeper:3.4.13

# 安装kafka 需要注意的时 -e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT:宿主机ip:9092
docker run -d --name kafka \
--network flink-network \
--log-driver json-file\
--log-opt max-size=100m\
--log-opt max-file=2\
-p 9092:9092\
--link zookeeper:zookeeper \
-e KAFKA_BROKER_ID=0\
-e KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181/kafka\
-e KAFKA_ADVERTISED_LISTENERS=PLAINTEXT://宿主机ip:9092 \
-e KAFKA_LISTENERS=PLAINTEXT://0.0.0.0:9092\
wurstmeister/kafka:2.13-2.8.1

# 运行kafka交换命令行
docker exec -it kafka /bin/bash

[*]创建容器mysql和redis,(本人虽然创建了,但是使用的本地的客户端)https://i-blog.csdnimg.cn/direct/84493ab04fcd4b448a5e4d69042c5513.png#pic_center
4 连合实战

4.2 flink_sql之kafka到starrocks

1)kafka数据准备
# 进入kafka交互命令行
docker exec -it kafka /bin/bash

# 在容器内,创建主题user这里容器主机ip是zk容器的ip
./kafka-topics.sh --zookeeper 容器主机ip:2181/kafka --create --replication-factor 1 --partitions 1 --topic user

# 创建生产者 容器主机ip是kafka容器的ip
./kafka-console-producer.sh --broker-list容器主机ip:9092--topic user

# 创建消费者 容器主机ip是kafka容器的ip
./kafka-console-consumer.sh --topic user --from-beginning --bootstrap-server 容器主机ip:9092

2)starrocks数据准备
# 使用dbeaver客户端,或者进入starrocks容器
# 启动SQL client(Connect to StarRocks with a SQL client)
docker exec -it starrocks \
mysql -P 9030 -h 127.0.0.1 -u root -p 123456 --prompt="StarRocks > "

# 创建主键模型表 s_user
CREATE TABLE IF NOT EXISTS `s_user` (
   `id` int(10) NOT NULL COMMENT "",
   `name` varchar(20) NOT NULL COMMENT "",
   `p_id` INT(2) NULL COMMENT ""
)
PRIMARY KEY(`id`)
DISTRIBUTED BY HASH(`id`) BUCKETS 1
PROPERTIES (
"replication_num" = "1"
);


[*]flink_sql准备
# 进入flink容器交互命令行
docker exec -it jobmanager /bin/bash

# 在容器内容运行,进入bin路径
cd opt/flink/bin
# 在bin路径下运行flink_sql客户端
sql-client.sh

# 可以查看是否有表
show tables;

# 创建source源表 source_Kafka_user
CREATE TABLE source_Kafka_user(
   id INT,
   name STRING,
   p_id INT
) WITH (
'connector' = 'kafka',
'topic' = 'user',
'properties.bootstrap.servers' = 'kafka容器ip:9092',
'properties.group.id' = 'source_user',
'scan.startup.mode' = 'earliest-offset',
'format' = 'csv'
);

# 创建Sink目标表,sink_starrocks_suser
CREATE TABLE sink_starrocks_suser (
   id INT,
   name STRING,
   p_id INT,
   PRIMARY KEY (id) NOT ENFORCED
)WITH (
   'connector' = 'starrocks',
   'jdbc-url'='jdbc:mysql://starrocks容器ip:9030',
   'load-url'='starrocks容器ip:8040',
   'database-name' = 'my_test_db',
   'table-name' = 's_user',
   'username' = 'root',
   'password' = '123456',
   'sink.buffer-flush.interval-ms' = '5000',
   'sink.properties.column_separator' = '\x01',
   'sink.properties.row_delimiter' = '\x02'
);

# 在flink_sql创建ETL命令,实时运行
insert into sink_starrocks_suser select id,name,p_id from source_Kafka_user;
https://i-blog.csdnimg.cn/direct/3832e84390fb4b35be6cc7f691972f62.png#pic_center
​ 可以在flinkUI:http://localhost:8081/查看任务运行详情
https://i-blog.csdnimg.cn/direct/d311a23b06414d6da6c5113a7614a2f0.png#pic_center
4.2 flink_sql之mysql到starrocks


[*]mysql数据准备
CREATE TABLE `s_user` (
   `id` INT(11) NOT NULL,
   `name` VARCHAR(32) DEFAULT NULL,
   `p_id` INT(2) DEFAULT NULL,
   PRIMARY KEY (`id`)
);

insert into s_user values(10086,'lm',61),(10010, 'ls',11), (10000,'ll',61);
2)starrocks数据准备: 和上面一样

[*]flink_sql准备
# 创建source源表 source_mysql_suser
CREATE TABLE source_mysql_suser (
   id INT,
   name STRING,
   p_id INT,
   PRIMARY KEY (id) NOT ENFORCED
)WITH (
   'connector' = 'jdbc',
   'driver'='com.mysql.jdbc.Driver',
   'url' = 'jdbc:mysql:/宿主机ip:3306/flink_pro',
   'table-name' = 's_user',
   'username' = 'root',
   'password' = '123456'
);

# 创建Sink目标表,sink_starrocks_suser
CREATE TABLE sink_starrocks_suser (
   id INT,
   name STRING,
   p_id INT,
   PRIMARY KEY (id) NOT ENFORCED
)WITH (
   'connector' = 'starrocks',
   'jdbc-url'='jdbc:mysql://starrocks容器ip:9030',
   'load-url'='starrocks容器ip:8040',
   'database-name' = 'my_test_db',
   'table-name' = 's_user',
   'username' = 'root',
   'password' = '123456',
   'sink.buffer-flush.interval-ms' = '5000',
   'sink.properties.column_separator' = '\x01',
   'sink.properties.row_delimiter' = '\x02'
);

# 在flink_sql创建ETL命令,实时运行
insert into sink_starrocks_suser select id,name,p_id from source_mysql_suser;
https://i-blog.csdnimg.cn/direct/258e817636c641a38eeaaf52cc1f4cb3.png#pic_center
5 文献鉴戒

StarRocks数据导入–Flink Connector与CDC秒级数据同步

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: docker服务容器化