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 文件.
- 创建并修改完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