Flink Docker file制作

1 Dockerfile,需要定义一个Dockerfile,Dockerfile定义了进程需要的一切东西。Dockerfile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当应用进程需要和系统服务和内核进程打交道,这时需要考虑如何设计namespace的权限控制)等等;
2 Docker镜像,在用Dockerfile定义一个文件之后,docker build时会产生一个Docker镜像,当运行 Docker镜像时,会真正开始提供服务;
3 Docker容器,容器是直接提供服务的。

1、文件名要小写

 2、

$ docker build -t mybuilder:v1 -f ./build/Dockerfile .

//-t:指定新建的Dockerfile名称

//-f:指定该dockerfile的位置

 3、docker build -t flink16 -f /opt/dockerfile/flinkdockerfile .

4、docker images

5、 flink docker代码

flink-docker/1.15/scala_2.12-java8-ubuntu/Dockerfile at master · apache/flink-docker · GitHub

 # 使用官方的 Flink 基础镜像作为基础
FROM flink:1.14.6
#
## 定义工作目录
WORKDIR /opt/flink/lib
#
# 将本地依赖的 JAR 包添加到目录
COPY /opt/flink/flink-1.14.6/lib/dlink-client-1.14-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/dlink-client-base-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/dlink-common-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/dlink-metadata-base-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/dlink-metadata-doris-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/dlink-metadata-mysql-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/dlink-metadata-sqlserver-0.7.3.jar .
COPY /opt/flink/flink-1.14.6/lib/druid-1.2.8.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-connector-jdbc_2.12-1.14.6.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-dist_2.12-1.14.6.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-doris-connector-1.14_2.12-1.1.1.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-faker-0.5.3.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-shaded-guava-30.1.1-jre-16.0.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-sql-connector-mysql-cdc-2.3.0.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-sql-connector-sqlserver-cdc-2.3.0.jar .
COPY /opt/flink/flink-1.14.6/lib/flink-table_2.12-1.14.6.jar .
COPY /opt/flink/flink-1.14.6/lib/HikariCP-4.0.3.jar .
COPY /opt/flink/flink-1.14.6/lib/jackson-datatype-jsr310-2.13.4.jar .
COPY /opt/flink/flink-1.14.6/lib/mysql-connector-java-8.0.28.jar .

然后执行命令

docker build -t flink14 -f /opt/dockerfile/flinkdockerfile .

 COPY 指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置。

<目标路径> 可以是容器内的绝对路径,也可以是相对于工作目录的相对路径(工作目录可以用 WORKDIR 指令来指定)。

目标路径不需要事先创建,如果目录不存在会在复制文件前先行

创建缺失目录。

COPY <源路径>... <目标路径>

COPY ["<源路径1>",... "<目标路径>"]

正确:

COPY ./package.json /app/

COPY package.json /usr/src/app/

错误:

COPY ../package.json /app

或者 COPY /opt/xxxx /app

注意:

此外,还需要注意一点,使用 COPY 指令,源文件的各种元数据都会保留。比如读、写、执
行权限、文件变更时间等。

修改后为:

