Linux制作docker镜像

一、制作镜像

1.在/home/data/images目录下编写Dockerfile文件

Dockerfile:是制作镜像的文件

vi Dockerfile

FROM java:8

ENV JAVA_HOME=/usr/lib/jvm/jdk1.8.0_181

ENV PATH=$PATH:$JAVA_HOME/bin

ENV LC_ALL=en_US.utf8

ENV LANG=en_US.utf8

ENV LANGUAGE=en_US.utf8

MAINTAINER wx

ADD discipline-webapp-1.0.0-SNAPSHOT.jar app.jar

EXPOSE 7001

ENTRYPOINT ["java", "-Dfile.encoding=utf-8","-jar", "app.jar"]

PS:EXPOSE 7001: 暴露的端口号,即容器对外开放7001端口 

2.通过当前目录下的Dockerfile创建一个名为discipline/discipline:1.1的镜像

docker build -t discipline/discipline:1.1

3.创建容器

docker run -p 7001:7001 --name discipline \

        -e TZ="Asia/Shanghai" \

        -v /etc/localtime:/etc/localtime \

        -v /home/data/monitorlog/${app_name}/logs:/logs \

        -d discipline/discipline:latest

 或直接编写启动脚本(相当于步骤2,3

app_name='discipline'

docker build -t discipline/${app_name} .

sleep 1

docker stop ${app_name}

echo '--------stop container-------------'

docker rm ${app_name}

echo '--------rm container---------------'

docker run -p 7001:7001 --name ${app_name} \

        -e TZ="Asia/Shanghai" \

        -v /etc/localtime:/etc/localtime \

        -v /home/data/monitorlog/${app_name}/logs:/logs \

        -d discipline/${app_name}:latest

echo '---------start container---------'

docker rmi `docker images|grep none |awk '{print $3}'`

echo '--------rm none images-------------'

4.其他

二、制作镜像的原理

1.Dockerfile说明

镜像的定制实际上就是定制每一层所添加的配置、文件。如果我们可以把每一层修改、安装、构建、操作的命令都写入一个脚本,用这个脚本来构建、定制镜像,无法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是 Dockerfile

Dockerfile 是一个文本文件,其内包含了一条条的指令(Instruction),每一条指令构建一层,因此每一条指令的内容,就是描述该层应当如何构建。

以 nginx 镜像为例,这次我们使用 Dockerfile 来定制。

在一个空白目录中,建立一个文本文件,并命名为 Dockerfile

FROM nginx

RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

这个 Dockerfile 很简单,一共就两行。涉及到了两条指令,FROM 和 RUN

PS:镜像是打包好的软件,由程序代码、基础系统、依赖关系的软件包、系统库和工具组成

2. FROM 指定基础镜像

 所谓定制镜像,那一定是以一个镜像为基础,在其上进行定制。就像我们之前运行了一个 nginx 镜像的容器,再进行修改一样,基础镜像是必须指定的。而 FROM 就是指定基础镜像,因此一个 Dockerfile 中 FROM是必备的指令,并且必须是第一条指令

 scratch镜像是虚拟概念,并不实际存在,表示一个空白镜像

3.  RUN 执行命令

RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。其格式有两种: 

shell 格式:RUN <命令>,就像直接在命令行中输入的命令一样。刚才写的 Dockerfile 中的 RUN 指令就是这种格式。 

 RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index.html

exec 格式:RUN ["可执行文件", "参数1", "参数2"],这更像是函数调用中的格式。 

既然 RUN 就像 Shell 脚本一样可以执行命令,那么我们是否就可以像 Shell 脚本一样把每个命令对应一个 RUN 呢?比如这样: 

FROM debian:jessieRUN apt-get update
RUN apt-get install -y gcc libc6-dev make
RUN wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz"
RUN mkdir -p /usr/src/redis
RUN tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1
RUN make -C /usr/src/redis
RUN make -C /usr/src/redis install

之前说过,Dockerfile 中每一个指令都会建立一层,RUN 也不例外。每一个 RUN 的行为,就和刚才我们手工建立镜像的过程一样:新建立一层,在其上执行这些命令,执行结束后,commit 这一层的修改,构成新的镜像。

而上面的这种写法,创建了 7 层镜像。这是完全没有意义的,而且很多运行时不需要的东西,都被装进了镜像里,比如编译环境、更新的软件包等等。结果就是产生非常臃肿、非常多层的镜像,不仅仅增加了构建部署的时间,也很容易出错。这是很多初学 Docker 的人常犯的一个错误。

上面的 Dockerfile 正确的写法应该是这样: 

FROM debian:jessieRUN buildDeps='gcc libc6-dev make' \&& apt-get update \&& apt-get install -y $buildDeps \&& wget -O redis.tar.gz "http://download.redis.io/releases/redis-3.2.5.tar.gz" \&& mkdir -p /usr/src/redis \&& tar -xzf redis.tar.gz -C /usr/src/redis --strip-components=1 \&& make -C /usr/src/redis \&& make -C /usr/src/redis install \&& rm -rf /var/lib/apt/lists/* \&& rm redis.tar.gz \&& rm -r /usr/src/redis \&& apt-get purge -y --auto-remove $buildDeps

ps:在撰写 Dockerfile 的时候,要经常提醒自己,这并不是在写 Shell 脚本,而是在定义每一层该如何构建 

可以看到这一组命令的最后添加了清理工作的命令,删除了为了编译构建所需要的软件,清理了所有下载、展开的文件,并且还清理了 apt 缓存文件。这是很重要的一步,我们之前说过,镜像是多层存储,每一层的东西并不会在下一层被删除,会一直跟随着镜像。因此镜像构建时,一定要确保每一层只添加真正需要添加的东西,任何无关的东西都应该清理掉

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/3278.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

锁 synchronized和lock

Synchronized 原理&#xff1a; 方法级的同步是隐式&#xff0c; 即无需通过字节码指令来控制的&#xff0c; 它实现在方法调用和返回操 作之中。JVM 可以从方法常量池中的方法表结构(method_info Structure) 中的 ACC_SYNCHRONIZED 访问标志区分一个方法是否同步方法 。当方法…

uiautomation 监控 Discord客户端的聊天记录 附python代码

一个Python脚本,用于监控和抓取Discord客户端的聊天记录。它使用了`uiautomation`库来模拟用户界面操作, 定义了一个名为`discord`的类,它初始化了几个变量,包括一个用于控制UI自动化的`UiaAPI`对象,以及一个用于存储会话项目的列表`SessionItemList`。 通过UI自动化获取名…

深度学习与目标检测:从卷积神经网络到YOLOv8概念介绍

深度学习与目标检测&#xff1a;从卷积神经网络到YOLOv8的深入探索 随着人工智能技术的迅猛发展&#xff0c;深度学习和计算机视觉领域取得了举世瞩目的成果。在目标检测这一关键任务中&#xff0c;卷积神经网络&#xff08;CNN&#xff09;和YOLO系列模型发挥着至关重要的作用…

Redis中的Lua脚本(六)

Lua脚本 清空repl_scriptcache_dict字典 每当主服务器添加一个新的从服务器时&#xff0c;主服务器都会清空自己的repl_scriptcache_dict字典&#xff0c;这是因为随着新从服务器的出现&#xff0c;repl_scriptcache_字典里面记录的脚本已经不再被所有从服务器载入过&#xf…

使用 pytorch训练自己的图片分类模型

如何自己训练一个图片分类模型&#xff0c;如果一切从头开始&#xff0c;对于一般公司或个人基本是难以实现的。其实&#xff0c;我们可以利用一个现有的图片分类模型&#xff0c;加上新的分类&#xff0c;这种方式叫做迁移学习&#xff0c;就是把现有的模式知识&#xff0c;转…

leetcode77--组合

1. 题意 给定两个整数 n 和 k&#xff0c;返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 2. 题解 1. 回溯减枝 class Solution { public:vector<int> temp;vector<vector<int>> ans;void dfs(int cur, int n, int k) {// 剪…

流量分析利器arkime的学习之路(二)---API接口

前文回忆 《流量分析利器arkime的学习之路(一)---安装部署》 概述 注意点 Arkime对所有API调用都使用摘要身份验证,因此请确保在库或curl命令中启用摘要身份验证。学习如何进行API调用的最简单方法是打开浏览器的javascript控制台,观察Arkime UI正在进行的调用,它使用…

向表内INSERT数据出现ORA-00600 ktspgfb-inc2错误的分析处理

业务高峰期&#xff0c;业务维护人员反馈某业务卡主&#xff0c;发来报错一看&#xff0c;是ORA-00600...的&#xff0c;心理一下就紧张起来&#xff1b;当前版本的ORA-00600错误&#xff0c;基本分为了2类&#xff0c;要么没啥影响&#xff1b;如果对业务有影响了&#xff0c;…

强化学习的重要概念:环境、模型、策略和它们的关系

在强化学习中&#xff0c;环境&#xff08;Environment&#xff09;、模型&#xff08;Model&#xff09;和策略&#xff08;Policy&#xff09;是三个核心概念&#xff0c;它们之间的关系可以描述如下&#xff1a; 环境&#xff08;Environment&#xff09;&#xff1a; 环境是…

<component> <slot> <template>三者之间的区别与使用

学习目标&#xff1a; 目标 1、了解组件的含义 2、了解 的含义及用法 3、了解 的含义及用法 4、了解 的含义及用法 学习内容&#xff1a; 内容&#xff1a; 什么是组件&#xff1f; 组件的出现&#xff0c;就是为了拆分Vue实例的代码量&#xff0c;能够让我们以不同的组件&am…

deque的插入和删除

函数原型 两端插入操作 push_back(elem) //向容器尾部添加一个数据push_front(elem) //向容器头部插入一个数据pop_back() //删除容器最后一个数据 pop_front() //删除第一个容器第一个数据 …

点云数据处理的库

PCL、Open3D和OpenGL都是用于点云数据处理的常用库&#xff0c;它们各有优劣&#xff0c;具体如下&#xff1a; PCL&#xff08;Point Cloud Library&#xff09; PCL是一个非常流行的开源点云数据处理库&#xff0c;它支持从各种传感器&#xff08;如激光雷达、Kinect&#xf…

Python实战 | 只需“4步”入门网络爬虫(小白也会)

文章目录 Python实战 | 只需“4步”入门网络爬虫&#xff08;小白也会&#xff09;1&#xff1a;确定目标网站和数据2&#xff1a;安装必要的库3&#xff1a;编写爬虫代码4.目标网站的URL5.发送HTTP请求并获取响应内容6.使用BeautifulSoup解析HTML内容7.查找包含新闻标题和链接…

【golang学习之旅】Go 的基本数据类型

系列文章 【golang学习之旅】报错&#xff1a;a declared but not used 目录 系列文章总览布尔型&#xff08;bool&#xff09;字符串型&#xff08;string&#xff09;整数型&#xff08;int、uint、byte、rune&#xff09;浮点型&#xff08;float32、float64&#xff09;复…

【C++】——类与对象引入和认识

创作不易&#xff0c;多多支持&#xff01; 前言 有了上一篇博客的基础以后&#xff0c;就正式进入C类和对象的领域了&#xff0c;如果看完本篇文章对你有用&#xff0c;还请多多支持&#xff01;&#xff01;&#x1f618;&#x1f618; 一 面向过程和面向对象 1.面向过程 …

js的includes函数

在JavaScript中&#xff0c;includes() 是一个数组&#xff08;Array&#xff09;和字符串&#xff08;String&#xff09;对象的方法&#xff0c;用于确定一个数组是否包含一个特定的值&#xff0c;或者一个字符串是否包含一个特定的子串。如果找到该值或子串&#xff0c;则返…

MySql on duplicate key update

"ON DUPLICATE KEY UPDATE"是MySQL的语法&#xff0c;当尝试插入的行导致一个duplicate key错误&#xff08;如果该行中存在一个unique索引或primary key&#xff0c;并且该索引或primary key在表中已经存在&#xff09;&#xff0c;则执行UPDATE。 使用基本的SQL语…

单链表实现通讯录

不过多赘述了 顺序表的增删查改-CSDN博客https://blog.csdn.net/bkmoo/article/details/137566495?spm1001.2014.3001.5502 使用顺序表实现通讯录-CSDN博客https://blog.csdn.net/bkmoo/article/details/137676561?spm1001.2014.3001.5502这里没有使用文件操作只是简单的使…

全程免费的ssl证书申请——七步实现网站https

全程免费的ssl证书申请步骤如下&#xff1a; 1 准备工作 首先确定好需要的证书类型&#xff0c;如单域名证书、通配符证书和多域名证书&#xff0c;准备好需要安装证书的域名。 2 选择CA 选择提供免费证书的服务商——JoySSL&#xff0c;并访问其官方网站&#xff0c;创建一…

3d软件哪个适合新手学?3D动画渲染怎么好

在不同的行业领域&#xff0c;3D建模和动画的需求各异&#xff0c;因此所需的3D软件工具也会有所不同。对于刚开始接触3D设计的新手来说&#xff0c;软件的易操作性、丰富的学习资源以及与自己专业领域相关的功能是选择时的重要考虑因素。以下是几款适合初学者入门的3D软件推荐…