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文件创建镜像的方式,希望大家多多关注。

相关推荐
钱彬 (Qian Bin)17 小时前
项目实践14—全球证件智能识别系统(切换回SQLite数据库并基于Docker实现离线部署和日常管理)
运维·docker·容器·fastapi·证件识别
岚天start17 小时前
Docker部署NGINX实现服务四层转发方案
服务器·nginx·docker
云和恩墨18 小时前
表空间、巡检、建库:DBA最熟悉的3个场景,正在被zCloud开放运维中心重新定义
运维·数据库·表空间·dba·巡检·建库
VermiliEiz18 小时前
二进制文件部署k8s方式(4)
云原生·容器·kubernetes
牛奔19 小时前
docker compose up 命令,默认配置文件自动查找规则
java·spring cloud·docker·容器·eureka
工具罗某人19 小时前
docker快速部署jenkins
java·docker·jenkins
学烹饪的小胡桃19 小时前
WGCAT工单系统 v1.2.7 更新说明
linux·运维·服务器·网络·工单系统
BigBigHang19 小时前
【docker】离线设备安装镜像
运维·docker·容器
学好statistics和DS19 小时前
Docker文件与本地文件,系统
运维·docker·容器
liuc031719 小时前
docker下安装SearXNG
运维·docker·容器