# 使用官方的 Flink 基础镜像作为基础
FROM flink:1.14.6
#
## 定义工作目录
WORKDIR /opt/flink
#
# 将本地依赖的 JAR 包添加到目录
COPY ./flinklib/dlink-client-1.14-0.7.3.jar /opt/flink/lib/dlink-client-1.14-0.7.3.jar
COPY ./flinklib/dlink-client-base-0.7.3.jar /opt/flink/lib/dlink-client-base-0.7.3.jar
COPY ./flinklib/dlink-common-0.7.3.jar /opt/flink/lib/dlink-common-0.7.3.jar
COPY ./flinklib/dlink-metadata-base-0.7.3.jar /opt/flink/lib/dlink-metadata-base-0.7.3.jar
COPY ./flinklib/dlink-metadata-doris-0.7.3.jar /opt/flink/lib/dlink-metadata-doris-0.7.3.jar
COPY ./flinklib/dlink-metadata-mysql-0.7.3.jar /opt/flink/lib/dlink-metadata-mysql-0.7.3.jar
COPY ./flinklib/dlink-metadata-sqlserver-0.7.3.jar /opt/flink/lib/dlink-metadata-sqlserver-0.7.3.jar
COPY ./flinklib/druid-1.2.8.jar /opt/flink/lib/druid-1.2.8.jar
COPY ./flinklib/flink-connector-jdbc_2.12-1.14.6.jar /opt/flink/lib/flink-connector-jdbc_2.12-1.14.6.jar
COPY ./flinklib/flink-dist_2.12-1.14.6.jar /opt/flink/lib/flink-dist_2.12-1.14.6.jar
COPY ./flinklib/flink-doris-connector-1.14_2.12-1.1.1.jar /opt/flink/lib/flink-doris-connector-1.14_2.12-1.1.1.jar
COPY ./flinklib/flink-faker-0.5.3.jar /opt/flink/lib/flink-faker-0.5.3.jar
COPY ./flinklib/flink-shaded-guava-30.1.1-jre-16.0.jar /opt/flink/lib/flink-shaded-guava-30.1.1-jre-16.0.jar
COPY ./flinklib/flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar /opt/flink/lib/flink-shaded-hadoop-3-uber-3.1.1.7.2.9.0-173-9.0.jar
COPY ./flinklib/flink-sql-connector-mysql-cdc-2.3.0.jar /opt/flink/lib/flink-sql-connector-mysql-cdc-2.3.0.jar
COPY ./flinklib/flink-sql-connector-sqlserver-cdc-2.3.0.jar /opt/flink/lib/flink-sql-connector-sqlserver-cdc-2.3.0.jar
COPY ./flinklib/flink-table_2.12-1.14.6.jar /opt/flink/lib/flink-table_2.12-1.14.6.jar
COPY ./flinklib/HikariCP-4.0.3.jar /opt/flink/lib/HikariCP-4.0.3.jar
COPY ./flinklib/jackson-datatype-jsr310-2.13.4.jar /opt/flink/lib/jackson-datatype-jsr310-2.13.4.jar
COPY ./flinklib/mysql-connector-java-8.0.28.jar /opt/flink/lib/mysql-connector-java-8.0.28.jar

RUN chown -R flink:flink /opt/flink/lib

ENTRYPOINT ["/docker-entrypoint.sh"]
EXPOSE 6123 8081
CMD ["/bin/bash"]

发现还是会报异常重启的错误(CrashLoopBackOff),怀疑是镜像包过大

修改为:

# 使用官方的 Flink 基础镜像作为基础
FROM flink:1.14.6

