06 - 镜像管理

news2024/11/25 2:45:37

1 了解镜像

Docker镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等)。

但注意, 镜像不包含任何动态数据( /proc、/sys,其中,/proc里面装的主要是内核参数,在内核运行状态不同时里面的值是不一样的,而/sys目录则包含了系统资源的管理信息,这两个目录中的数据都是动态生成的) ,因此,其内容在构建好之后一般是不会变的。这里,第一,你要知道什么是动态数据,第二,将来我们要自己装一个linux操作系统,你想把这个linux做成一个容器镜像,其实很简单,就是把linux里面所有的文件目录打包一份就行了,但是打包的时候会把/proc和/sys这两个目录排除。(因此, 容器镜像不包含内核,容器共用宿主机的内核


2 镜像的制作


2.1 通过对系统打包的方式制作镜像


1)最小化安装一个操作系统

2)将此系统文件打包,把装的一个系统做成一个容器镜像,也就是把根文件系统打个包就行了(除了/proc和/sys之外)

[root@node02 ~]# tar -cvf --numeric-owner --exclude=/proc --exclude=/sys /data/centos7u2.tar /

3)将打包文件拷贝到运行容器的主机上

[root@node02 ~]# scp  centos7u2.tar  192.168.1.72:/root

4)利用打包文件生成镜像

[root@node02 ~]# docker  import  centos7u2.tar  docker.io/centos7u2:latest
[root@node02 ~]# docker images
REPOSITORY                       TAG                 IMAGE ID            CREATED             SIZE
docker.io/centos7u2              latest              1e1148e4cc2c        30 seconds ago      987 MB

5)使用自己生成的镜像创建容器做测试

[root@node02 ~]# docker run -itd --name c1 docker.io/centos7u2 /bin/bash

2.2 基于Dockerfile文件制作镜像


1)编写dockerfile文件

[root@node02 ~]# cat /root/test01 
	FROM local-test/centos7.2:v1				
	RUN yum install -y httpd &&  yum install -y vsftpd 

	解释:
		FROM:用于指定一个基础镜像
		RUN:执行任务,建议同一个任务的多条指令使用&&连接多个命令完成 

2)构建镜像

[root@node02 ~]# docker build -t centos7.2-httpd:v2 -f test01 /root

	参数说明:	
	    -t:用于指定镜像名称、标记
	    -f:指定dockerfile名称 

3)查看镜像

[root@node02 ~]# docker images 
REPOSITORY             TAG                 IMAGE ID            CREATED             SIZE
centos7.2-httpd        v2                  2cdfd7a685f6        2 minutes ago       1.08 GB

3 Dockerfile指令说明


3.1 FROM

FROM < image >

用于指定基础镜像


3.2 MAINTAINER

MAINTAINER < name >

用于指定镜像的作者信息,当执行docker inspect指令时会有输出 。


3.3 RUN

RUN < command >
或者
RUN [“command”,“arg1”,“arg2”]

用于执行基础镜像支持的任何指令;



例如:
RUN yum install -y net-tools
RUN [“yum”,“install”,“-y”,“net-tools”]


3.4 CMD && ENTRYPOINT


3.4.1 CMD

CMD < command > < arg1 > < arg2 >
或者
CMD [“command”,“arg1”,“arg2”]


用于指定容器启动时执行的操作;


注意:一个dockerfile中只能有一条 CMD 指令,如果有多条则仅执行最后一条;

# 使用CMD指令
FROM ubuntu
CMD ["echo", "Hello World"]

3.4.2 ENTRYPOINT

ENTRYPOINT 和 CMD 指令的用法很相似:

ENTRYPOINT < command > < arg1 > < arg2 >
或者
ENTRYPOINT [“command”,“arg1”,“arg2”]


用于指定容器启动时执行的操作;

注意:一个dockerfile中只能有一条 ENTRYPOINT指令,如果有多条则仅执行最后一条;

# 使用ENTRYPOINT指令
FROM ubuntu
ENTRYPOINT ["echo", "Hello World"]

另外,ENTRYPOINT指令还可以与CMD指令配合使用,此时,CMD指令后跟的不再是完整的可执行命令,而仅是作为ENTRYPOINT指令后的参数使用,如下所示:

# ENTRYPOINT 和 CMD 指令配合使用
FROM ubuntu
ENTRYPOINT ["cat"]
CMD ["-n","/etc/passwd"]

3.4.3 CMD 和 ENTRYPOINT 的区别

