Docker制作镜像的两种方式(在线制作和离线制作)

来自:网络
时间:2023-05-17
阅读:
目录

一、背景

系统有个功能需要依赖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/,进入容器可以看到挂载的目录下也有上传的文件。

Docker制作镜像的两种方式(在线制作和离线制作)

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

Docker制作镜像的两种方式(在线制作和离线制作)

安装后会报找不到 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 可以看到谷歌驱动安装成功了

Docker制作镜像的两种方式(在线制作和离线制作)

3.2 中文包安装

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

Docker制作镜像的两种方式(在线制作和离线制作)

yum安装中文包和字体配置

yum install fontconfig
yum groupinstall "fonts"

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

Docker制作镜像的两种方式(在线制作和离线制作)

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

Docker制作镜像的两种方式(在线制作和离线制作)

四、离线制作

离线制作,就是把依赖的环境都下载,依赖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/

五、验证

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

Docker制作镜像的两种方式(在线制作和离线制作)

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

Docker制作镜像的两种方式(在线制作和离线制作)

总结

返回顶部
顶部