【docker三】Docker镜像的创建方法

目录

一、Docker镜像:

1、 镜像的概念

2、docker的创建镜像方式:

1.1、基于已有镜像进行创建:

1.2、基于模版创建:

1.3、基于dockerfile创建:

二、Dockerfile概述

1、Dockerfile概念:

2、dockerfile分层:

3、dockerfile的结构:

4、dockerfile的语法:

5、CMD和ENTRYPOINT的区别

6、COPY和ADD之间的区别:

7、RUN命令的优化:

三、基于Dockerfile创建镜像实例

1、基于Dockerfile构建镜像的步骤

2、构建一个httpd的dockerfile:

3、镜像容量过大的解决方案 :二层构建

4、构建一个nginx的dockerfile:


一、Docker镜像:

1、 镜像的概念

镜像是创建容器的基础。

镜像是一个只读的模板文件,里面包含运行容器中的应用程序所有需要的所有内容(应用程序文件、配置文件、运行库文件、依赖包等)。

2、docker的创建镜像方式:

1.1、基于已有镜像进行创建:

可以根据官方提供的镜像源创建镜像,然后拉起容器。是一个白白板,只能提供基础的功能,扩展性的功能还是需要自定义(进入容器操作)

1.2、基于模版创建:

通过导入操作系统模板文件可以生成镜像,模板可以从OPENVZ 开源项目下载

下载模版地址:Index of /template/precreated

模板里面就是使用docker export 命令导出的容器文件

导入为镜像,两种方法

cat debian-7.0-x86-minimal.tar.gz | docker import - debian:test  #方法一

docker import debian-7.0-x86-minimal.tar.gz -- debian:test  #方法二

查看镜像

docker images

使用导入的镜像创建容器

docker run -itd debian:test bash

docker ps -a

1.3、基于dockerfile创建:

生产中都是基于dockerfile

dockerfile:联合文件系统(UnionFS),docker镜像的基础,镜像通过分层来进行集成。

特性:一次同时加载多个文件系统,但是从外面来看,就是一个文件系统。

镜像加载的原理:docker镜像实际上就是由一层一层的文件系统组成,这种层级的文件系统就是UnionFS

每一层都是一个layers(层次),每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是RootFS

二、Dockerfile概述

1、Dockerfile概念:

dockerfile:创建镜像,创建自定义镜像

包括配置文件,挂载点,对外暴露的端口。设置环境变量

dockerfile的核心作用:

用户个性化定制docker的镜像

2、dockerfile分层:

bootfs:宿主机的引导文件系统,启动操作系统的文件,启动容器需要的最基本的文件。包含宿主机的bootloader和kernel。宿主机提供的内核和引导程序

rootfs:会给镜像自动创建一个操作系统。就是容器的操作系统,在dockerfile中,我们可以自己指定。rootfs是多个基础镜像和应用镜像结合起来的只读层。镜像实际上就是一个只读文件

容易基于镜像实例,运行起来之后,容器变成一个可读可写层

Docker镜像结构的分层

镜像不是一个单一的文件,而是有多层构成。容器其实是在镜像的最上面加了一层读写层,

在运行容器里做的任何文件改动,都会写到这个读写层。如果删除了容器,也就删除了其最上面的读写层,

文件改动也就丢失了。Docker使用存储驱动管理镜像每层内容及可读写层的容器层。

1、Dockerfile中的每个指令都会创建一个新的镜像层;

2、镜像层将被缓存和复用;

3、当Dockerfile的指令修改了,复制的文件变化了,或者构建镜像时指定的变量不同了,

对应的镜像层缓存就会失效;

4、某一层的镜像缓存失效,它之后的镜像层缓存都会失效;

5、镜像层是不可变的,如果在某一层中添加一个文件,然后在下一层中删除它,

则镜像中依然会包含该文件,只是这个文件在Docker 容器中不可见了。

3、dockerfile的结构:

  1. 基础镜像信息
  2. 维护者信息
  3. 镜像的操作指令
  4. 容器启动时,执行的命令

