前言
大家是否记得自己是怎么开始学习大数据的内容呢,估计关注我得同学会发现前面有点陆续有点关于Docker的小烂文,是因为使用Docker可以最快的速度让我们拥有一个学习的环境。大数据的东西都逃不过搭建环境测试跑通这么一个过程,我自己也是过来人,尤其是刚刚接触比较新的东西的时候受制于当前的网络,当前的配置一系列的问题,导致大量从入门到放弃的情况非常多,今天我通过一些实际的例子,让大家感受一下这种便利性。
误区
首先一定要纠正一个误区,尤其是这种技术类型的,不是说需要掌握100%才去使用,但凡了解了一丢丢,你就应该去做了,很多人一上来就干到很深的底层原理,那样学习本身的成本就很高了,没必要。另外一方面来说试错这个事情本身就是学习的过程。更重要的一点,一定是你自己亲自动手跑通的才算,因为参考学习视频学的时候,你发现老师操作的时候异常顺利,因为有些问题老师处理过了,有的问题在老师的环境上面就没有。
目标
我这里是两个小案例,通过这种案例让大家感受到docker作为工具给我们带来便利,一是自己编写的java使用docker跑通,第二个是使用docker快速获得flink的环境。 前提,大家机器里面有docker环境,注意了docker环境在mac和windows都是有图形安装的,所以和安装QQ这种完全是一样的,官网在这里,点击,下载安装包安装就行,不用很复杂的配置。我知道这里面在很多教学资料告诉怎么去linux上面安装,那是深入学习的时候才会到linux上面去,这个地方千万别花太多时间折腾了。
跑通一个自己的Java程序
首先当然是构建一个maven工程,大家养成习惯为了让后面的人工作顺利进行,前面的工作做好,我这里提前准备一下maven仓库的配置,内容如下
cat /Users/zhuxuemin/.m2/settings_aliyun.xml
这里面关键的内容其实是阿里云仓库配置,这样后面会顺利一些
<mirror> <id>alimaven</id> <name>aliyun maven</name> <url>http://maven.aliyun.com/nexus/content/repositories/central/</url> <mirrorOf>central</mirrorOf> </mirror>
构建工程了,我是比较喜欢先命令行构建出来,再导入idea,所以下面的命令顺利会和前面工作有关系
mvn --settings /Users/zhuxuemin/.m2/settings_aliyun.xml archetype:generate -DgroupId=net.blog.csdn -DartifactId=docker-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
构建出来导入idea,就是一个简单的maven工程,帮我们输出一下。
![在这里插入图片描述](https://ucc.alicdn.com/images/user-upload-01/direct/ef0af76c7bc144eca352d18f5112208b.png
在根目录下面新建Dockerfile文件,里面放入内容,如下:
FROM williamyeh/java8 COPY target/docker-app-1.0-SNAPSHOT.jar /usr/local/docker-app-1.0-SNAPSHOT.jar CMD ["java", "-cp", "/usr/local/docker-app-1.0-SNAPSHOT.jar","net.blog.csdn.App"]
构建镜像
docker build . -t docker-java-app
显示如下:
Sending build context to Docker daemon 38.91kB Step 1/3 : FROM williamyeh/java8 ---> 00bc163fa009 Step 2/3 : COPY target/docker-app-1.0-SNAPSHOT.jar /usr/local/docker-app-1.0-SNAPSHOT.jar ---> 4738e15804e9 Step 3/3 : CMD ["java", "-jar", "/usr/local/docker-app-1.0-SNAPSHOT.jar"] ---> Running in d9a68086b6ce Removing intermediate container d9a68086b6ce ---> 519ece8e6b16 Successfully built 519ece8e6b16 Successfully tagged docker-java-app:latest
运行如下,至此我们的程序顺利在docker环境下面运行了
docker run docker-java-app Hello World!
接下来,学会学习,如果就是这样子copy过去,十有八九干不成功,事实上这个套路百度是可以搜索到的。现在都是大模型交互的方式,所以大家要学会去问了。
好了,这里面情况就是,下面myjavaapp还好理解,大家改成自己的工程名字就行,需要说明的情况是from这个命令
FROM openjdk:8-jdk-alpine
这里是这样的,我们运行java不是要一个java环境嘛,这里面按照docker的术语来说就是基于之前的镜像去走叠加,相当于他有一个床架子,我们可以往上面加我们喜欢的被子,这里面就是要看自己的仓库有哪些基础环境
docker search jdk
结果如下,这里面可以看到一堆相关的,选择一个就行,细心的同学可以看到,并没有我上面代码上面使用到的williamyeh/java8,这个是因为我之前使用的时候有,然后在本机已经有了,所以说这个镜像其实是会变化的,大家需要灵活调整。
NAME DESCRIPTION STARS OFFICIAL AUTOMATED java DEPRECATED; use "openjdk" (or other JDK impl… 2002 [OK] bellsoft/liberica-runtime-container Alpaquita based image for Liberica JDK and J… 17 eclipse/ubuntu_jdk8 Ubuntu, JDK8, Maven 3, git, curl, nmap, mc, … 17 [OK] jdkato/vale The official Docker image for Vale. 10 eclipse/centos_jdk8 CentOS, JDK8, Maven 3, git, curl, nmap, mc, … 5 [OK] dockette/jdk8 My Oracle Java 8 Dockerfile 5 [OK] jdkelley/simple-http-server 1 eucm/maven Maven 3.3.9 with Java jdk 8 Docker image rep… 1 [OK] eclipse/ubuntu_jdk8_x11 Based on Ubuntu 14, JDK 8, Maven 3.3.9, x11 … 1 [OK] sismics/debian-java Debian Jessy + Oracle JDK 1 eclipse/debian_jdk8 Debian, JDK8, Maven 3, git, curl, nmap, mc, … 1 [OK] eclipse/debian_jdk8_node Node (+ Angular stuff) + JDK8. Debian based 1 [OK] eclipse/alpine_jdk8 Based on Alpine 3.3. JDK 1.8, Maven 3.3.9, T… 1 [OK] eclipse/ubuntu_wildfly8 Ubuntu 14.04, JDK 1.8, Maven 3.3.9, Wildfly 8 0 [OK] eclipse/hadoop-dev Ubuntu 14.04, Maven 3.3.9, JDK8, Tomcat 8 0 [OK] clarinpl/java Ubuntu with java ( jdk-8u161) 0 eclipse/ubuntu_gradle Ubuntu, JDK1.8, Gradle2.3 0 [OK] bellsoft/buildpacks.liberica A Cloud Native Buildpack for Alpaquita Linux… 0 jdk1/php-redis-modified 0 vespaengine/vespa-pipeline Docker image with supported versions of Mave… 0
快速上手flink环境
这个就比较有意思了,相信很多人想玩大数据的东西,第一时间是想找个地方爽一把先,但是往往搭建环境这个事情上怀疑人生,上网搜索吧,乱七八糟的讲啥都有。文档在这里,点我
其实官网就是给了2+N动作,首先就是设置一个配置参数,因为后面需要不断使用这个参数,再构建一个网络,可以理解后面的节点要相互通信,就都使用同一个网络就好了。
FLINK_PROPERTIES="jobmanager.rpc.address: jobmanager" docker network create flink-network
第二步,来个主节点
docker run \ --rm \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ flink:1.18.1-scala_2.12 jobmanager
其实这个时候已经可以在浏览器输入 http://localhost:8081,访问到了,不过玩多了大数据的人都知道,这种时候管的是主备,不能光这个。
下面就是启动从节点了:
docker run \ --rm \ --name=taskmanager \ --network flink-network \ --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ flink:1.18.1-scala_2.12 taskmanager
不过有个问题发现启动主节点的时候那个控制台一直没有退出,卡着,从节点这里好像没有办法去写命令,这里可以开一个新窗口去搞,没问题。
当然一模一样抄过来代码也显得我这种博客其实是废物,还不如直接去官网抄就好。当然,只有实际动手的同学才会对下面的内容感兴趣,所以我们对节点启动命令调整一下,首先是启动节点,我们希望在后台运行就可以了。
–rm 其实是说退出后可以把容器都销毁的意思,主打一个绿色环保,我们调整成 -d ,deamon 的意思。
主节点启动命令:
docker run \ -d \ --name=jobmanager \ --network flink-network \ --publish 8081:8081 \ --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ flink:1.18.1-scala_2.12 jobmanager
对应从节点, 相应改造即可,这个从节点,执行一次便会启动一个从节点,所以可以执行多次,但是如果每次执行的话taskmanager作为容器名字不能重复,不方便,所以我改了两个地方,一个是 调整为-d模式,后台执行
第二个是去掉指定容器名称的操作
docker run \ -d \ --network flink-network \ --env FLINK_PROPERTIES="${FLINK_PROPERTIES}" \ flink:1.18.1-scala_2.12 taskmanager
每次运行一次,都可以在Task managers的地方多新增节点,这便是分布式部署的样子啦。
这其实就结束了。
跑起来
flink其实是有很多开发好的应用的,不过在容器的环境,我们怎么跑起来,首先找到我们运行的容器,随便哪个都行
docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 26d17915e2dd flink:1.18.1-scala_2.12 "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 6123/tcp, 8081/tcp magical_carson a244103c431b flink:1.18.1-scala_2.12 "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 6123/tcp, 8081/tcp sharp_mestorf 926ecf993f0f flink:1.18.1-scala_2.12 "/docker-entrypoint.…" 24 minutes ago Up 24 minutes 6123/tcp, 8081/tcp epic_hofstadter cc868476ee11 flink:1.18.1-scala_2.12 "/docker-entrypoint.…" 28 minutes ago Up 28 minutes 6123/tcp, 8081/tcp taskmanager cd422928babc flink:1.18.1-scala_2.12 "/docker-entrypoint.…" About an hour ago Up About an hour 6123/tcp, 0.0.0.0:8081->8081/tcp jobmanager
docker容器是支持写一部分id就可以匹配,我们从容器上把jar可以copy到本机
docker cp 26d1:/opt/flink/examples/streaming/WordCount.jar .
然后在页面上上次jar即可
然后就跑起来了。
总结
本文其实是介绍了最长见的两种使用docker的场景,一个是自己开发的程序如何用docker跑起来,第二是使用现成的容器更快速让我们入门。这两种方式在以后会经常碰到。