区别:
如果在运行docker run命令时指定了参数,那么,将会覆盖CMD中指定的参数,而ENTRYPOINT指令不会被覆盖,而是被附加到docker run命令的参数之前。


总结来说:CMD用于定义默认的容器启动命令,可以被覆盖,而ENTRYPOINT用于定义容器启动的主要命令,不会被覆盖。


案例:
使用 Dockerfile 构建 centos 镜像,在 Dockerfile 中使用 CMD 和 ENTRYPOINT 。当 docker run + 参数 的时候进行 CMD 和 ENTRYPOINT 的测试,CMD指定的参数是否会被覆盖,以及 ENTRYPOINT 指定的参数是否会附加到docker run命令的参数之前。



【测试CMD】

1)编写dockerfile文件

$ vim dockerfile-centos-test
FROM centos
CMD [“ls”,“-a”]


2)构建镜像

$ docker build -f dockerfile-centos-test -t cmd-test:0.1 .


3)运行镜像

$ docker run cmd-test:0.1
在这里插入图片描述
可以看到,列出了所有目录。


4)这个时候我们在docker run 的时候追加一个命令参数 -l

$ docker run cmd-test:0.1 -l
在这里插入图片描述
可以看到,出现了错误,在CMD的情况下,加 -l 替换了dockerfile中的 CMD [“ls”,“-l”],但是由于 -l 不是命令,所以就报错了。


5)我们将 docker run 的命令参数 -l 改为 ls

$ docker run cmd-test:0.1 ls
在这里插入图片描述
可以看到,这个时候就执行成功了。



【测试 ENTRYPOINT】

1)编写dockerfile文件

$ vim dockerfile-centos-test
FROM centos
ENTRYPOINT [“ls”,“-a”]


2)构建镜像

$ docker build -f dockerfile-centos-test -t cmd-test:0.1 .


3)运行镜像

$ docker run cmd-test:0.1
在这里插入图片描述

4)这个时候追加一个命令 -l (使之成为 ls -al )

$ docker run cmd-test:0.1 -l
在这里插入图片描述



总结一下:CMD的情况下,docker run的参数 -l 替换了CMD的 ls -a。而ENTRYPOINT的情况下,-l 参数追加到了 ls -a 的后面,使之变成了ls -al。


3.5 ARG

ARG < key >=< value >

Docker 1.9 版本 后新加入的指令,ARG定义的变量只有在构建image时有效,建立完成后变量消失;


3.6 USER

USER < name >

用于设置启动容器的用户,默认为root


3.7 EXPOSE

EXPOSE < port1 > < port2 > …

用于设置容器启动时,要映射到物理机的端口;容器启动后,会将该端口映射到物理机上的随机端口;


3.8 ENV

ENV < key > < value >

用于为容器设置环境变量,可以使用docker inspect查看;也可以通过docker run --env < key >=< value >设置或修改环境变量;(该变量设置后,后续的RUN指令都可以使用该变量)


3.9 ADD && COPY


3.9.1 ADD

ADD < src > < dest >

用于将src指定的文件复制到容器的目录


例如:
ADD /tmp/nginx-1.13.4.tar.gz /tmp/



1)所有拷贝到容器中的文件及目录权限为0755,uid及gid均为0;
2)src如果是一个目录,那会将该目录下所有文件拷贝到容器中,不包括目录;
3)如果src是文件且dest不以/结束,dest会被识别为文件,src中的内容会把dest文件内容覆盖;
4)如果src是文件且dest以/结束,则会将src文件拷贝到dest目录;;


如果源文件是一个tar压缩包的话,压缩格式为gzip,bzip2以及xz的情况下,ADD指令将会自动解压缩这个压缩文件到目标路径中,在某些情况下这个自动解压缩的功能非常有用。


3.9.2 COPY

COPY < src > < dest >


用于复制本地主机的src文件(为Dockerfile所在目录的相对路径、文件或者目录)到容器的dest(dest路径不存在时,会自动创建)。



此外,还需要注意一点,使用 COPY 指令,源文件的各种元数据都会保留,比如读、写、执行权限、文件变更时间等。(这个特性对于镜像定制很有用,特别是构建相关文件都在使用 Git 进行管理的时候)


3.9.3 ADD 和 COPY 的区别

共同点:
都可以将主机上的资源加入到Dockerfile制作的镜像中。


不同点:
在这里插入图片描述



官方建议:
1)尽可能的使用 COPY,因为 COPY 的语义很明确,就是复制文件而已;
2)需要自动解压缩的场合,再使用ADD;