4、dockerfile的语法:

dockerfile中所有语法都是大写

FROM:指定基础镜像信息。指定容器的操作系统

MAINTAINER:指定维护者信息(可有可无)

RUN:在基础的镜像上执行的命令,每个RUN就是一层,分层越多,镜像就越大

ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)

CMD:指定容器运行时的默认命令(docker run /bin/bash 后面加了其他命令。CMD的指令将会被覆盖。CMD后面不能加/bin/bash创建

EXPOSE:暴露端口(指定容器的运行端口)

ENV:设置环境变量,环境变量可以被RUN命令使用(声明容器运行需要的环境变量)

ADD:复制,解压。解压不支持.zip和.rar格式。能解压tar.gz tar.bz2 支持url地址解压和复制(主要作用 解压)

COPY:复制文件,不能解压,只能复制本地文件。文件要和dockerfile在一个目录(官方推荐的复制命令)

VOLUME:创建一个容器内的挂载点,既可以为宿主机挂载,也可以实现容器与容器之间挂载

USER:设置运行镜像时使用的用户或者他的UID(可有可无,可以不加)

WORKDIR:为后续指令设置的工作目录

ONBUILD:这个镜像可以被其他镜像引用,需要这个命令。

ARG:传参,用于创建容器时,传递参数(可有可无)。ENV是容器运行时设置环境变量

5、CMD和ENTRYPOINT的区别

都是可以作为容器启动时的默认命令。

区别:

  1. CMD可以把参数传给ENTRYPOINT
  2. 有多个ENTRYPOINT和多个CMD,只会运行最后一个(一个dockerfile中只会有一个ENTRYPOINT和CMD)
  3. ENTRYPOINT的指令不会被覆盖,CMD的指令如果在docker run的后面加上输出,会被覆盖
  4. ENTRYPOINT和CMD的指令都是在容器启动时执行,都会成为容器的主进程。主进程负责接收信号,由主进程处理容器的生命周期,主进程一旦退出容器也将终止运行

6、COPY和ADD之间的区别:

共同点:COPY和ADD都可以把本地文件复制到镜像中,但是官方推荐如果是复制使用COPY

区别:

ADD可以解压,如果是一个压缩文件,ADD在复制之后会自动解压(tar.gz tar.bz2)可以支持URL下载源文件,只能支持下载,但是不能解压。通过URL拷贝的文件无法自动解压

COPY只能复制,不能解压,而且只能是本地文件,不支持URL路径

ADD 的优点: 在执行 <源文件> 为 tar 压缩文件的话,压缩格式为 gzip、bzip2 以及 xz 的情况下,会自动复制并解压到 <目标路径>。

ADD 的缺点: 在不解压的前提下,无法复制 tar 压缩文件。会令镜像构建缓存失效,

从而可能会令镜像构建变得比较缓慢。具体是否使用,可以根据是否需要自动解压来决定。

7、RUN命令的优化:

主要是减少镜像的层数,把多个RUN命令写在一块。

1、&&符号:

RUN yum -y install nginx && make -j 4 && make install

前一个命令自行成功才会执行下一个命令

2、;分号符号

RUN yum -y install nginx ; make -j 4 ; make install

不管前一个命令是否成功,后面的命令都会执行

3、|| 符号

RUN yum -y install nginx || make -j 4

如果前面的命令执行失败,才会执行后面的操作

4、\ 反斜杠符号

RUN yum -y install nginx \

&& make -j 4 \

&& make install

换行,提高可读性

三、基于Dockerfile创建镜像实例

Dockerfile创建镜像:

创建一个镜像,在镜像中自定义安装部署组件配置

1、基于Dockerfile构建镜像的步骤


在编写 Dockerfile 时,有严格的格式需要遵循。

1)第一行 用FROM指令指明所用的基础镜像;

2)之后用MAINTAINER指令说明维护镜像的用户信息;

3)然后用镜像操作相关指令,比如RUN EXPOSE ENV ADD COPY 等指令,编写构建镜像的过程。每运行一条指令,都会给基础镜像添加新的一层;

