我是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
答案 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