另外,需要注意的是,ADD 指令会令镜像构建缓存失效,从而可能会令镜像构建变得比较缓慢。因此在 COPY 和 ADD 指令中选择的时候,可以遵循这样的原则:所有的文件复制均使用 COPY 指令,仅在需要自动解压缩的场合使用 ADD。


3.10 WORKDIR

WORKDIR < path >


用于切换目录,类似于cd命令;(对RUN, CMD, ENTRYPOINT指令生效)


3.11 VOLUME

VOLUME [“mount_point”]


用于创建一个本机或者为其他容器使用的挂载点,用于数据的持久化保存 。


例如:
FROM base VOLUME ["/tmp/data"]



通过dockerfile的 VOLUME 指令可以在镜像中创建挂载点,这样只要通过该镜像创建的容器都有了挂载点,但值得注意的是通过VOLUME 指令创建的挂载点,无法指定主机上对应的目录,而是自动生成的(可以通过docker inspect查看)。


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

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

相关文章

sql多表运用 12.3

肖SIR__数据库之多表运用__12.3 数据库之多表运用 CREATE table dept(dept1 VARCHAR(6),dept_name VARCHAR(20)) default charsetutf8; INSERT into dept VALUES (101,财务); INSERT into dept VALUES (102,销售); INSERT into dept VALUES (103,IT技术); INSERT into dep…

【已解决】conda环境下ROS2 colcon build编译选择特定python解释器

目录 1 问题背景2 问题探索3 问题解决4 告别Bug 1 问题背景 环境&#xff1a; ROS2 HumbleUbuntu22.04 现象&#xff1a;运行colcon build后由cpp编译生成的python导出库(如自定义消息、服务等)&#xff0c;其版本与由python setup.py安装的python库版本不一致&#xff0c;导致…

App自动化测试笔记(四):UIAutomatorViewer与元素定位API

UIAutomatorViewer 1、应用场景 定位元素的时候必须根据元素的相关特征来进行定位&#xff0c;而 UIAutomatorViewer 就是用来获取元素特征的。 如何使用UIAutomatorViewer 1、保证想要查看的元素在当前的频幕上 2、打开UIAutomatorViewer工具 3、点击左上角左数第二个按钮…

IDEA切换JDK版本超详细步骤

&#x1f600; IDEA切换JDK版本详细教程&#xff0c;全网步骤最详细&#xff0c;实测可用。 文章目录 第一步、选择SDKs切换SDK版本&#xff1a;第二步、选择Modules切换Sources和Dependencies版本&#xff1a;第三步、选择Project切换SDK和Language Level版本&#xff1a;第四…

VR科学知识互动展示介绍|游戏体验馆加盟|VR展示厅

VR科学知识互动展示是一种利用虚拟现实技术来呈现科学知识并与观众进行互动的展示方式。通过VR设备&#xff0c;参观者可以沉浸在各种科学主题的虚拟环境中&#xff0c;以全新的视角和体验来探索科学领域的知识。 这样的展示通常结合了视觉、听觉和触觉等感官体验&#xff0c;使…

网络信息安全:11个常见漏洞类型汇总

一、SQL注入漏洞 SQL注入攻击&#xff08;SQL Injection&#xff09;&#xff0c;简称注入攻击、SQL注入&#xff0c;被广泛用于非法获取网站控制权&#xff0c;是发生在应用程序的数据库层上的安全漏洞。 在设计程序&#xff0c;忽略了对输入字符串中夹带的SQL指令的检查&…

恒峰便携式森林消防灭火泵:轻巧易携,灭火无忧

在自然环境中&#xff0c;森林火灾是一种常见的自然灾害。为了保护森林资源和人民生命财产安全&#xff0c;我们需要一款轻便、高效的消防灭火设备。本田发动机单缸四冲手拉式启动的便携式森林消防灭火泵应运而生&#xff0c;它以其出色的性能和便捷的使用方式&#xff0c;成为…

工作中常用的6种设计模式

背景 谈起设计模式&#xff0c;你一定会问&#xff1f;这玩意到底有啥用&#xff1f;我好像没用过也不影响做一个码农。也可能项目中实际用了&#xff0c;但是你不自知。虽然Java设计模式有23种&#xff0c;但是工作中常用的可能并没有那麽多。就像新华字典有多少字&#xff0c…

SpringBoot使用MongoTemplate详解

