我正在尝试创建(apache
),并将其发布给其他程序员。
我已经有这张图片:
> docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
eboraas/apache latest ddf3c3b74564 3 months ago 365MB
现在让我们创建一个具有设置的容器:
docker run -p 8520:80 -v //c/Users/sff/apache:/var/www/html -d eboraas/apache
好的,现在一切正常,我确实看到了测试页:
顺便说一句-docker ps -a
现在是:
C:\r>docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3a1083fded97 eboraas/apache "/usr/sbin/apache2ct…" 2 minutes ago Up 2 minutes 443/tcp, 0.0.0.0:8520->80/tcp eloquent_heisenberg
好
有人告诉我可以使用docker commit
来保留容器作为自定义的新图像。
所以我做到了:
C:\r>docker commit 3a1083fded97 131313222/shared-apache
sha256:14135d48fcf827527d655225908a29b15223317810be9cf22651ae375a87a774
它确实保存了新图像:
C:\r>docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
131313222/shared-apache latest 14135d48fcf8 49 seconds ago 365MB
eboraas/apache latest ddf3c3b74564 3 months ago 365MB
但是现在我希望运行docker run 131313222/shared-apache
-保持(!!)文件夹映射和端口映射:
但是如果我运行这个:
docker run 131313222/shared-apache
我明白了:
C:\ r> docker run 131313222 / shared-apache AH00558:apache2:无法 使用以下命令可靠地确定服务器的标准域名 172.17.0.2。全局设置“ ServerName”指令以禁止显示此消息
很明显,测试页无法正常工作。
问题:
为什么commit命令(到新映像中)不保存端口和卷映射?
换句话说:(没有docker文件)-如何创建将包含其当前设置的图像?我希望开发人员立即开始工作,就像每个人都在写:
docker run -p 8520:80 -v //c/Users/sff/apache:/var/www/html -d eboraas/apache
提交不应该这样做吗?
我希望每个人都无所事事地看到我所看到的。
答案 0 :(得分:1)
仅 的Docker映像包含其文件系统和少量元数据,例如用于运行的默认命令和环境变量设置。它不包含您可能指定的任何其他设置,例如端口映射,卷挂载,对主机设备的访问,对主机级设置的特权访问或后台模式。您根本无法创建默认为您在问题中显示的设置的图像。
如果您的读者是其他程序员,则建议编写序列以将映像构建为Dockerfile,然后将该Dockerfile和运行该映像的Shell脚本或Docker Compose YAML文件添加到公共源代码控制存储库中。
实际上,我建议您不要使用docker commit
。 Dockerfile系统非常简单(如果您可以指定这些设置,则它们将在Dockerfile中各占一行;例如ENV foo bar
替换docker run -e foo=bar
)并且可以检查Dockerfile轻松地控制源代码当您需要重建映像时(由于新版本的Apache发布了重要的安全更新,并且由于捆绑的某些软件发生了变化),Dockerfile既可以为您提供记录,又可以记录映像的创建工作。单个命令即可实际完成。