Docker实战-关于Docker镜像的相关操作(二)

导语

之前的分享中,我们介绍了关于Docker镜像的查询操作相关的内容,下面我们继续来介绍删除清理、导入导出、创建镜像等操作。

如何删除和清理镜像?

使用标签删除镜像

可以使用docker rmi 或者是 docker image rm 命令来删除镜像,它也包含了几个基本选项

  • -f ,-force:强制删除镜像,即使它存在依赖性也进行删除
  • -no-prune:不要清理未带标签的父镜像
bash 复制代码
docker rmi  IMAGE [IMAGE......]
bash 复制代码
[root@localhost ~]# docker rmi myubuntu:new
Untagged: myubuntu:new
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
ubuntu       18.04     f9a80a55f492   8 weeks ago   63.2MB
[root@localhost ~]# 

这里我们删除了一个myubuntu:new标签的镜像,并且这个删除操作对其他标签的相同镜像不会产生影响。但是如果在镜像中只存在了一个标签的时候,如果再使用删除命令,则会彻底删除镜像。

使用镜像ID来删除镜像

还是使用docker rmi命令 并且后面更上ID来删除镜像。需要注意的是,如果当镜像创建的容器存在的时候,镜像文件是无法被删除的。当然如果使用-f 参数进行强制删除的话也可以。但通常情况下不推荐使用-f参数来强制删除一个已经存在容器依赖的镜像。正确的做法应该是先删除依赖该镜像的所有容器,然后再去删除镜像。

bash 复制代码
[root@localhost ~]# docker rmi f9a80a55f492
Error response from daemon: conflict: unable to delete f9a80a55f492 (must be forced) - image is being used by stopped container a9a05f9ef099
[root@localhost ~]# 
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE          COMMAND   CREATED        STATUS                    PORTS     NAMES
a9a05f9ef099   ubuntu:18.04   "bash"    18 hours ago   Exited (0) 18 hours ago             hungry_cannon
[root@localhost ~]# docker rm a9a05f9ef099
a9a05f9ef099
[root@localhost ~]# docker rmi f9a80a55f492
Untagged: ubuntu:18.04
Untagged: ubuntu@sha256:152dc042452c496007f07ca9127571cb9c29697f42acbfad72324b2bb2e43c98
Deleted: sha256:f9a80a55f492e823bf5d51f1bd5f87ea3eed1cb31788686aa99a2fb61a27af6a
Deleted: sha256:548a79621a426b4eb077c926eabac5a8620c454fb230640253e1b44dc7dd7562
[root@localhost ~]# 

清理镜像

在我们使用Docker一段时间之后,系统中可能会存在一些临时性的镜像文件,以及有些从来都没有使用过的镜像,这个时候,我们就可以使用docker image prune 命令来进行清理。

  • -a , -all:删除鄋的无用镜像
  • -filter filter:只清理符合过滤器的镜像
  • -f ,-force:强制删除镜像
bash 复制代码
[root@localhost ~]# docker image prune -f
Total reclaimed space: 0B
[root@localhost ~]# 

如何创建镜像

创建镜像的方式有三种

  • 基于已有镜像的容器进行创建
  • 基于本地模板导入的方式
  • 基于Dockerfile文件创建

基于已有容器创建

bash 复制代码
docker [container] commit 命令
bash 复制代码
docker [container] commit [OPTIONS] CONTAINER [REPOSITORY] [:TAG] 

首先我们来创建一个镜像容器,并且在容器中创建一个标识文件。容器ID为5cb48f5d7103。

bash 复制代码
[root@localhost ~]# docker run -it ubuntu:18.04 /bin/bash
root@5cb48f5d7103:/# touch test
root@5cb48f5d7103:/# ls  
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
root@5cb48f5d7103:/# exit
exit
[root@localhost ~]# 

经过这一系列的操作,我们知道容器中镜像已经发生了变化,所以我们可以使用上面的命令来创建一个新的镜像。