1.pom.xml引入Jar包 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency> 2.MongoDbHelper封装 /*** MongoDB Operation class* author HyoJung* date …

群晖 NAS 安装 Ghost Blog

通过群晖的 docker 容器下载 ghost 映像&#xff0c;并配置后启动。 一、下载映像文件 由于网络环境&#xff0c;无法直接连接 docker 的映像服务器&#xff0c;因此使用境内代理&#xff0c;通过 url 方式下载。 打开 docker 控制台&#xff0c;点击左边导航栏的 “映像”&…

2024大厂Android面试真题集锦,算法真题解析:美团+Tencent+字节跳动+阿里+360+拼多多

前言 IT行业薪水高&#xff0c;这是众所周知的&#xff0c;所以很多人大学都选择IT相关专业&#xff0c;即使非该专业的人&#xff0c;毕业了也想去一个培训机构镀镀金&#xff0c;进入这一行业。 但是有关这个行业35岁就退休的说法&#xff0c;也一直盛传。 加上这几年不断…

苹果曝出两个 iOS 系统 0-Day 漏洞

最近&#xff0c;苹果公司发布了紧急安全更新&#xff0c;解决了两个 iOS 零日漏洞。这些漏洞存在于 iOS 内核&#xff08;CVE-2024-23225&#xff09;和 RTKit&#xff08;CVE-2024-23296&#xff09;中&#xff0c;威胁攻击者可利用其绕过内核内存保护&#xff0c;这就给了具…

MySQL 表锁问题

MySQL 表锁解决 查看哪些表被锁&#xff0c;字段 In_use 表示有多少线程在使用这张表&#xff0c;字段 name_locked 表示表格是否被锁&#xff0c;0 代表锁定状态 mysql> show OPEN TABLES where In_use > 0; -------------------------------------------------------…

音视频学习笔记——ffmpeg解码流程

✊✊&#x1f308;大家好&#xff01;本篇文章主要记录自己在进行音视频学习中&#xff0c;整理的部分ffmpeg解码相关的内容重点&#x1f607;。 首先重新梳理了ffmpeg解码流程&#xff0c;重点学习avcodec_send_packet()、avcodec_receive_frame()在解码中的应用&#xff0c;以…

【QT】重载的信号槽/槽函数做lambda表达式

重载的信号槽 函数指针&#xff1a; int fun(int a,long b) int (*funp)(int, long) fun; 实现回调函数就需要函数指针 信号重载 派生类槽函数发送两个信号 派生类给父类发两个信号 void (SubWidget::*mysigsub)() &SubWidget::sigSub;connect(&subw,mysigsub,t…

网络编程:select、poll

.1、select完成TCP并发服务器 程序代码&#xff1a; #include <myhead.h> #define SER_IP "192.168.125.234" //服务端IP #define SER_PORT 8888 //服务端端口号int main(int argc, const char *argv[]) {//1.创建用于连接的套接字int sfds…

1-安装rabbitmq

rabbitmq官网&#xff1a; https://www.rabbitmq.com/docs/download 本机环境&#xff1a;mac&#xff0c;使用orbstack提供的docker 使用docker部署rabbitmq docker run -it --rm --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3.13-management 然后报错&#xf…

bun 单元测试

bun test Bun 附带了一个快速、内置、兼容 Jest 的测试运行程序。测试使用 Bun 运行时执行&#xff0c;并支持以下功能。 TypeScript 和 JSX生命周期 hooks快照测试UI 和 DOM 测试使用 --watch 的监视模式使用 --preload 预加载脚本 Bun 旨在与 Jest 兼容&#xff0c;但并非所…

SD-WAN: 灵活部署,助力云服务

随着Office 365、Salesforce、Webex和SAP等云托管应用程序的迅速发展&#xff0c;企业正加速将业务关键应用程序迁移到云端。这种转变需要为遍布各地的员工提供安全可靠的云服务网络连接。本文将介绍SD-WAN如何助力企业的云服务访问。 传统的网络架构&#xff0c;特别是基于MPL…

【AI视野·今日Robot 机器人论文速览 第八十二期】Tue, 5 Mar 2024

AI视野今日CS.Robotics 机器人学论文速览 Tue, 5 Mar 2024 Totally 63 papers &#x1f449;上期速览✈更多精彩请移步主页 Interesting: &#x1f4da;双臂机器人拧瓶盖, (from 伯克利) website: https://toruowo.github.io/bimanual-twist &#x1f4da;水下抓取器, (from …