4)结尾使用CMD/ENTRYPOINT指令指定容器启动时执行的命令;

5)最后使用docker build -t 新镜像名:标签 . [-f Dockerfile文件路径]命令构建镜像。
 

2、构建一个httpd的dockerfile:

Dockerfile文件要和需要解压的文件在一个目录下

FROM centos:7

MAINTAINER this is my  diy apache <dn>

RUN yum install -y gcc gcc-c++ make pcre pcre-devel expat-devel perl

ADD apr-1.6.2.tar.gz /opt/

ADD apr-util-1.6.0.tar.gz /opt/

ADD httpd-2.4.29.tar.bz2 /opt/

RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\

cd /opt/httpd-2.4.29/ &&\

./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\

make -j 4 && make install

EXPOSE 80

CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache:centos .

docker run -itd --name test1 -p 334:80 apache:centos

若yum安装错误,重启docker就行

3、镜像容量过大的解决方案 :二层构建

基础镜像尽量使用轻量级最小化的镜像。

Dockerfile中尽量把RUN指令合并在一起,减少镜像的层数(因为每一个RUN指令就是一个镜像层)。

多级构建(拿Dockerfile构建好的镜像再构建一次)。

二层构建(了解):压缩镜像大小

#基层镜像

FROM centos:7 AS first

#镜像作者信息描述

MAINTAINER this is apache image <yh 2022-11-23 >

#指定的Linu执行脚本

RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl

#将源码编译的安装包安放到容器中并进行解压

ADD apr-1.6.2.tar.gz /opt/

ADD apr-util-1.6.0.tar.gz /opt/

ADD httpd-2.4.29.tar.bz2 /opt/

#进行源码编译安装

RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util && cd /opt/httpd-2.4.29 && ./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi && make -j 4 && make install

#二阶段构建

FROM centos:7

#将一阶段的已安装好的包安防到二阶端中,并舍弃一阶段的其他无用资源

COPY --from=first  /usr/local/httpd  /usr/local/httpd

#安装apache运行所需的环境依赖包,不再安装源码编译所需的依赖包

RUN yum install -y pcre pcre-devel expat-devel perl

EXPOSE 80

ENTRYPOINT ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]

docker build -t apache1:centos .

4、构建一个nginx的dockerfile:

Dockerfile:

FROM centos:7

MAINTAINER "this is nginx <koeda>"

RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl  openssl-nginx

ADD nginx-1.22.0.tar.gz /opt

RUN useradd -M -s /sbin/nologin nginx

RUN cd /opt/nginx-1.22.0/ &&\

./configure --prefix=/usr/local/nginx \

--user=nginx \

--group=nginx \

--with-http_ssl_module \

--with-http_v2_module \

--with-http_realip_module \

--with-http_stub_status_module \

--with-http_gzip_static_module \

--with-pcre \

--with-stream \

--with-stream_ssl_module \

--with-stream_realip_module &&\

make && make install &&\

chown -R nginx.nginx /usr/local/nginx &&\

ln -s /usr/local/nginx/sbin/nginx /usr/sbin/ &&\

echo "[Unit] \

Description=nginx - high performance web server \

Documentation=http://nginx.org/en/docs/ \

After=network-online.target remote-fs.target nss-lookup.target \

Wants=network-online.target \

[Service] \

Type=forking \

PIDFile=/usr/local/nginx/run/nginx.pid \

ExecStart=/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf \

ExecReload=/bin/kill -s HUP $MAINPID \

ExecStop=/bin/kill -s TERM $MAINPID \

[Install] \

WantedBy=multi-user.target" > /lib/systemd/system/nginx.service &&\

mkdir -p /usr/local/nginx/run/ &&\

sed '/#pid/c pid /usr/local/nginx/run/nginx.pid;' /usr/local/nginx/conf/nginx.conf &&\

echo "this is nginx:docker" > /usr/local/nginx/html/index.html &&\

/usr/local/nginx/sbin/nginx

EXPOSE 80