bash 复制代码
[root@localhost ~]# docker  commit -m "add a new test file in root" -a "Docker New" 5cb48f5d7103 test:0.1
sha256:05268b440fd9d2cf31f5ee380969e0e196c670c6513cb0cedd2fc1419f9db7a7
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         0.1       05268b440fd9   16 seconds ago   63.2MB
ubuntu       18.04     f9a80a55f492   8 weeks ago      63.2MB
[root@localhost ~]# 

创建完成之后运行该镜像查看是否有test文件

bash 复制代码
[root@localhost ~]# docker run -it test:0.1 /bin/bash
root@cf40152b3907:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  test  tmp  usr  var
root@cf40152b3907:/# exit
exit
[root@localhost ~]# 

基于本地模板导入

可以直接操作一个系统模板文件来导入镜像,使用 docker [container] import 命令来是完成。

bash 复制代码
docker [image] import [OPTIONS] file|URL -[REPOSITORY] [:TAG]

要想直接导入一个模板,我们可以使用OpenVZ来提供模板,或者使用导出的镜像来作为模板。

基于Dockerfile文件创建

基于Dockerfile文件是我们最为常见的一种创建镜像的方式。下面我们就来演示具体的操作过程。

首先需要创建一个Dockerfile的文件。

bash 复制代码
FROM centos
RUN yum -y install wget \
    && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz" \
    && tar -xvf redis.tar.gz

然后执行如下的操作

bash 复制代码
[root@localhost ~]# docker build -t nginx:0.1 .
Sending build context to Docker daemon    274MB
Step 1/2 : FROM centos
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
 ---> 5d0da3dc9764
Step 2/2 : RUN yum -y install wget     && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"     && tar -xvf redis.tar.gz
 ---> Running in 3198306bde68
CentOS Linux 8 - AppStream                       54  B/s |  38  B     00:00    
Error: Failed to download metadata for repo 'appstream': Cannot prepare internal mirrorlist: No URLs in mirrorlist
The command '/bin/sh -c yum -y install wget     && wget -O redis.tar.gz "http://download.redis.io/releases/redis-5.0.3.tar.gz"     && tar -xvf redis.tar.gz' returned a non-zero code: 1
[root@localhost ~]# 

完成之后会看到在镜像中出现了该镜像

bash 复制代码
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
test         0.1       05268b440fd9   17 minutes ago   63.2MB
ubuntu       18.04     f9a80a55f492   8 weeks ago      63.2MB
centos       latest    5d0da3dc9764   22 months ago    231MB
[root@localhost ~]# 

总结

上面我们介绍了关于镜像的删除和清理,并且介绍了如何去创建一个镜像,在后续的分享中还会介绍到使用Dockerfile文件创建镜像的方式,希望大家多多关注。

相关推荐
工业甲酰苯胺20 分钟前
k8s 中的 Ingress 简介
云原生·容器·kubernetes
如意机反光镜裸41 分钟前
CentOS7搭建Hadoop3集群教程
运维
周湘zx1 小时前
k8s中的存储
linux·运维·云原生·容器·kubernetes
[听得时光枕水眠]1 小时前
【Docker】Docker上安装MySql8和Redis
运维·docker·容器
AI原吾2 小时前
解锁自动化新境界:KeymouseGo,让键盘和鼠标动起来!
运维·python·自动化·计算机外设·keymousego
_平凡之路_2 小时前
解决ubuntu22.04 gnome-terminal 无法启动的问题
linux·运维·python
凯子坚持 c2 小时前
0基础带你入门Linux之使用
linux·运维·服务器
EterNity_TiMe_2 小时前
【Linux基础IO】深入Linux文件描述符与重定向:解锁高效IO操作的秘密
linux·运维·服务器·学习·性能优化·学习方法
python-码博士2 小时前
Rosetta 一:手把手教你用Linux安装Rosetta(全网最简洁)
linux·运维·服务器
神秘的土鸡3 小时前
Linux中Docker容器构建MariaDB数据库教程
linux·运维·服务器·数据库·docker·mariadb