当前位置: 首页 > news >正文

分享制作Docker镜像的两种方式

一、背景

系统有个功能需要依赖chrome和chromedriver,利用无头浏览器实现截图功能,在虚拟机上能够正常运行,但切换到容器化的环境,因为基础镜像我们依赖的是openjdk,缺少相关驱动,同时翻了一下dockerhub,并没有找到现有的官方镜像能够支撑功能的实现,所以需要自己去制作Docker镜像。

二、依赖环境

制作镜像首先需要明确镜像所需要依赖的环境和作用范围。在这个场景中,需要安装chrome和chromedriver,同时还得有jdk的环境以支撑模块的运行,安装过程中需要解压缩包,所以还需要unzip、tar工具,同时还需要下载依赖,所以得有yum环境。

一般我们制作镜像都是依赖于某个镜像做为基础镜像在其上面来完成的,基础镜像这里我选择的是centos7.9.2009,大小204M,因为本身该镜像已经包含了tar和yum等基础运行环境,对于我们来说操作起来会比较方便。镜像制作分两中模式,这里我分为在线制作和离线制作,推荐采用离线制作的方式。

三、在线制作

3.1 chromedriver

在线制作就是依赖于某个基础镜像,在其运行的基础上安装号环境再重新打包成一个镜像。所以首先是拉取centos7.9.2009基础镜像到本地。

docker pull centos:centos7.9.2009

运行基础镜像,数据卷挂载本地目录/home/centos/到容器内部目录/home/env/,方便我们上传一些文件到容器内部

docker run -itd --name centos -v /home/centos/:/home/env/ centos:centos7.9.2009

chrome、chromedriver和jdk采用离线安装的方式,上传相关文件到宿主机/home/centos/,进入容器可以看到挂载的目录下也有上传的文件。

在这里插入图片描述

centos7.9.2009基础镜像没有unzip工具,使用 yum install -y unzip zip 安装工具,unzip chrome_rpm.zip 解压chrome_rpm,使用 rpm -Uvh *.rpm --nodeps --force 进行安装。

在这里插入图片描述

安装后会报找不到 xdg-icon-resource,这个不影响,安装完后继续处理 chromedriver,将 chromedriver 加压到指定目录,同时授予可执行权限。

unzip chromedriver_linux64.zip
mv chromedriver /usr/bin/

# 设置权限
chmod +x /usr/bin/chromedriver

使用 yum 安装 libxcb

yum install libxcb

libxcb 安装完后使用 /usr/bin/chromedriver 可以看到谷歌驱动安装成功了

在这里插入图片描述

3.2 中文包安装

使用chrome的过程中发现截图后很多中文显示不了,是因为服务器缺少了中文包。检查容器内部是否有中文包,命令不存在说明没有。

在这里插入图片描述

yum安装中文包和字体配置

yum install fontconfig
yum groupinstall "fonts"

安装之后重新验证,如果出现以下内容则说明安装成功

在这里插入图片描述

3.3 jdk1.8安装

jdk的安装比较简单,将 jdk 解压同时拷贝到 /usr/local/ 下就可以了

tar -zxvf jdk-8u251-linux-x64.tar.gz
mv jdk1.8.0_251 /usr/local/

上面只是移动了jdk文件的目录,但是还没有配置环境变量,试过直接在容器内部配置jdk的环境变量,但是打包后的镜像每次拉取都需要手动执行 source /etc/profile 环境变量才会生效。网上有的说可以把环境变量放到 ~/.bashrc 中,但是试了并不生效。想了下,可以依赖docker传递环境变量参数,所以先把安装了环境的构建成一个基础镜像,通过dockerfile携带环境变量,最终构建成一个完整的基础镜像。

把安装了环境的docker容器制作成镜像,同时推送到远程harbor仓库

# docker容器构建成镜像
docker commit -a "icc" -m "base images centos7.9.2009, include java、chrome and chromedriver" 671d33884ee6 127.0.0.1:10000/icc/openjdk:8-jdk-env

# 推送到远程仓库
docker push 127.0.0.1:10000/icc/openjdk:8-jdk-env

通过 dockerfile 的方式构建基础镜像,其中传递 JDK 的环境变量

FROM 127.0.0.1:10000/icc/openjdk:8-jdk-env

ENV JAVA_HOME=/usr/local/jdk1.8.0_251
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

WORKDIR /home/icc/

构建镜像并推送到远程harbor仓库

