【Docker】镜像的创建、管理与发布
镜像的获取
镜像可以从以下方式获得:
- 从远程镜像仓库拉取,可以是公有仓库,也可以是私有仓库
- 从Dockerfile构建
- 从文件导入(离线)
- 从容器提交
镜像的基本操作
跟镜像相关的命令如下:
$ docker image --helpUsage: docker image COMMANDManage imagesCommands:build Build an image from a Dockerfilehistory Show the history of an imageimport Import the contents from a tarball to create a filesystem imageinspect Display detailed information on one or more imagesload Load an image from a tar archive or STDINls List imagesprune Remove unused imagespull Pull an image or a repository from a registrypush Push an image or a repository to a registryrm Remove one or more imagessave Save one or more images to a tar archive (streamed to STDOUT by default)tag Create a tag TARGET_IMAGE that refers to SOURCE_IMAGERun 'docker image COMMAND --help' for more information on a command.
docker image build
docker image build
命令用于从Docker文件构建镜像。
一个简单的构建redis镜像的dockerfile如下:
from centosmaintainer morris131<morris131@163.com>env WORK_DIR /usr/localworkdir $WORK_DIRrun yum install -y wget gcc gcc-c++ automake autoconf libtool makerun wget https://download.redis.io/releases/redis-6.2.5.tar.gzrun tar xzf redis-6.2.5.tar.gz && cd redis-6.2.5 && makeexpose 6379env REDIS_HOME $WORK_DIR/redis-6.2.5env PATH $PATH:$REDIS_HOME/srcentrypoint ["redis-server"]
使用docker image build
构建镜像:
$ docker image build -f redis.dockerfile -t redis:v6.2 .
Sending build context to Docker daemon 326.3MB
Step 1/11 : from centos---> 5d0da3dc9764
Step 2/11 : maintainer morris131<morris131@163.com>---> Using cache---> 5cda723c8e72
Step 3/11 : env WORK_DIR /usr/local---> Using cache---> c533d0edc8eb
Step 4/11 : workdir $WORK_DIR---> Using cache---> cb590797901e
Step 5/11 : run yum install -y wget gcc gcc-c++ automake autoconf libtool make---> Using cache---> 3ad6eccd91bc
Step 6/11 : run wget https://download.redis.io/releases/redis-6.2.5.tar.gz---> Using cache---> 009fdc775e47
Step 7/11 : run tar xzf redis-6.2.5.tar.gz && cd redis-6.2.5 && make---> Using cache---> 55980a8ed7d4
Step 8/11 : expose 6379---> Using cache---> a0031636b6a8
Step 9/11 : env REDIS_HOME $WORK_DIR/redis-6.2.5---> Using cache---> 9fe2c6f4f2ea
Step 10/11 : env PATH $PATH:$REDIS_HOME/src---> Using cache---> a41d5925a64f
Step 11/11 : entrypoint ["redis-server"]---> Using cache---> dfa712f480f7
Successfully built dfa712f480f7
Successfully tagged redis:v6.2
选项说明:
--file, -f
:Dockerfile的名称(默认为’PATH/Dockerfile’)--tag, -t
:名称和可选的“name:tag”格式的标签path
:指定构建镜像时的相对目录,当前目录用.
代替,例如dockerfile经常会COPY一些文件,如果这些文件指定的是相对路径,那么这个相对路径是基于path
指定的目录。
docker image history
docker image history
显示镜像的历史记录,应该是镜像的分层结构。
$ docker image history redis:v6.2
IMAGE CREATED CREATED BY SIZE COMMENT
dfa712f480f7 20 months ago /bin/sh -c #(nop) ENTRYPOINT ["redis-server… 0B
a41d5925a64f 20 months ago /bin/sh -c #(nop) ENV PATH=/usr/local/sbin:… 0B
9fe2c6f4f2ea 20 months ago /bin/sh -c #(nop) ENV REDIS_HOME=/usr/local… 0B
a0031636b6a8 20 months ago /bin/sh -c #(nop) EXPOSE 6379 0B
55980a8ed7d4 20 months ago /bin/sh -c tar xzf redis-6.2.5.tar.gz && cd … 160MB
009fdc775e47 20 months ago /bin/sh -c wget https://download.redis.io/re… 2.47MB
3ad6eccd91bc 20 months ago /bin/sh -c yum install -y wget gcc gcc-c++ a… 270MB
cb590797901e 20 months ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
c533d0edc8eb 20 months ago /bin/sh -c #(nop) ENV WORK_DIR=/usr/local 0B
5cda723c8e72 20 months ago /bin/sh -c #(nop) MAINTAINER morris131<morr… 0B
5d0da3dc9764 23 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 23 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 23 months ago /bin/sh -c #(nop) ADD file:805cb5e15fb6e0bb0… 231MB
docker image import
docker image import
将导出的压缩容器文件导入为镜像。与docker container export
配合使用。
$ docker image import nginx.tar.gz nginx:v2.0
sha256:9b1c17b86c32c5a4fa2e811612dc2242ebb1725ff73391cd38c143d22f09ad87
docker image inspect
docker image inspect
显示一个或多个镜像的详细信息。
$ docker image inspect redis:v6.2
docker image save
docker image save
将一个或多个镜像保存到tar存档(默认情况下流式传输到STDOUT)。
$ docker image save -o nginx-v1.0.tar nginx:v1.0
docker image load
docker image load
从tar存档或STDIN加载镜像。
$ docker image load -i nginx-v1.0.tar
Loaded image: nginx:v1.0
docker image ls
docker image ls
列出镜像。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx v1.0 0b36bf0f81dd 2 days ago 141MB
nginx latest f652ca386ed1 21 months ago 141MB
docker image prune
docker image prune
清理镜像。
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 0B
后文会详细介绍docker image prune
和docker image rm
的区别。
docker image rm
docker image rm
根据镜像名称或者镜像ID删除一个或多个镜像。
$ docker image rm 0b36bf0f81dd
Untagged: nginx:v1.0
Deleted: sha256:0b36bf0f81dda62c4ced29e84d0b44a7c812bb643b2c1d898df0b8897f58c964
docker image pull
docker image pull
默认从官方的远程镜像仓库Docker Hub
拉取镜像,如果不指定版本,会默认拉取最新版本,也可以指定远程镜像仓库的地址。
$ docker image pull nginx
Using default tag: latest
latest: Pulling from library/nginx
a2abf6c4d29d: Pull complete
a9edb18cadd1: Pull complete
589b7251471a: Pull complete
186b1aaa4aa6: Pull complete
b4df32aa5a72: Pull complete
a0bcbecc962e: Pull complete
Digest: sha256:0d17b565c37bcbd895e9d92315a05c1c3c9a29f762b011a10c54a66cd53c9b31
Status: Downloaded newer image for nginx:latest
docker.io/library/nginx:latest
指定版本拉取:
$ docker pull nginx:1.20.0
这里使用的是阿里云的镜像服务:https://cr.console.aliyun.com/
需要先登陆阿里云的镜像仓库:
$ docker login --username=xxxx registry.cn-hangzhou.aliyuncs.com
Password:
WARNING! Your password will be stored unencrypted in /home/morris/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded
指定镜像仓库拉取:
$ docker pull registry.cn-hangzhou.aliyuncs.com/morris131/mysql:5.7.35
docker image tag
docker image tag
为本地镜像打上标签。
$ docker tag nginx:latest registry.cn-hangzhou.aliyuncs.com/morris131/nginx:1.20.0
打上标签后,IMAGE ID
不变,这样就无法根据IMAGE ID
进行删除镜像,因为一个IMAGE ID
指向了多个镜像,可以根据REPOSITORY:TAG
进行删除。
docker image push
docker image push
将本地镜像推送到远程的镜像仓库。
$ docker push registry.cn-hangzhou.aliyuncs.com/morris131/nginx:1.20.0
镜像下载的加速
由于docker镜像访问很慢,所以使用阿里的镜像加速器。
参考:阿里官方教材
可以通过修改daemon配置文件/etc/docker/daemon.json
来使用加速器
$ mkdir -p /etc/docker$ vi /etc/docker/daemon.json
{"registry-mirrors": ["https://imjw08kj.mirror.aliyuncs.com"]
}$ systemctl daemon-reload$ systemctl restart docker
镜像的清理和删除
镜像的删除:删除某个镜像时,需要指定镜像的ID或者仓库+标签。
镜像的清理:主要用于资源的释放,不需要指定镜像的ID或者仓库+标签,可以清理中间的镜像层、缓存等系统存储空间。
未使用镜像
未使用镜像表示尚未在容器中分配或使用它。使用docker ps -a
命令列出所有已退出以及当前正在运行的容器。在这个列表中的镜像都是“使用过的镜像”,而不在这个列表的镜像就是未使用镜像。
虚悬镜像(Dangling Image)
虚悬镜像 (Dangling Image) 指的是仓库名(镜像名)和标签TAG为<none>
的镜像。
可以通过下面的命令来查看:
$ docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx <none> 7ab27dbbfbdf 2 years ago 133MB
可以使用docker image prune
来清理虚悬镜像镜像。
$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: nginx@sha256:ea4560b87ff03479670d15df426f7d02e30cb6340dcd3004cdfc048d6a1d54b4
deleted: sha256:7ab27dbbfbdf4031f0603a4b597cc43031ff883b54f9329f0309c80952dda6f5
deleted: sha256:5b2a9404d052ae4205f6139190fd4b0921ddeff17bf2aaf4ee97f79e1a8242fe
deleted: sha256:03ebf76f0cbf5fd32ca010bb589c2139ce7e44c050fe3de2d77addf4cfd25866
deleted: sha256:0191669d087dce47072254a93fe55cbedd687f27d3798e2260f846e8f8f5729a
deleted: sha256:17651c6a0ba04d31da14ac6a86d8fb3f600883f9e155558e8aad0b94aa6540a2
deleted: sha256:5a673ff4c07a1b606f2ad1fc53697c99c45b0675734ca945e3bb2bd80f43feb8
deleted: sha256:02c055ef67f5904019f43a41ea5f099996d8e7633749b6e606c400526b2c4b33Total reclaimed space: 133.1MB
批量清除镜像
docker image prune
:可以清除虚悬镜像。docker image prune -a
:可以清除虚悬镜像和未使用镜像。
关于scratch镜像
Scratch是一个空的Docker镜像。
hello.c
#include <stdio.h>
int main()
{printf("hello docker\n");
}
编译成一个二进制文件:
$ gcc --static -o hello hello.c
$ ./hello
hello docker
通过scratch来构建一个基础镜像。
hello.dockerfile
FROM scratch
ADD hello /
CMD ["/hello"]
构建后查看镜像的大小为872KB:
$ docker build -t hello -f hello.dockerfile .
Sending build context to Docker daemon 875.5kB
Step 1/3 : FROM scratch--->
Step 2/3 : ADD hello /---> a0c817454691
Step 3/3 : CMD ["/hello"]---> Running in ae204eb2c697
Removing intermediate container ae204eb2c697---> 114a8fd42e2f
Successfully built 114a8fd42e2f
Successfully tagged hello:latest$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello latest 114a8fd42e2f 17 hours ago 872kB
查看hello执行文件的大小为872KB,发现镜像的大小和hello执行文件的大小是一样的,这样可以证明Scratch是一个空的Docker镜像。
$ ll --si
total 889k
drwxrwxr-x 2 morris morris 4.1k Sep 4 16:53 ./
drwxrwxr-x 3 morris morris 4.1k Sep 4 16:53 ../
-rwxrwxr-x 1 morris morris 872k Sep 4 16:53 hello*
-rw-rw-r-- 1 morris morris 64 Sep 4 16:52 hello.c
-rw-rw-r-- 1 morris morris 40 Sep 4 16:51 hello.dockerfile
另外可以通过docker history
查看镜像只有hello执行文件这一层有size,正好是镜像的大小。
$ docker history hello
IMAGE CREATED CREATED BY SIZE COMMENT
114a8fd42e2f 17 hours ago /bin/sh -c #(nop) CMD ["/hello"] 0B
a0c817454691 17 hours ago /bin/sh -c #(nop) ADD file:198e5a2b23e222ef7… 872kB
使用hello镜像创建一个容器运行:
$ docker container run --name hello hello
hello docker
相关文章:

【Docker】镜像的创建、管理与发布
镜像的获取 镜像可以从以下方式获得: 从远程镜像仓库拉取,可以是公有仓库,也可以是私有仓库从Dockerfile构建从文件导入(离线)从容器提交 镜像的基本操作 跟镜像相关的命令如下: $ docker image --help…...

移动硬盘或U盘无法弹出的解决方法
以下内容源于网络资源的学习与整理,如有侵权请告知删除。 最近在红米本win11中总遇到“该设备正在使用中”而无法弹出硬盘的问题。 解法该问题的思路:先定位占用该设备的进程,然后结束该进程。 定位进程 既然设备被占用,那肯定…...

(leetcode1761一个图中连通三元组的最小度数,暴力+剪枝)-------------------Java实现
(leetcode1761一个图中连通三元组的最小度数,暴力剪枝)-------------------Java实现 题目表述 给你一个无向图,整数 n 表示图中节点的数目,edges 数组表示图中的边,其中 edges[i] [ui, vi] ,…...

【漏洞复现】金和OA C6任意文件读取漏洞
漏洞描述 金和OA协同办公管理系统C6软件共有20多个应用模块,160多个应用子模块,涉及的企业管理业务包括协同办公管理、人力资源管理、项目管理、客户关系管理、企业目标管理、费用管理等多个业务范围,从功能型的协同办公平台上升到管理型协同…...