CMD ["nginx","-g","daemon off;"]

docker build -t nginx:centos .

docker run -itd --name test1 -p 888:80 nginx:centos

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【UI自动化测试】appium+python+unittest+HTMLRunner

简介 获取AppPackage和AppActivity 定位UI控件的工具 脚本结构 PageObject分层管理 HTMLTestRunner生成测试报告 启动appium server服务 以python文件模式执行脚本生成测试报告 下载与安装 下载需要自动化测试的App并安装到手机 获取AppPackage和AppActivity 参考&#xff…

AWS攻略——使用中转网关(Transit Gateway)连接不同区域(Region)VPC

文章目录 Peering方案Transit Gateway方案环境准备创建Transit Gateway Peering Connection接受邀请修改中转网关路由修改被邀请方中转网关路由修改邀请方中转网关路由 测试修改Public子网路由 知识点参考资料 区别于 《AWS攻略——使用中转网关(Transit Gateway)连接同区域(R…

云降水物理基础

云降水物理基础 云的分类 相对湿度变化方程 由相对湿度的定义&#xff0c;两边取对数之后可以推出 联立克劳修斯-克拉佩龙方程&#xff08;L和R都为常数&#xff09; 由右式看出&#xff0c;增加相对湿度的方式&#xff1a;增加水汽&#xff08;de增大&#xff09;和降低…

SpringData JPA 搭建 xml的 配置方式

1.导入版本管理依赖 到父项目里 <dependencyManagement><dependencies><dependency><groupId>org.springframework.data</groupId><artifactId>spring-data-bom</artifactId><version>2021.1.10</version><scope>…

全新UI彩虹外链网盘系统源码V5.5/支持批量封禁+优化加载速度+用户系统与分块上传

源码简介&#xff1a; 全新UI彩虹外链网盘系统源码V5.5&#xff0c;它可以支持批量封禁优化加载速度。新增用户系统与分块上传。 彩虹外链网盘&#xff0c;作为一款PHP网盘与外链分享程序&#xff0c;具备广泛的文件格式支持能力。它不仅能够实现各种格式文件的上传&#xff…

数据接口测试工具 Postman 介绍!

此文介绍好用的数据接口测试工具 Postman&#xff0c;能帮助您方便、快速、统一地管理项目中使用以及测试的数据接口。 1. Postman 简介 Postman 一款非常流行的 API 调试工具。其实&#xff0c;开发人员用的更多。因为测试人员做接口测试会有更多选择&#xff0c;例如 Jmeter…

LeetCode-周赛-思维训练-中等难度

第一题 1798. 你能构造出连续值的最大数目 解题思路 我们先抛开原题不看&#xff0c;可以先完成一道简单的题目&#xff0c;假设现在就给你一个目标值X&#xff0c;问你能够构造出从【1~X】的连续整数&#xff0c;最小需要几个数&#xff1f; 贪心假设期望&#xff1a;我们要…

node14升级node16之后,webpack3项目无法启动处理

node从14升级到16之后&#xff0c;项目就无法启动了&#xff0c;研究了webpack3升级5&#xff0c;研究好几个小时都无法启动&#xff0c;最后发现&#xff0c;微微升级几个版本就可以了。webpack还是3 版本改了好多个的&#xff0c;但是不确定具体是哪几个起作用的&#xff0c;…

【LVGL】STM32F429IGT6(在野火官网的LCD例程上)移植LVGL官方的例程(还没写完,有问题 排查中)

这里写目录标题 前言一、本次实验准备1、硬件2、软件 二、移植LVGL代码1、获取LVGL官方源码2、整理一下&#xff0c;下载后的源码文件3、开始移植 三、移植显示驱动1、enable LVGL2、修改报错部分3、修改lv_config4、修改lv_port_disp.c文件到此步遇到的问题 Undefined symbol …

Docker中部署ElasticSearch 和Kibana,用脚本实现对数据库资源的未授权访问

图未保存&#xff0c;不过文章当中的某一步骤可能会帮助到您&#xff0c;那么&#xff1a;感恩&#xff01; 1、docker中拉取镜像 #拉取镜像 docker pull elasticsearch:7.7.0#启动镜像 docker run --name elasticsearch -d -e ES_JAVA_OPTS"-Xms512m -Xmx512m" -e…

数字图像处理(实践篇)二十一 人脸识别

目录 1 安装face_recognition 2 涉及的函数 3 人脸识别方案 4 实践 使用face_recognition进行人脸识别。 1 安装face_recognition pip install face_recognition 或者 pip --default-timeout100 install face_recognition -i http://pypi.douban.com/simple --trusted-…

c#读取XML文件实现晶圆wafermapping显示demo计算电机坐标控制电机移动

c#读取XML文件实现晶圆wafermapping显示 功能&#xff1a; 1.读取XML文件&#xff0c;显示mapping图 2.在mapping视图图标移动&#xff0c;实时查看bincode,x,y索引与计算的电机坐标 3.通过设置wafer放在平台的位置x,y轴电机编码值&#xff0c;相机在wafer的中心位置&#…

类与接口常见面试题

抽象类和接口的对比 抽象类是用来捕捉子类的通用特性的。接口是抽象方法的集合。 从设计层面来说&#xff0c;抽象类是对类的抽象&#xff0c;是一种模板设计&#xff0c;接口是行为的抽象&#xff0c;是一种行为的规范。 相同点 接口和抽象类都不能实例化都位于继承的顶端…

每日一题,头歌平台c语言题目

任务描述 题目描述:输入一个字符串&#xff0c;输出反序后的字符串。 相关知识&#xff08;略&#xff09; 编程要求 请仔细阅读右侧代码&#xff0c;结合相关知识&#xff0c;在Begin-End区域内进行代码补充。 输入 一行字符 输出 逆序后的字符串 测试说明 样例输入&…

老师们居然这样把考试成绩发给家长

教育是一个复杂而多元的过程&#xff0c;其中考试成绩的发布和沟通是教育过程中的一个重要环节。然而&#xff0c;有些老师在发布考试成绩时&#xff0c;采取了一些不恰当的方式&#xff0c;给家长和学生带来了不必要的困扰和压力。本文将探讨老师们不应该采取的发布考试成绩的…

六级高频词组1

目录 词组 参考链接 词组 1. abide by&#xff08;be faithful to &#xff1b;obey&#xff09;忠于&#xff1b;遵守。 2. be absent from… 缺席&#xff0c;不在 3. absence or mind&#xff08;being absent-minded&#xff09; 心不在焉 4. absorb&#xff08;take …

进程的同步和异步、进程互斥

一、进程同步和异步 同步&#xff08;Synchronous&#xff09;&#xff1a; 同步指的是程序按照顺序执行&#xff0c;一个操作完成后才能进行下一个操作。在多进程或多线程的环境中&#xff0c;同步意味着一个进程&#xff08;或线程&#xff09;在执行某个任务时&#xff0c;…

大致人类应该是短时记忆和利用短时记忆控制利用周围环境达到长期记忆的吧

这里写目录标题 图代码代码解析图 代码 import timedef route_llm(route_text):passdef write_to_dask(one_sum, one_text, one_path

每日一题 1631. 最小体力消耗路径(中等,最小最大值)

最小最大值问题&#xff0c;二分答案搜索heights的最大值为106&#xff0c;所以右边界为106&#xff0c;左边界为0&#xff0c;通过dfs来判断是否存在一条路径&#xff0c;其中所有的相邻格子的高度差绝对值小于左右边界的中点 class Solution:def minimumEffortPath(self, he…

AI自动生成代码工具

AI自动生成代码工具是一种利用人工智能技术来辅助或自动化软件开发过程中的编码任务的工具。这些工具使用机器学习和自然语言处理等技术&#xff0c;根据开发者的需求生成相应的源代码。以下是一些常见的AI自动生成代码工具&#xff0c;希望对大家有所帮助。北京木奇移动技术有…
最新文章