欢送拜访我的GitHub
https://github.com/zq2599/blog_demos
内容:所有原创文章分类汇总及配套源码,波及Java、Docker、Kubernetes、DevOPS等;
本篇概览
- 如果您看过《三分钟极速体验:Java版人脸检测》一文,甚至入手实际操作过,您应该会对背地的技术细节感兴趣,接下来就请随欣宸一起入手实战,从无到有将这个利用开发进去;
- 首先确定咱们的指标:
- 开发出java版的人脸检测利用
- 将此利用制作成docker镜像
- 在docker环境运行这个利用
- 基于上述指标,咱们能够确定以下操作步骤:
- 筹备好docker根底镜像
- 开发java利用
- 将java利用打包成package文件,集成到根底镜像中,失去最终的java利用镜像
- 本篇的指标就是上述第一步:<font color="blue">筹备好docker根底镜像</font>
对于人脸检测利用的根底镜像
- 如果您有过制作java利用镜像的经验,肯定会产生疑难:如下图红框所示,个别不都是把OpenJDK的官网镜像作为根底镜像吗?为啥要拿一篇文章来讲根底镜像的事件?
- 对于人脸检测的利用来说,OpenJDK的官网镜像是不够用的,因为用java实现人脸检测须要一个关键技术:<font color="red">javacv</font>,在javacv运行过程中须要用到opencv的一些本地库,因而须要在运行环境中装置opencv
- 如下图所示,一个人脸检测利用自下而上由以下六局部形成,如果将底部的操作系统、JDK、OpenCV做成根底镜像就不便多了,咱们开发利用的时候只有需关注下面三层即可,而下面三层不就是个一般的maven工程吗?
- 至此,聪慧的您对接下来要做的事件应该很分明了:编写Dockerfile文件用来制作镜像,这个镜像中要有<font color="blue">CentOS + JDK1.8 + OpenCV</font>
分两步走
- 我打算先做一个CentOS + JDK的镜像,在此基础上再做一个集成了OpenCV的镜像,这样在一些不须要OpenCV的场景中,我还能独自应用CentOS + JDK1.8的镜像
- 剖析实现,开始入手吧
CentOS + JDK的镜像
- 之所以抉择CentOS作为操作系统,是因为平时工作中最罕用的就是它了
- 纵观OpenJDK官网的各种镜像,并没有发现CentOS作为操作系统的,因而本人入手吧,思路很简略:找到OpenJDK的Dockerfile文件,把它的根底镜像换成CentOS7.6即可
- 以下是Dockerfile的所有内容,可见外围是依据不同的操作系统下载文件而后装置,逻辑简略清晰就不多说了:
FROM centos:7.6.1810RUN set -eux; \ yum install -y \ gzip \ tar \ binutils \ freetype fontconfig \ ;ENV JAVA_HOME /usr/java/openjdk-8ENV PATH $JAVA_HOME/bin:$PATH# Default to UTF-8 file.encodingENV LANG C.UTF-8RUN set -eux; \ \ arch="$(objdump="$(command -v objdump)" && objdump --file-headers "$objdump" | awk -F '[:,]+[[:space:]]+' '$1 == "architecture" { print $2 }')"; \ case "$arch" in \ 'i386:x86-64') \ downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_x64_linux_8u292b10.tar.gz'; \ ;; \ 'aarch64') \ downloadUrl='https://github.com/AdoptOpenJDK/openjdk8-upstream-binaries/releases/download/jdk8u292-b10/OpenJDK8U-jdk_aarch64_linux_8u292b10.tar.gz'; \ ;; \ *) echo >&2 "error: unsupported architecture: '$arch'"; exit 1 ;; \ esac; \ \ curl -fL -o openjdk.tgz "$downloadUrl"; \ curl -fL -o openjdk.tgz.asc "$downloadUrl.sign"; \ \ export GNUPGHOME="$(mktemp -d)"; \# pre-fetch Andrew Haley's (the OpenJDK 8 and 11 Updates OpenJDK project lead) key so we can verify that the OpenJDK key was signed by it# (https://github.com/docker-library/openjdk/pull/322#discussion_r286839190)# we pre-fetch this so that the signature it makes on the OpenJDK key can survive "import-clean" in gpg gpg --batch --keyserver keyserver.ubuntu.com --recv-keys EAC843EBD3EFDB98CC772FADA5CD6035332FA671; \# TODO find a good link for users to verify this key is right (https://mail.openjdk.java.net/pipermail/jdk-updates-dev/2019-April/000951.html is one of the only mentions of it I can find); perhaps a note added to https://adoptopenjdk.net/upstream.html would make sense?# no-self-sigs-only: https://salsa.debian.org/debian/gnupg2/commit/c93ca04a53569916308b369c8b218dad5ae8fe07 gpg --batch --keyserver keyserver.ubuntu.com --keyserver-options no-self-sigs-only --recv-keys CA5F11C6CE22644D42C6AC4492EF8D39DC13168F; \ gpg --batch --list-sigs --keyid-format 0xLONG CA5F11C6CE22644D42C6AC4492EF8D39DC13168F \ | tee /dev/stderr \ | grep '0xA5CD6035332FA671' \ | grep 'Andrew Haley'; \ gpg --batch --verify openjdk.tgz.asc openjdk.tgz; \ rm -rf "$GNUPGHOME"; \ \ mkdir -p "$JAVA_HOME"; \ tar --extract \ --file openjdk.tgz \ --directory "$JAVA_HOME" \ --strip-components 1 \ --no-same-owner \ ; \ rm openjdk.tgz*; \ \ rm -rf "$JAVA_HOME/jre/lib/security/cacerts"; \# see "update-ca-trust" script which creates/maintains this cacerts bundle ln -sT /etc/pki/ca-trust/extracted/java/cacerts "$JAVA_HOME/jre/lib/security/cacerts"; \ \# https://github.com/oracle/docker-images/blob/a56e0d1ed968ff669d2e2ba8a1483d0f3acc80c0/OracleJava/java-8/Dockerfile#L17-L19 ln -sfT "$JAVA_HOME" /usr/java/default; \ ln -sfT "$JAVA_HOME" /usr/java/latest; \ for bin in "$JAVA_HOME/bin/"*; do \ base="$(basename "$bin")"; \ [ ! -e "/usr/bin/$base" ]; \ alternatives --install "/usr/bin/$base" "$base" "$bin" 20000; \ done; \ \# basic smoke test javac -version; \ java -version
- 写完之后执行<font color="blue">docker build -t bolingcavalry/centos7.6-jdk8:0.0.1 .</font>即可生成镜像,如果您有hub.docker.com的账号,还能够将其推送到地方仓库,给更多人应用
- 用history命令看看镜像内容,详情如下,共计五百多兆,曾经不小了:
CN0014009475M:~ will$ docker history bolingcavalry/centos7.6-jdk8:0.0.1IMAGE CREATED CREATED BY SIZE COMMENTa5dead4a6505 2 days ago /bin/sh -c set -eux; arch="$(objdump… 209MB <missing> 2 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B <missing> 2 days ago /bin/sh -c #(nop) ENV PATH=/usr/java/openjd… 0B <missing> 2 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/o… 0B <missing> 2 days ago /bin/sh -c set -eux; yum install -y … 144MB <missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 years ago /bin/sh -c #(nop) ADD file:54b004357379717df… 202MB
- 我这里曾经推送到hub.docker.com下来了,执行以下命令即可下载到本地:
docker pull bolingcavalry/centos7.6-jdk8:0.0.3
CentOS+JDK+OpenCV镜像
- 接下来能够集成OpenCV了,Dockerfile内容如下所示,根底镜像是刚刚做好的<font color="blue">bolingcavalry/centos7.6-jdk8:0.0.1</font>,先是装置一大堆编译所需的利用,而后下载OpenCV-3.4.3版本的源码,而后编译,就这么简略(但其间的调试工作还是不少的,不说了,说多了都是泪):
FROM bolingcavalry/centos7.6-jdk8:0.0.1RUN echo "export LC_ALL=en_US.UTF-8" >> /etc/profile \ && source /etc/profileRUN set -eux; \ yum install -y \ make \ cmake \ gcc \ gcc-c++ \ gtk+-devel \ gimp-devel \ gimp-devel-tools \ gimp-help-browser \ zlib-devel \ libtiff-devel \ libjpeg-devel \ libpng-devel \ gstreamer-devel \ libavc1394-devel \ libraw1394-devel \ libdc1394-devel \ jasper-devel \ jasper-utils \ swig \ python \ libtool \ nasm \ build-essential \ ant \ unzip \ ;RUN set -eux; \ curl -fL -o opencv-3.4.3.zip https://codeload.github.com/opencv/opencv/zip/3.4.3; \ unzip opencv-3.4.3.zip; \ rm -rf opencv-3.4.3.zip; \ cd opencv-3.4.3; \ mkdir build; \ cd build; \ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local ..; \ make; \ make install; \ cmake -D CMAKE_BUILD_TYPE=RELEASE -D CMAKE_INSTALL_PREFIX=/usr/local -DBUILD_TESTS=OFF ..;\ make -j8; \ make install
- 写完之后执行<font color="blue">docker build -t bolingcavalry/opencv3.4.3:0.0.3 .</font>即可生成镜像,如果您有hub.docker.com的账号,还能够将其推送到地方仓库,给更多人应用
- 用history命令看看镜像内容,详情如下,倒吸一口凉气,这么大的体积,敬爱的读者们会不会打死我...:
CN0014009475M:~ will$ docker history bolingcavalry/opencv3.4.3:0.0.3IMAGE CREATED CREATED BY SIZE COMMENTf0306d7a2594 2 days ago /bin/sh -c set -eux; curl -fL -o opencv-… 2.99GB <missing> 2 days ago /bin/sh -c set -eux; yum install -y … 638MB <missing> 2 days ago /bin/sh -c echo "export LC_ALL=en_US.UTF-8" … 1.84kB <missing> 2 days ago /bin/sh -c set -eux; arch="$(objdump… 209MB <missing> 2 days ago /bin/sh -c #(nop) ENV LANG=C.UTF-8 0B <missing> 2 days ago /bin/sh -c #(nop) ENV PATH=/usr/java/openjd… 0B <missing> 2 days ago /bin/sh -c #(nop) ENV JAVA_HOME=/usr/java/o… 0B <missing> 2 days ago /bin/sh -c set -eux; yum install -y … 144MB <missing> 2 years ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B <missing> 2 years ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B <missing> 2 years ago /bin/sh -c #(nop) ADD file:54b004357379717df… 202MB
- 我这里曾经推送到hub.docker.com下来了,执行以下命令即可下载到本地:
docker pull bolingcavalry/opencv3.4.3:0.0.3
- 这里要揭示一下,opencv的编译是十分耗时的,请确保docker宿主机的性能不要太差,也请您急躁期待编译过程
- 至此,合乎咱们要求的根底镜像<font color="blue">bolingcavalry/opencv3.4.3:0.0.3</font>已制作实现,有了它,咱们的Java利用所需的jdk和opencv就凑齐了,接下来的文章咱们一起去开发这个人脸检测的利用吧;
你不孤独,欣宸原创一路相伴
- Java系列
- Spring系列
- Docker系列
- kubernetes系列
- 数据库+中间件系列
- DevOps系列
欢送关注公众号:程序员欣宸
微信搜寻「程序员欣宸」,我是欣宸,期待与您一起畅游Java世界...
https://github.com/zq2599/blog_demos