基于已有的image,创建docker images

本文介绍了两种在Docker中创建自定义镜像的方法:一是通过在现有容器中安装服务并将其导出为新镜像;二是利用Dockerfile文件构建新镜像。文中详细解释了每种方法的具体步骤,并提供了实用的小技巧。

首先我们得知道怎么下载镜像:

docker search 镜像名称                                         //电脑联网情况下在docker HUB里面查找镜像
docker pull 仓库服务器/仓库/镜像名称:标签         //通过查询到的镜像信息来下载镜像

第一个方法:在运行的container中安装service然后导出为image

整体思路:运行一个容器,在运行容器的基础上添加需要的服务,然后导出为新的images。

[root@localhost ~]#docker run -it docker.io/centos     //根据image运行容器
[root@845e8472f250 /]#                                 //运行容器的ID号
[root@845e8472f250 /]# yum -y install *****            //安装一些服务
[root@845e8472f250 /]# exit

命令中 i 、t 的参数可以docker run –help查看

现在的容器很明显已经被我们改动了,然后通过以下命令新建images:

docker commit -m “Description” -a “users <users@163.com>” 845e8472f250 centos:v1

-m:来指定提交的说明信息
-a:指定更新的作者和邮箱
命令中的一串数字是刚才运行container’s ID
数字后面的是新建镜像的repository:tag

Complete

第二个方法:基于dockerfile文件来创建新的image

整体思路:新建一个dockerfile,文件名必须是dockerfile,写入命令。创建完使用docker build命令来创建新image。

dockerfile文件中基本分为4部分:
1.注释部分
2.基础镜像地址
3.维护者信息
4.命令部分

mkdir -p /docker/httpd
cd /docker/httpd

vim  dockerfile                         //这里文件名必须为dockerfile
#This is http service                   //注释部分,类似于文件说明
FROM docker.io/centos:latest           //以哪个image作为基础
MAINTAINER user <user@163.com>          //维护者的信息
RUN yum -y install apr apr-utils        //在创建镜像中运行以下命令
RUN yum -y install httpd

根据dockerfile创建新images:

docker build -t=centos:v2 /docker/httpd

-t:添加镜像name:tag信息
后面的/docker/httpd路径为dockerfile的绝对路径,也可在/docker/httpd的当前路径下使用 “.”来代替绝对路径

说明:dockerfile中的指令被一行一行的执行,每执行完一行命令都要创建一个新的容器。当所有命令都执行完,会返回一个镜像ID,中间步骤所产生的所有容器ID都会被清除。一个镜像不能超过127层

Complete

小tips:
基于已有image进行创建的时候,可能会因为下载国外网站的镜像很慢。如果你在本地有镜像,可以通过以下命令本地导入镜像,这里再贴出导出镜像的命令

docker load -input 镜像名称:标签                          //本地导入镜像
docker save -output  创建归档文件名 镜像名称:标签           //本地导出镜像
Docker镜像出现在 `docker images` 列表中,但不在 `docker ps` 运行容器列表中,是一种常见现象,其背后的原因与 Docker 的架构和镜像、容器之间的关系密切相关。 ### `docker images` 和 `docker ps` 的区别 `docker images` 命令用于列出本地存储的镜像。这些镜像可以是已经标记的(tagged)镜像,也可以是空悬镜像(dangling images)[^2]。镜像本质上是只读的模板,用于创建容器。它们并不需要处于运行状态,而是作为构建或启动容器的基础。 而 `docker ps` 命令仅列出当前正在运行的容器。容器是镜像的一个运行实例,只有当镜像被实际启动时,才会出现在 `docker ps` 的输出中。如果一个镜像从未被启动,或者其对应的容器已经停止或删除,那么该镜像自然不会出现在 `docker ps` 的结果中[^1]。 ### 镜像未出现在 `docker ps` 中的可能原因 1. **镜像未被运行** 如果某个镜像只是被构建或拉取,但从未通过 `docker run` 命令启动为容器,那么它不会出现在 `docker ps` 中。 2. **容器已经停止** 即使镜像曾被运行,但容器已经停止运行(例如通过 `docker stop` 或容器自身退出),它也不会出现在默认的 `docker ps` 输出中。此时可以使用 `docker ps -a` 查看所有容器(包括已停止的)。 3. **镜像为空悬镜像(dangling image)** 空悬镜像是指那些没有标签的镜像,通常是由于构建新镜像时覆盖了原有标签所致[^3]。这些镜像虽然存在于本地,但无法直接通过标签引用,因此也无法启动为容器。 4. **镜像标签被覆盖** 当重新构建一个镜像并使用相同的标签时,旧的镜像会失去标签,变为 `<none>:<none>` 的状态。虽然该镜像仍然存在于 `docker images` 中,但由于没有标签,无法直接通过名称运行它。 5. **镜像损坏或构建失败** 如果镜像构建过程中出现问题,或者镜像文件损坏,可能会导致无法启动容器。这种情况下,镜像仍然会出现在 `docker images` 中,但尝试运行时会失败[^4]。 ### 示例命令 - 查看所有本地镜像: ```bash docker images -a ``` - 查看所有容器(包括已停止的): ```bash docker ps -a ``` - 删除所有空悬镜像: ```bash docker rmi $(docker images -f "dangling=true" -q) ``` - 运行一个容器并查看其状态: ```bash docker run -d --name my_container my_image docker ps ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值