docker服务容器化
- 1 引言
- 2 多个容器间网络联通
- 2.1 单独创建关联
- 2.2 创建时关联
- 3 服务搭建
- 3.1 镜像清单
- 3.2 容器创建
- 4 联合实战
- 4.2 flink_sql之kafka到starrocks
- 4.2 flink_sql之mysql到starrocks
- 5 文献借鉴
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
3 服务搭建
3.1 镜像清单
我们这里搭建kafka-flink-starrocks的项目服务,以starrocks作为数仓,mysql和redis为业务库,flink和kafka进行CDC和ETL。
repository | tag | siz |
---|---|---|
starrocks/allin1-ubuntu | 3.1.10 | 4.37GB |
flink | 1.13.5 | 625MB |
zookeeper | 3.4.13 | 150MB |
wurstmeister/kafka | 2.13-2.8.1 | 468MB |
mysql | 8.0.19 | 546MB |
redis | 6.0.8 | 104MB |
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,(本人虽然创建了,但是使用的本地的客户端)
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;
可以在flinkUI:http://localhost:8081/查看任务运行详情
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;
5 文献借鉴
StarRocks数据导入–Flink Connector与CDC秒级数据同步