2023年全国大学生数学建模B题
多波束测线问题 1.问题提出 单波束测深是利用声波在水中的传播特性来测量水体深度的技术。声波在均匀介质中作匀 速直线传播,在不同界面上产生反射,利用这一原理,从测量船换能器垂直向海底发射声波信号,并记录从声波发射到信号接…...
【LeetCode】2651.计算列车到站时间
题目 给你一个正整数 arrivalTime 表示列车正点到站的时间(单位:小时),另给你一个正整数 delayedTime 表示列车延误的小时数。 返回列车实际到站的时间。 注意,该问题中的时间采用 24 小时制。 示例 1:…...

Redis——认识Redis
简单介绍 Redis诞生于2009年,全称是Remote Dictionary Server,远程词典服务器,是一个基于内存的键值型NoSQL数据库。 特征 键值(Key-value)型,value支持多种不同数据结构,功能丰富单线程&…...

通讯录怎么导入新手机?3个推荐小妙招
最近刚换了新手机,旧手机里的联系人太多了,不想在新手机上一个个重新添加。有没有什么快速简单的方法能够将通讯录导入新手机? 大家在更换新手机之后都是怎么导入通讯录的呢?换手机最重要的就是把数据进行完整转移,那么…...

Geoserver发布shp、tiff、瓦片等格式的GIS数据
这里写目录标题 1 发布shp矢量数据1.1 添加shp作为数据源1.2 发布shp图层1.3 预览服务1.4 配置样式 2 发布Postgres数据库2.2 发布数据 3 发布 tif 栅格数据3.1 添加 tif 数据源3.2 发布tif数据3.3 预览服务3.4 配置地图样式 关于中文标注乱码的问题 1 发布shp矢量数据 发布sh…...