# 将本地依赖的 JAR 包添加到目录
COPY ./flinklib/*.jar /opt/flink/lib
RUN sed -i 's/jdk.tls.disabledAlgorithms=SSLv3, TLSv1, TLSv1.1, RC4, DES, MD5withRSA,/jdk.tls.disabledAlgorithms=SSLv3, RC4, DES, MD5withRSA,/g' /opt/java/openjdk/lib/security/java.security
RUN sed -i 's/DH keySize < 1024, EC keySize < 224, 3DES_EDE_CBC, anon, NULL,/DH keySize < 1024, EC keySize < 224, anon, NULL,/g' /opt/java/openjdk/lib/security/java.security
RUN mkdir -p /flink-data/checkpoints && mkdir -p /flink-data/savepoints && chown -R flink:flink /flink-data/checkpoints/ && chown -R flink:flink /flink-data/savepoints/

打tag 构造本地镜像

docker build -t flink-sql:1.14.6 -f /opt/dockerfile/Dockerfile .

执行命令后成功

docker tag flink-sql:1.14.21 192.168.1.249:16443/bigdata/flink-sql:1.14.21

docker push 192.168.1.249:16443/bigdata/flink-sql:1.14.21

docker pull 192.168.1.249:16443/bigdata/flink-sql:1.14.21

删除镜像

docker rmi -f 3f5caf0973e0

kubectl get pod -n flink -owide

kubectl delete -f sql-application.yaml -n flink

kubectl apply -f sql-application.yaml -n flink 

kubectl delete -f session-deployment-only.yaml -n flink

ErrImagePull 异常:

vim /etc/containerd/config.toml

修改:

[plugins."io.containerd.grpc.v1.cri".registry.auths]

      [plugins."io.containerd.grpc.v1.cri".registry.configs]
        [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.249:16443".tls]
          insecure_skip_verify = true  # 是否跳过安全认证
        [plugins."io.containerd.grpc.v1.cri".registry.configs."192.168.1.249:16443".auth]
          username = "admin"
          password = "Harbor12345"
      [plugins."io.containerd.grpc.v1.cri".registry.headers]

      [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
          endpoint = ["https://registry-1.docker.io"]
        [plugins."io.containerd.grpc.v1.cri".registry.mirrors."192.168.1.249:16443"]
          endpoint = ["https://192.168.1.249:16443"]
 

同时:image镜像改为从https地址下载

#Flink Session集群 源码请到 
apiVersion: flink.apache.org/v1beta1
kind: FlinkDeployment
metadata:
  namespace: flink
  name: session-deployment-only
spec:
  #imagePullSecrets:
  #  - name: flink
  image: 192.168.1.249:16443/bigdata/flink-sql:1.14.20
  #image: flink:1.14.6
  flinkVersion: v1_14
  imagePullPolicy: IfNotPresent   # 镜像拉取策略,本地没有则从仓库拉取
  ingress:   # ingress配置,用于访问flink web页面
    template: "flink.k8s.io"
    className: "nginx"
    annotations:
      nginx.ingress.kubernetes.io/rewrite-target: "/"
  flinkConfiguration:
    taskmanager.numberOfTaskSlots: "36"
    state.savepoints.dir: file:///flink-data/savepoints
    state.checkpoints.dir: file:///flink-data/checkpoints
  serviceAccount: flink
  jobManager:
    replicas: 1
    resource:
      memory: "1024m"
      cpu: 1
  taskManager:
    replicas: 1
    resource:
      memory: "6048m"
      cpu: 4
 

systemctl daemon-reload

systemctl restart containerd.service

查看异常:

kubectl describe pod sql-session-7c98d89b5c-crmg4 -n flink

kubectl exec -it session-deployment-only-79b8d79c4c-6ttm2 /bin/bash -n flink

查看nginx分配的端口

kubectl get all -n ingress-nginx -owide

在Docker中,"PV"代表持久卷(Persistent Volume),"PVC"代表持久卷声明(Persistent Volume Claim)。它们是用于在Docker容器中进行数据持久化的机制。

持久卷(PV)是Docker中的持久化存储资源,通常由底层存储系统(如本地磁盘、网络存储等)提供支持。PV可以在Docker集群中独立存在,并可以被多个容器共享。

持久卷声明(PVC)是对持久卷的请求,它定义了容器对存储资源的需求。Docker使用PVC来动态分配和管理PV,以满足容器的持久化数据存储需求。PVC可以设置存储容量、访问模式和其他属性。

通过将PVC与容器关联,在容器中可以使用挂载点的方式访问PV,实现数据的持久化存储和共享。

这种使用PV和PVC的机制可以确保容器在重启、重新部署或迁移时,能够保留和恢复数据。

"EXPOSE 6123 8081" 是Dockerfile中的指令,用于声明容器运行时将要使用的网络端口。

在这个例子中,Docker容器将会暴露两个端口,即6123和8081。这意味着在运行该容器时,这两个端口将可以用于网络通讯。

需要注意的是,EXPOSE指令仅仅是在Docker镜像中声明了容器将使用这些端口,它并不会自动映射宿主机的端口。要实现宿主机与容器的端口映射,还需要使用Docker运行命令时的"-p"或"-P"参数。

例如,可以使用以下命令启动一个容器,并将宿主机的6123端口映射到容器的6123端口:

```
docker run -p 6123:6123 <image_name>
```

这样,在宿主机上的6123端口就可以通过网络访问该容器的6123端口。同样地,你可以使用类似的方式映射8081端口。

kubectl get -n flink secret/flink -o yaml

打包:

docker save -o flink-sql.tar flink-sql:1.14.20

load镜像:

docker load -i flink-sql.tar

安装 Docker Registry

1: 设置/etc/docker/daemon.json 文件.

  1. 创建并修改完daemon.json文件后,需要让这个文件生效

vim /etc/docker/daemon.json

{

    "insecure-registries" : ["localhost:5000"]

}

a.修改完成后reload配置文件

sudo systemctl daemon-reload

b.重启docker服务

sudo systemctl restart docker.service

c.查看状态

sudo systemctl status docker -l

d.查看服务

sudo docker info

安装Docker Registry

docker run -d -p 5000:5000 --restart=always --name registry registry:2

其中:

  • -d 参数表示在后台运行
  • -p 参数将主机的5000端口映射到容器的5000端口
  • --restart=always 参数表示Docker Registry容器将在Docker守护进程启动时自动启动
  • --name registry 参数指定容器的名称
  • registry:2 是Docker Registry的镜像名称及其版本号

Flink session部署方式:

load镜像:docker load -i flink-sql.tar

docker tag flink-sql:1.14.21 localhost:5000/flink-sql:1.14.21

docker push localhost:5000/flink-sql:1.14.21

docker pull localhost:5000/flink-sql:1.14.21

kubectl apply -f session-deployment-only.yaml

删除命令

kubectl delete -f session-deployment-only.yaml

查看:

kubectl get pod -n flink | grep session

验证:

kubectl get pod -n flink -owide

kubectl get all -n ingress-nginx -owide

修改用户本地windows机器hosts

C:\Windows\System32\drivers\etc\hosts

猜你喜欢

转载自blog.csdn.net/wangqiaowq/article/details/131934147
今日推荐