Docker提交未保存我对映像的更改

时间:2019-01-15 03:16:11

标签: docker commit

我是docker world的新手:我可以部署docker容器并做一些工作。

试图进入下一个保存更改并将容器/图像移动到另一台PC /服务器的级别。

当前,我在Windows 10上使用docker,但是我确实可以访问Ubuntu 16.04服务器来测试我的工作。

这就是我要坚持的地方:我在Docker上部署了Wordpress和MariaDB图像。
我的WP运行得很好OK。我安装了几个主题,并创建了一些带有图像的页面。

这时,我想保存我的工作并将其发送给我的朋友,后者将部署我的图像并在同一Wordpress上做进一步的工作。

我在线阅读的内容是:我应该运行docker commit命令以.tar格式保存并创建我的docker映像,然后将此映像文件(.tar)发送给我的朋友。他将在我的文件上运行docker load -i,以将其作为图像加载到他的docker中,然后从该文件创建容器,这将使他在Wordpress上的工作全部完成。

为了澄清,我同时提交了Wordpress和Mariadb容器。
我没有安装任何外部卷,因此所有工作都保存在容器中。

我确实记得在docker设置中在驱动器C和D上打上了对号,但是我不知道这是否与卷有关。

我的提交和移动.tar文件过程没有任何错误。一旦我的朋友从我提交的图像中创建了容器,他就会得到干净的Wordpress(就像从wp设置页面开始的新的Wordpress安装一样)。

我注意到的另一件事是,我创建的图像与我拉出的原始图像具有相同的文件大小。运行docker images时,我看到的图像是420MB,而Wordpress图像是420MB。

我认为我的图片应该更大一点,因为我已经安装了主题,插件并将图片上传到Wordpress。至少应比原始图像增加3至5 MB。请帮忙。谢谢。

运行docker system df给了我这个

TYPE                TOTAL               ACTIVE              SIZE                RECLAIMABLE
Images              5                   3                   1.259GB             785.9MB (62%)
Containers          3                   3                   58.96kB             0B (0%)
Local Volumes       2                   2                   311.4MB             0B (0%)
Build Cache         0                   0                   0B                  0B

5 个答案:

答案 0 :(得分:2)

确保以shown here的身份提交正在运行的容器(以避免清除任何数据)

docker commit CONTAINER_ID yourImage

使用docker commit命令后,您可以使用docker save将图像保存在tar中,并使用docker load将其导入回as shown here

答案 1 :(得分:1)

您必须使用卷来存储数据。 您可以在这里找到文档:https://docs.docker.com/storage/volumes/

例如,您可以在docker-compose.yml中进行类似的操作。

version: '3.1'

services:
  wordpress:
    image: wordpress:php7.2-apache
    ports:
      - "8080:80"
    environment:
      WORDPRESS_DB_HOST: databasename
      WORDPRESS_DB_USER: username
      WORDPRESS_DB_PASSWORD: password
      WORDPRESS_DB_NAME: namedatabase
    volumes:
      - name_volume:/var/www/html
volumes:
  - name_volume:

    volumes:
      - ./yourpath:/var/www/html

答案 2 :(得分:0)

您永远不要运行docker commit

为回答您的紧迫问题,运行数据库的容器通常将其数据存储在volumes中;它们是set up,因此即使没有提供docker run -v选项来将数据显式存储在命名卷或主机目录中,数据也被存储在匿名卷中。这意味着docker commit永远不会将数据保留在数据库中,因此您需要其他机制来复制实际数据。

实际上,您的同事可以问一些问题,例如“这个400 MB的tarball是从哪里来的,为什么我应该信任它,以及如果它在运输过程中受到损坏,如何重新创建它?”还有一些很好的问题,例如“基础数据库具有我需要的安全修复程序,那么如何在更新的基础映像之上获得所做的更改?”如果您勤奋工作,则可以在文本文件中写下您所做的一切。如果您有一个文本文件,说“我从mysql:5.6开始,那么我就跑了……”,这很像一个Dockerfile。语法很简单,并且Docker有一个不错的tutorial on building and running custom images

当需要自定义图像时,应始终使用Dockerfile描述其内容,可以将其检入源代码管理,并可以使用docker build重建图像。

在您的用例中,听起来好像您实际上并不需要自定义图像。我可能建议您建立一个Docker Compose YAML文件,该文件描述您的设置并将数据实际存储在本地目录中。数据库一半可能看起来像

version: '3'
services:
  db:
    image: 'mysql:8.0'
    volumes:
      - './mysql:/var/lib/mysql/data'
    ports:
      - '3306:3306'

数据将存储在主机中的mysql子目录中。现在,您可以打包此目录树,并将该tar文件发送给您的同事,然后同事可以解压缩它,并使用其关联的数据重新创建相同的环境。

答案 3 :(得分:0)

使用docker build(对映像的更改应存储在Dockerfile中)。

现在,如果您有多种服务,只需使用Docker的兄弟docker-compose。您还需要执行的另一步骤是创建docker-compose.yml(不要怕,我的朋友,这并不容易)。您在此文件中所做的所有工作就是列出您的映像(以及定义其Dockerfile用于该映像的位置,可以在每个映像的某个子文件夹中)。如果需要,还可以在其中定义其他一些属性。

答案 4 :(得分:0)

请注意,某些目录被docker视为卷目录,这意味着它们是特定于容器的,因此从不保存在映像中。 \data目录就是这样的示例。执行docker commit my_container my_image:my_tag时,将保存除/data之外的所有容器文件系统。要解决此问题,您可以执行以下操作:

mkdir /data0
cp /data/* /data0

然后,在容器外部:

docker commit my_container my_image:my_tag

然后,您可能希望将/ data0上的数据复制回/ data,在这种情况下,您可以制作一个新图像:

在Dockerfile上:

FROM my_image:my_tag
CMD "cp /data0 /data && my_other_CMD"

请注意,尝试在/data命令中将内容复制到RUN无效,因为在每个层中都创建了一个新容器,并且在每个层中都创建了{{1} }被丢弃。将该容器设为无效后,您还可以执行以下操作:

/data