我是Docker的新手,我确实遇到了一些问题。
我的目标: - 使用Dockerfile创建一个docker-container并保留在容器内/不要丢弃它。 - 运行本地Docker-Container - ……
我将在我的计算机上用内容创建一个新的docker-container dockerfile的?如果我需要更新其中的任何内容,我必须 再次运行它以便容器更新?
docker-build 创建一个图像(如ISO)。要创建容器,您必须启动/运行此映像。 Container是一个正在运行的映像,它可能与原始映像不同,因为在运行期间您可以修改内部的文件系统。停止并删除容器时,所有更改都将丢失。 Docker的做法不是将数据存储在图像中 - 如果图像产生有价值的东西,它应该存储在外面(考虑到它的体积)。
docker-build
CMD ["gulp --version" , "gulp"]
这是不正确的。 JSON表示法要求您将每个参数放在一个单独的数组元素中。这是对的:
CMD ["guld", "--version"]
你用它创建一个图像
docker build -t my-image .
你用它启动它(创建容器)
docker run --name=my-image-instance my-image
如果需要控制正在运行的容器,可以使用友好名称 my-image-instance 或者,如果你没有提供它,容器的 ID
my-image-instance
ID
如果我跑 docker build 我会创建一个新容器吗?
docker build
它会 执行 Dockerfile的内容,并创建一个新的 图片 。
你需要 docker run (或者很少, docker create )图像从中创建容器。更新Dockerfile或应用程序源时,需要重复 docker build 步, docker stop && docker rm 现有的容器,和 docker run 一个新的。您的 docker-compose.yml 片段封装了这个,但请注意Docker Compose会在适当的时候删除并重新创建容器。
docker run
docker create
docker stop && docker rm
docker-compose.yml
如果我使用 docker start gulp-docker-test ...
docker start gulp-docker-test
它将开始一个 容器 用这个名字。这是与图像命名空间不同的命名空间。容器必须已经存在并被停止(通常是明确的 docker stop 命令)。这是一个稍微不同寻常的状态。
docker stop
这会查找名为的二进制文件 gulp --version ,并使用单个参数运行它 gulp 。因为您可能没有命名的单个文件 /usr/local/bin/gulp --version (使用空格和“version”作为文件名的一部分)会出现错误。
gulp --version
gulp
/usr/local/bin/gulp --version
你才得到 一 Dockerfile中的CMD。 (或者一个ENTRYPOINT,但我倾向于发现CMD更可取,除非在一些非常特殊的情况下。)你在shell中键入的每个“单词”在语法中变成一个单独的“单词”。所以你可以写一下
CMD ["gulp", "--version"]
或者,如果您不使用括号,Docker将包装CMD文本 sh -c ... ,所以更贴近你实际写的东西
sh -c ...
CMD gulp --version && gulp
在实践中,您通常运行构建工具(如Gulp)作为构建映像的一部分,并使用CMD实际启动应用程序。
RUN gulp CMD ["npm", "start"]