为什么删除docker镜像后依然占用本地空间
这个功能在测试的时候特别方便,比如用户可以放置一些程序或目前docker的默认存储引擎为overlay2,不同的存储引擎需要相应的文件系统支持,如需要磁盘分区的时候传递d-type稳健分层功能,即需要传递内核参数并开启格式化磁盘的时候指定的功能数据到本地目录中,然后在容器中使用。另外,本地目录的路径必须是路径,如果目录不存在,Docker 会自动创建。为什么删除docker镜像后依然占用本地空间
EXPOSE 指令说明开放哪些端口。docker for mac目前的版本有这个bug, 即使删除了镜像和容器系统中的qemu的镜像的空间不会释放。现在只能把要用的镜像push后把docker恢复出厂设置,清空数据再来。
docker批量删除镜像 docker删除所有镜像命令
docker批量删除镜像 docker删除所有镜像命令
docker批量删除镜像 docker删除所有镜像命令
解决办法:先删除镜像中的容器,再删除该镜像。
估计等新版出来bug就能被修复了。
docker images -a 你可能看到若干以none命名的镜像,这些镜像很可能和你正在用的镜像产生依赖,因此不能真正删除。
镜像(Image)
(2) 修改的内容只对当前的容器生效, 而在docker commit提交为镜像时候,并不会将init层提交。1.如果需要某个镜像时,可以从 Docker Hub 网站搜索镜像。
以d为例2.使用 docker search 命令搜索镜像。比如需要一个 d 镜像来用于构建 web 服务。可通过 docker search 搜索 d ,从而找到适合的镜像。
3.删除镜像
使用 ubuntu 16.04 创建一个新容器,在该容器内运行 gcc -v 可查看 gcc 是否安装,查看 gcc 的版本号。
docker commit :从容器创建一个新的镜像
语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
(指定要创建的目标镜像名)
OPTIONS说明:
首先需要一个 Dockerfile 文件,其中包含一系列告诉 Docker 如何构建镜像的指令。
该Dockerfile文件位于 ~/course/docker/Dockerfile/ubuntu_gcc,使用命令 cd 切换到该目录, 通过命令 cat 查看 Dockerfile 内容。
每一个指令都会在镜像上创建一个新的层,每一个指令的前缀都必须是大写的。
条FROM,指定使用哪个镜像源。
第二条MAINTAINER,说明当前镜像的维护人的信息。
RUN 指令用于说明在构建 docker 镜像时执行哪些命令,例如安装哪些软件。
docker build
命令用于使用 Dockerfile 创建镜像。
语法
docker build [OPTIONS] PATH | URL | -
OPTIONS说明:
可以使用 docker tag 命令,为镜像添加一个新的标签。
docker tag <镜像ID> 新镜像名:新tag。
容器有一个比较麻烦的地方,就是每次重启之后会导致容器内的文件重置为初始化状态。所以我们还需要对容器内的文件进行持久化配置持久化配置有两种方法
方法一:直接。如docker cp 容器id:/etc/promeus /zhao #将容器内部的文件到宿主机的/zhao文件夹下
方法二:docker run --name mypromeus -v /zhao/promeus:/etc/promeus -d 镜像id#其中-v是指映射逻辑卷的意思,将宿主机上的/zhao/promeus里的文件和文件夹到容器的/etc/promeus里。-d是指后台运行
03-Docker存储引擎
如果使用 Bind mounts 挂载 宿主机目录 到 容器内非空目录 ,那么 此容器中的非空目录中的文件会被隐藏 ,容器访问这个目录时能够访问到的文件均来自于宿主机目录。这也是Bind mounts模式和Volumes模式的行为上的不同。Docker 存储引擎的核心思想是“层”的概念,理解了这个层,就基本可以理解它的设计思路。当我们拉取一个 Docker 镜像的时候,可以看到如下:
[上传中...(-94439e-1638445720289-0)]一个镜像被分成许多的“层”,每“层”包含了若干的文件,而一层层堆叠起来就组成了我们的一个完整的镜像。我们镜像中的文件就是所有“层”文件的并集。 我们构建 Docker 镜像一般采用 Dockerfile 的方式,而 Dockerfile 的每行命令,其实就会生成一个“层”,即使什么文件都没有添加。
文件的创建是在读写层增加文件,那修改和删除呢?
这就要提一下 Docker 设计的 copy-on-write (CoW) 策略。
当我们试图读取一个文件时,Docker 会从上到下一层层去找这个文件,找到的个就是我们的文件。所以下面层相同的文件就被“覆盖”了。而修改就是当我们找到这个文件时,将它“”到读写层并修改,这样读写层的文件就是我们修改后的文件,并且“覆盖”了镜像中的文件了。而删除就是创建了一个特殊的 whiteout 文件,这个 whiteout 文件覆盖的文件即表示删除了。
这样的设计有什么好处吗?
个好处是减少了存储空间,由于镜像被分成了多个层,而各个层是静态只读的,是可以共享的。当你从一个镜像构建另一个镜像时,只需要添加新的层,原有的层不会被。
我们可以用 docker history 命令查看我们创建的镜像,相同的层将共享且只保存一份。
我们可以在系统的 /var/lib/docker/<存储驱动>/ 下看到我们所有的层。
第二个好处是启动容器就变得非常轻量和快速。因为我们的容器只是添加了一个“空”的读写层,其他的都是复用的只读层,需要用时才会去搜索。
Docker 的存储引擎针对不同的文件系统,是由不同的存储驱动。
Docker 主要有一下几类存储驱动:
有条件的情况下,我们还是建议选择 overlay2 的存储驱动。
Linux 系统正常运行, 通常需要两个文件系统:
OverlayFS 是从 aufs 之上改进和简化而来的,比 aufs 和 devmapper 有更好的性能,大部分情况下也比 btrfs 好。
LowerDir、Upperdir、MergedDir 关系图:
特性:
获取镜像存储路径
Lower层
LowerDir 层的存储是不允许创建文件, 此时的LowerDir实际上是其他的镜像的UpperDir层,也就是说在构建镜像的时候, 如果发现构建的内容相同, 那么不会重复的构建目录,而是使用其他镜像的Upper 层来作为本镜像的Lower
Merged层
属于对外展示层,只能在运行中的容器查看,镜像是查看不了的
1)查看init层地址指向
容器在启动的过程中, Lower 会自动挂载init的一些文件
2) init层主要内容是什么?
init层是以一个uuid+-init结尾表示,放在只读层(Lowerdir)和读写层(Upperdir)之间,
作用只是存放/etc/hosts、/etc/resolv.conf 等文件。
(1) 容器在启动以后, 默认情况下lower层是不能够修改内容的, 但是用户有需求需要修改主机名与域名地址, 那么就需要添加init层中的文件(hostname, resolv.conf), 用于解决此类问题.
(3) init 文件存放的目录为/var/lib/docker/overlay2/
hostname与resolv.conf 全部为空文件, 在系统启动以后由系统写入。
配置 Docker 存储驱动非常简单,只需要修改配置文件即可。
方法1
方法2
Docker(5)——数据管理
当使用 bind mounts 将主机上的目录挂载到容器中时,目录由其在主机上的完整或相对路径引用。docker 容器的文件系统在宿主机上存在的方式很复杂,这会带来下面几个问题:
为了能够 保存(持久化) 数据以及 共享 容器间的数据,docker 引入了数据卷(volume) 机制。数据卷是存在于一个或多个容器中的特定文件或文件夹,它可以绕过默认的联合文件系统,以正常的文件或者目录的形式存在于宿主机上。
其生存周期于容器的生存周期。
容器中主要有 两种 管理数据方式: 数据卷(Data Volumes) , 数据卷容器(Data Volume Containers) 。
数据卷是一个可供容器使用的特殊目录,它绕过文件系统,可以提供很多有用的特性:
数据卷的使用类似 linux 下对目录或文件进行 mount 作,目前Docker提供了 三种 不同的方式将数据从宿主机挂载到容器中,分别是
其中 volume 、 bind mount 比较常用, tmpfs mount 基本不会用.
volumes作为Docker管理宿主机文件系统的一部分 ,默认位于 /var/lib/docker/volumes 目录中,不是宿主机已有数据,而是新建的。
docker 专门提供了 volume 子命令来作数据卷:
先创建一个名称为 hello 的数据卷并通过 ls 命令进行查看:
该数据卷使用的 Driver 为默认的 local ,表示数据卷使用宿主机的本地存储;
Mountpoint 是 volumes 的挂载点,默认是本机 /var/lib/docker/volumes 下的一个目录。
所有Containe挂载存储在宿主机系统的内存中,而不会写入宿主机的文件系统;r的数据都保存在了这个目录下边,由于没有在创建时指定卷,所以Docker帮我们默认创建许多匿名卷。
使用 -v 选项也可以指定挂载一个本地的已有目录到容器中去作为数据卷:
docker run -it –-name robot1 -v /var/data:/opt/mydata ros/kinetic /bin/bash
上面的命令挂载主机的 /var/data 目录到容器的 /opt/mydata 目录。
Docker 挂载数据卷的默认权限是可读写 rw ,用户也可以通过 ro 标记指定为只读:
docker run -it –-name robot1 -v /var/data:/opt/mydata:ro ros/kinetic /bin/bash
加了 :ro 之后,容器内挂载的数据卷内的数据就变成只读的了。
除了把数据卷中的数据存储在宿主机,docker 还允许我们通过指定 volume driver 的方式把数据卷中的数据存储在其它的地方,比如 Azrue Storge 或 AWS 。
通过 vieux/sshfs 驱动把数据卷的存储在云主机上,docker 默认是不安装 vieux/sshfs 插件的,我们可以通过下面的命令进行安装:
docker plugin install --grant-all-permissions vieux/sshfs
然后通过 vieux/sshfs 驱动创建数据卷,并指定远程主机的登录用户名、密码和数据存放目录:
注意:确保指定的远程主机上的挂载点 /home/nick/sshvolume 目录是存在的,否则在启动容器时会报错。
在启动容器时指定挂载这个数据卷:
在容器中 /world 目录下作的文件都存储在远程主机的 /home/nick/sshvolume 目录中。进入容器 testcon 然后在 /world 目录中创建一个文件,然后打开远程主机的 /home/nick/sshvolume 目录进行查看,新建的文件会出现在那里。
bind mount 和 volume 其实都是利用宿主机的文件系统,不同之处在于volume是docker自身管理的目录中的子目录,所以不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的上指定不同的路径,不需要关心路径
bind mounts 可以挂载在宿主机系统的任意位置 ,但 bind mount 在不同的宿主机系统是不可移植的,比如Windows和Linux的目录结构是不一样的, bind mount 所指向的 host 目录也不能一样。这也是为什么 bind mount 不能出现在Dockerfile中的原因,因为这样Dockerfile就不可移植了。
这张图说明 bind mount 和 volume 其实都是利用宿主机的文件系统, Bind mounts 模式是将宿主机上的任意文件或文件夹挂载到容器,而 Volumes 本质上是将Docker的一块区域(默认是 /var/lib/docker/volumes 下的文件夹)挂载到容器。所以 volume 不存在权限引发的挂载的问题,并且目录路径是docker自身管理的,所以也不需要在不同的上指定不同的路径,不需要关心路径。
相对于 bind mount , volume 是Docker Engine在自己的“地盘”分配了一个路径作为挂载点,自己地盘的权限肯定是安排的明明白白。所以,以上挂载宿主机路径的问题都解决了。
在使用 volume 作为数据卷挂载到容器时,直接用 volume 名称代替宿主机路径名就行:
docker run -d -v test_vol:/var/data some_image
这样就将数据卷 test_vol 挂载到了容器内的 /var/data 目录下。
命名的容器挂载数据卷,其它容器通过挂载这个(父容器)实现数据共享,挂载数据卷的容器,称之为数据卷容器
可以利用数据卷容器对其中的数据卷进行备份、恢复,以实现数据的迁移。
备份
使用下面的命令来备份 mydata 数据卷容器内的数据卷:
sudo docker run --volumes-from mydata -v $(pwd):/backup –-name worker ubuntu tar cvf /backup/backup.tar /data
这个命令首先利用 Ubuntu 镜像创建了一个容器 worker。又使用 --volumes-from mydata 参数来让 worker 容器挂载 mydata 容器的数据卷。接下来使用 -v $(pwd):/backup 参数来挂载本地的当前目录到 worker 容器的 /backup 目录。
在 worker 容器启动后,使用了 tar cvf /backup/backup.tar /data 命令来将 /data 下内容备份为容器内的 /backup/backup.tar,即宿主主机的当前目录下的backup.tar。
恢复
如果要恢复数据到一个容器,可以按照下面的作。首先创建一个带有数据卷的容器 mydata2:
sudo docker run -v /data –-name mydata2 ubuntu /bin/bash
然后创建另一个新的容器,挂载 mydata2 的数据卷,并使用 tar 解压缩备份文件到所挂载的容器卷中:
sudo docker run --volumes-from mydata2 -v $(pwd):/backup busybox tar xvf /backup/backup.tar
如果用户需要在容器之间共享一些持续更新的数据,最简单的方式是使用数据卷容器。数据卷容器其实就是一个普通的容器,专门用它提供数据卷供其他容器挂载。下面简单介绍其使用方法。
首先要创建一个数据卷容器 mydata,并在其中创建一个数据卷挂载到 /data 目录。
sudo docker run -it -v /data –-name mydata ubuntu
然后在其他容器中使用 --volumes-from 来挂载 mydata 容器中的数据卷。例如创建两个容器 mycon1 和 mycon2,并从 mydata 容器挂载数据卷:
sudo docker run -it --volumes-from mydata –-name mycon1 ubuntu
sudo docker run -it --volumes-from mydata –-name mycon2 ubuntu
(注意,命令中没有指定数据卷的信息,也就是说新容器中挂载数据卷的目录和源容器中是一样的。)
此时容器 mycon1 和 mycon2 都挂载同一个数据卷到相同的目录 /data。三个容器任何一个在该目录下写入数据其他容器都能看到。
可以多次使用 --volumes-from 参数来从多个容器挂载多个数据卷。还可以从其他已经挂载了容器的容器来挂载数据卷。并且使用 --volumes-from 参数所挂载数据卷的容器自身并不需要保持在运行状态。
但删除挂载了数据卷的容器时,数据卷并不会被自动删除。如果要删除一个数据卷,必须在删除一个还挂载着它的容器时显式的使用 docker rm -v 命令来指定同时删除关联的容器。
手动修改mount挂载的json文件,狂神的那个视频里面也有写。
深刻理解Docker镜像大小
理解docker的分层镜像实现 base 镜像共享(DockerFile)
Docker Error response from daemon: conflict: unable to delete
3) 为什么需要init层?具体错误:Errdocker tag 命令的语法为:or response from daemon: conflict: unable to delete 7a73e2537f50(must be forced) - image is being used by stopped container 755d88060cde
错误解析:这是由于要删除的目标镜像中有容器存在,故无法删除镜像
ubuntu镜像创建镜像空间如何删除照片
4) 查看init层文件用ID、镜像名、摘要删除镜像。其中,可以是镜像短ID、镜像长ID、镜像名或者镜像摘要。我们可以用镜像的完整ID,也称为长ID,来删除镜像。使用脚本的时候可能会用长ID,但是人工输入就太累了,所以更多的时候是用短ID来删除镜像。dockerimagels默认列出的就已经是短ID了,一般取前3个字符以上,只要足够区分于别的镜像就可以了。
docker cp /宿主机目录 容器id:/容器文件目录#将宿主机目录内容到容器内部目录清除k8s中node无用的镜像
2.查找镜像1、使用kubectl get po –namespace 命名空间,查看该命名空间已有的pod
2、重新部署pod,在该node上产生多余的images1.列出镜像列表镜像
3、使用docker df命令,在执行清除镜像之前先查看镜像和容器的数量。
注:类似于Linux上的df命令,用于查看Docker的磁盘使用情况。这条命令可以查看到node中镜像和容器的数量
4、使用docker prune –a。清除无用的镜像
注:docker prune命令可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及ling镜像(即无tag的镜像)。docker prune -a命令清理得更加,可以将没有容器使用Docker镜像都删掉。注意,这两个命令会把你暂时关闭的容器,以及暂时没有用到的Docker镜像都删掉了…所以使用之前一定要想清楚呐。
5、使用docker df令,查看镜像和容器的数量;是否成功
威联通删除docker显示应用程序没发现
OverlayFS 结构分为三个层: LowerDir 、 Upperdir 、 MergedDir是因为威联通的缓存没然后可以使用 inspect 命令看看数据卷hello的详细信息有及时更新。
1、清除Docker缓存:在SSH连接终端中执行dockerprune-a命令,会清除所有未使用的Docker镜像、容器和数据卷等,以确保Docker的缓存被正确清理。
2、重启Docker服务:在SSH连接终端中执行ctlrestartdocker命令,会重新启动Docker服务,使其更新缓存并加载的应用程序信息。
3、强制重新安装应用程序:在网页界面或者命令行作中找到并选择对应的应用程序,点击“重新安装”按钮或者执行dockerrun命令,可以强制重新安装该应用程序并刷新威联通的缓存信息。