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

 更新时间:2023年03月29日 11:18:55   作者:芋圆Magic  
我们知道要创建一个Docker容器,要先有Docker镜像,Docker镜像怎么创建的呢?下面这篇文章主要给大家介绍了关于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集群上可以看到也已经有相应的环境

总结

到此这篇关于Docker制作镜像的两种方式的文章就介绍到这了,更多相关Docker制作镜像方式内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 聊聊Docker中容器的创建与启停问题

    聊聊Docker中容器的创建与启停问题

    一个进程可以视为一个被执行的应用程序,同样,一个Docker容器可以视为一个运行中的Docker镜像,这篇文章主要介绍了Docker中容器的创建与启停,需要的朋友可以参考下
    2022-06-06
  • Docker添加tomcat容器无法访问首页解决方案

    Docker添加tomcat容器无法访问首页解决方案

    这篇文章主要介绍了Docker添加tomcat容器无法访问首页解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-07-07
  • 详解Docker Compose 中可用的环境变量问题

    详解Docker Compose 中可用的环境变量问题

    Compose 的多个部分在某种情况下处理环境变量。这篇文章主要介绍了Docker Compose 中可用的环境变量问题,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2018-12-12
  • 使用Docker创建FTP服务器的过程解析

    使用Docker创建FTP服务器的过程解析

    这篇文章主要介绍了使用Docker创建FTP服务器的过程解析,使用 Docker 搭建 FTP 服务,不仅十分简单,而且可以对宿主机有一定的隔离,对Docker创建FTP服务器的过程感兴趣的朋友一起看看吧
    2022-04-04
  • CentOS 7上安装Docker 1.8 的步骤详解

    CentOS 7上安装Docker 1.8 的步骤详解

    本文分步骤给大家介绍了CentOS 7上安装Docker 1.8 的步骤详解,需要的朋友可以参考下
    2018-11-11
  • 教你如何利用docker-maven-plugin自动化部署

    教你如何利用docker-maven-plugin自动化部署

    本文通过两个例子给大家讲解如何利用docker-maven-plugin自动化部署,给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧
    2021-09-09
  • docker 创建容器时指定容器ip的实现示例

    docker 创建容器时指定容器ip的实现示例

    在实际部署中,我们需要指定容器ip,本文主要介绍了docker 创建容器时指定容器ip,文中通过示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-12-12
  • Docker部署Mysql,.Net6,Sqlserver等容器

    Docker部署Mysql,.Net6,Sqlserver等容器

    这篇文章介绍了Docker部署Mysql,.Net6,Sqlserver等容器的方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12
  • 用Docker作为PaaS的替代方案是否完美无缺

    用Docker作为PaaS的替代方案是否完美无缺

    Docker的出现似乎又带来了一种新的选择,而且对于开发者来说更加灵活、便捷、易用。既然用户可以直接在Docker上运行,PaaS是否还有应用场景?面对企业繁杂的应用环境,用Docker作为PaaS的替代方案是否完美无缺
    2016-11-11
  • docker镜像管理命令详解

    docker镜像管理命令详解

    这篇文章主要介绍了docker镜像管理命令,我们也可以使用命令来搜索镜像,比如我们需要一个tomcat的镜像来作为我们的web服务,我们可以通过 docker search 命令搜索tomcat来寻找适合我们的镜像,本文给大家介绍的非常详细,需要的朋友参考下吧
    2022-07-07

最新评论