读书笔记-《ON JAVA 中文版》-摘要24[第二十一章 数组]
文章目录 第二十一章 数组1. 数组特性2. 一等对象3. 返回数组4. 多维数组5. 泛型数组6. Arrays的fill方法7. Arrays的setAll方法8. 数组并行9. Arrays工具类10. 数组拷贝11. 数组比较12. 流和数组13. 数组排序14. binarySearch二分查找15. 本章小结 第二十一章 数组 1. 数组特…...

go语言基本操作---五
error接口的使用 Go语言引入了一个关于错误处理的标准模式,即error接口,它是Go语言内建的接口类型 type error interface {Error() string }package mainimport ("errors""fmt" )type Student struct {name stringid int }func …...

【sgLazyTree】自定义组件:动态懒加载el-tree树节点数据,实现增删改、懒加载及局部数据刷新。
特性 可以自定义主键、配置选项支持预定义节点图标:folder文件夹|normal普通样式多个提示文本可以自定义支持动态接口增删改节点可以自定义根节点Id可以设置最多允许添加的层级深度 sgLazyTree源码 <template><div :class"$options.name" v-lo…...
Rust个人学习笔记
感悟:感觉rust好像缝合怪,既有python的影子,又有java和cpp的影子,可能这就是新型编程语言趋势吧。而且他的各种规范很严格很规范,比java还更工程,各种规范不对都有warning。 命名规范:蛇形命名…...
Java根据身份证号码提取出省市区,JSON数据格式
package com.rdes.talents.utils;import java.util.ArrayList; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern;/*** Author: 更多实用源码 www.cx1314.cn* Date: 2023/9/7 …...

MySQL知识笔记——初级基础(实施工程师和DBA工作笔记)
老生长谈,MySQL具有开源、支持多语言、性能好、安全性高的特点,广受业界欢迎。 在数据爆炸式增长的年代,掌握一种数据库能够更好的提升自己的业务能力(实施工程师)。 此系列将会记录我学习和进阶SQL路上的知识…...
javaee 事务的传播行为
事务的传播行为 事务的第一个方面是传播行为(propagation behavior)。当事务方法被另一个事务方法调用时,必须指定事务应该如何传播。例如:方法可能继续在现有事务中运行,也可能开启一个新事务,并在自己的…...

C#-SQLite-使用教程笔记
微软官网资料链接(可下载文档) 教程参考链接:SQLite 教程 - SQLite中文手册 项目中对应的system.dat文件可以用SQLiteStudio打开查看 参考文档:https://d7ehk.jb51.net/202008/books/SQLite_jb51.rar 总结介绍 1、下载SQLiteS…...

Tomcat详解 一:tomcat的部署
文章目录 1. Tomcat的基本介绍1.1 Tomcat是什么1.2 Tomcat的构成组件1.2.1 Web容器1.2.2 Servlet容器1.2.3 JSP容器(JAVA Scripts page) 1.3 核心功能1.3.1 Container 结构分析 1.4 配置文件1.5 Tomcat常用端口号1.6 启动和关闭Tomcat 2. 部署Tomcat服务…...
算法 - 二分
~~~~ 题目 - 整数二分需要考虑边界思路code开平方 - 浮点数二分codecode core 题目 - 整数二分需要考虑边界 给定一个按照升序排列的长度为 n 的整数数组,以及 q 个查询。 对于每个查询,返回一个元素 k 的起始位置和终止位置(位置从 0 开始…...

蠕虫病毒问题
蠕虫病毒处理过程 修改病毒定时时间,今天遇到的是 */30 crontab -e先修改延长时间,会提示无操作权限,执行下面的问题 chattr -l /filepath查看可疑进程,这次遇到的进程有 /tmp/***** /tmp/crontab***** ps -auxkill -9 相关进程 删除/…...
React hook之useRef
React useRef 详解 useRef 是 React 提供的一个 Hook,用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途,下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
1688商品列表API与其他数据源的对接思路
将1688商品列表API与其他数据源对接时,需结合业务场景设计数据流转链路,重点关注数据格式兼容性、接口调用频率控制及数据一致性维护。以下是具体对接思路及关键技术点: 一、核心对接场景与目标 商品数据同步 场景:将1688商品信息…...

linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
uni-app 中 Web-view 与 Vue 页面的通讯机制详解 一、Web-view 简介 Web-view 是 uni-app 提供的一个重要组件,用于在原生应用中加载 HTML 页面: 支持加载本地 HTML 文件支持加载远程 HTML 页面实现 Web 与原生的双向通讯可用于嵌入第三方网页或 H5 应…...

SiFli 52把Imagie图片,Font字体资源放在指定位置,编译成指定img.bin和font.bin的问题
分区配置 (ptab.json) img 属性介绍: img 属性指定分区存放的 image 名称,指定的 image 名称必须是当前工程生成的 binary 。 如果 binary 有多个文件,则以 proj_name:binary_name 格式指定文件名, proj_name 为工程 名&…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)
Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...
作为测试我们应该关注redis哪些方面
1、功能测试 数据结构操作:验证字符串、列表、哈希、集合和有序的基本操作是否正确 持久化:测试aof和aof持久化机制,确保数据在开启后正确恢复。 事务:检查事务的原子性和回滚机制。 发布订阅:确保消息正确传递。 2、性…...

MySQL的pymysql操作
本章是MySQL的最后一章,MySQL到此完结,下一站Hadoop!!! 这章很简单,完整代码在最后,详细讲解之前python课程里面也有,感兴趣的可以往前找一下 一、查询操作 我们需要打开pycharm …...