docker build --tag 127.0.0.1:10000/icc/openjdk:8-jdk-icc ./
docker push 127.0.0.1:10000/icc/openjdk:8-jdk-icc

在这里插入图片描述

四、离线制作

离线制作,就是把依赖的环境都下载,依赖Dockerfile帮我们完成环境的安装的镜像的制作。

编写Dockerfile文件

FROM centos:7

# 安装chrome
ADD google-chrome-stable.rpm /usr/local
RUN yum -y localinstall /usr/local/google-chrome-stable.rpm

# 安装chromedriver
ADD chromedriver.tar.gz /usr/bin

# 安装中文字体
RUN yum -y groupinstall "fonts"

# 安装JDK
ADD jdk-8u251-linux-x64.tar.gz /usr/local/

ENV JAVA_HOME=/usr/local/jdk1.8.0_251
ENV PATH=$PATH:$JAVA_HOME/bin
ENV CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar

WORKDIR /home/icc/

五、验证

对于模块的编排文件来说,只需要把基础镜像换一下便可以了

在这里插入图片描述

在k8s集群上可以看到也已经有相应的环境

在这里插入图片描述

相关文章:

  • MySQL表的约束
  • Axios源码仿写与二次封装
  • PHP学习笔记(才贯二酉)
  • 基于Springboot+vue的电影院管理系统(Java毕业设计)
  • 沉睡者IT - 闪剪AI数字人助你快速占领流量市
  • 4个Python推导式相关的开发技巧
  • 计算机网络——媒体接入控制
  • 一起来学反射
  • 一文了解Java序列化与反序列化
  • 【.Net实用方法总结】 整理并总结System.Data中DataColumn类及其方法介绍
  • ffmpeg、ffplay、ffprobe 常用命令详解(音视频必备)
  • [SpringMVC] SpringMVC入门
  • [ 数据结构 - C++]红黑树RBTree
  • 【闲笔杂谈】ArrayList的构造与扩容机制
  • Flink系列之:基于Flink CDC2.0实现海量数据的实时同步和转换
  • JS 中的深拷贝与浅拷贝
  • 【跃迁之路】【733天】程序员高效学习方法论探索系列(实验阶段490-2019.2.23)...
  • Apache的80端口被占用以及访问时报错403
  • eclipse(luna)创建web工程
  • GDB 调试 Mysql 实战(三)优先队列排序算法中的行记录长度统计是怎么来的(上)...
  • github从入门到放弃(1)
  • Go 语言编译器的 //go: 详解
  • IDEA 插件开发入门教程
  • JavaScript工作原理(五):深入了解WebSockets,HTTP/2和SSE,以及如何选择
  • java正则表式的使用
  • js继承的实现方法
  • LeetCode刷题——29. Divide Two Integers(Part 1靠自己)
  • mongodb--安装和初步使用教程
  • mysql 数据库四种事务隔离级别
  • PHP 程序员也能做的 Java 开发 30分钟使用 netty 轻松打造一个高性能 websocket 服务...
  • Spring技术内幕笔记(2):Spring MVC 与 Web
  • Sublime text 3 3103 注册码
  • ViewService——一种保证客户端与服务端同步的方法
  • vue的全局变量和全局拦截请求器
  • 包装类对象
  • 翻译 | 老司机带你秒懂内存管理 - 第一部(共三部)
  • 给第三方使用接口的 URL 签名实现
  • 开源中国专访:Chameleon原理首发,其它跨多端统一框架都是假的?
  • 蓝海存储开关机注意事项总结
  • 设计模式走一遍---观察者模式
  • 深入体验bash on windows,在windows上搭建原生的linux开发环境,酷!
  • 数据仓库的几种建模方法
  • 一起来学SpringBoot | 第十篇:使用Spring Cache集成Redis
  • 智能合约Solidity教程-事件和日志(一)
  • - 转 Ext2.0 form使用实例
  • ​【已解决】npm install​卡主不动的情况
  • ​ssh-keyscan命令--Linux命令应用大词典729个命令解读
  • ​七周四次课(5月9日)iptables filter表案例、iptables nat表应用
  • (003)SlickEdit Unity的补全
  • (06)Hive——正则表达式
  • (06)金属布线——为半导体注入生命的连接
  • (39)STM32——FLASH闪存
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)python旅游推荐系统 毕业设计 250623
  • (附源码)spring boot球鞋文化交流论坛 毕业设计 141436