如何基于现有镜像创建新的Docker镜像?

49

我刚开始使用Docker。 我使用 Dockerfile 创建了一个镜像。如何从该现有镜像创建一个新镜像?

6个回答

34
假设您正在运行一个名为bd91ca3ca3c8的容器,并且想在对该容器进行更改后创建一个新的映像。生成另一个映像将允许您保留所做的更改。
在这种情况下,您可以运行: docker commit -p -a "作者姓名" -m "提交信息" bd91ca3ca3c8 新映像名称 -p 命令暂停容器,在构建新镜像时使用。 -a 命令允许您提供新镜像的作者信息。 -m 命令允许您添加注释, 类似于 Git。

1
我还想补充一点,你可以给它加上一个版本标签,比如 name_of_new_image:1.0 - undefined

21

您可以使用Docker命令 $docker build -f docker_filename . 创建一个新的镜像,它会首先读取Dockerfile文件中的指令并自动构建镜像。Dockerfile中的指令包含了组装镜像所需的必要命令。一旦镜像被构建完成,它将被分配一个镜像ID。

这个镜像可以被推送到Docker注册中心。为此,用户必须在Docker注册中心创建一个帐户。

Dockerfile的一个示例如下:

FROM docker/whalesay:latest
RUN apt-get -y update && apt-get install -y fortunes
CMD /usr/games/fortune -a | cowsay

这里的第一条指令告诉我们新镜像将使用docker/whalesay:latest镜像。 第二条指令会运行两个命令。 第三条指令告诉我们,在设置好环境后,应该运行"fortune -a"命令。


8
为了从现有图像创建新图像,您只需指定“FROM”,例如:
FROM sergiu/ubuntu
MAINTAINER sergiu

3
第一行中的 sergiu 是一个文件夹吗?在私有仓库中从镜像构建又是什么意思?MAINTAINER 关键字的目的是什么? - DRz
@DRz 'sergiu' 只是维护者的名称,更像是一条注释。它可以是电子邮件地址、人名或部门名称。 - Sergiu
我只是回答@DRz:sergiu/不是一个文件夹。它更像是一些高级语言中的命名空间。它只是标记接下来的内容,以避免重复的名称。 - Fabien Haddadi

6
您可以按照以下命令为现有图像创建一个新的图像:
docker tag jboss/wildfly myimage:v1

创建一个名为myimage,标签为v1的镜像,基于jboss/wildfly:latest镜像。

这应该是被接受的答案。我想知道为什么得票最高的答案都那么复杂:创建一个容器,或者创建一个Dockerfile...只需使用tag就可以了。 - Hi-Angel

4

我在Docker方面也是新手,但我发现以下内容可能会有所帮助。

1)每当您编写“FROM”并运行Docker文件时,Docker会在其仓库中查找并首先加载该映像。因此,如果您要在“FROM”中使用任何本地映像,则应该将其加载。

2)您在“FROM”中提供的参数很重要,因为如果您提供了错误的存储库名称或标签,它会给出错误消息。因此,请运行“docker images”命令以查看您的图像的正确存储库名称和标签。

3)现在,您可以像这样启动新的Docker文件

FROM REPOSITORY:TAG

它将起作用。


2

Docker commit:从容器的更改中创建一个新镜像。

将容器的文件更改或设置提交到新镜像中可能很有用。这使您可以通过运行交互式 shell 调试容器,或将工作数据集导出到另一台服务器。通常,最好使用 Dockerfiles 以记录和可维护的方式管理您的镜像。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接