容器退出时我丢失了我的数据

尽pipeDocker的交互式教程和常见问题,当容器退出时,我失去了我的数据。

我已经安装了这里描述的Docker: http : //docs.docker.io/en/latest/installation/ubuntulinux没有任何问题在Ubuntu 13.04。

但退出时会丢失所有数据。

iman@test:~$ sudo docker version Client version: 0.6.4 Go version (client): go1.1.2 Git commit (client): 2f74b1c Server version: 0.6.4 Git commit (server): 2f74b1c Go version (server): go1.1.2 Last stable version: 0.6.4 iman@test:~$ sudo docker run ubuntu ping 2013/10/25 08:05:47 Unable to locate ping iman@test:~$ sudo docker run ubuntu apt-get install ping Reading package lists... Building dependency tree... The following NEW packages will be installed: iputils-ping 0 upgraded, 1 newly installed, 0 to remove and 0 not upgraded. Need to get 56.1 kB of archives. After this operation, 143 kB of additional disk space will be used. Get:1 http://archive.ubuntu.com/ubuntu/ precise/main iputils-ping amd64 3:20101006-1ubuntu1 [56.1 kB] debconf: delaying package configuration, since apt-utils is not installed Fetched 56.1 kB in 0s (195 kB/s) Selecting previously unselected package iputils-ping. (Reading database ... 7545 files and directories currently installed.) Unpacking iputils-ping (from .../iputils-ping_3%3a20101006-1ubuntu1_amd64.deb) ... Setting up iputils-ping (3:20101006-1ubuntu1) ... iman@test:~$ sudo docker run ubuntu ping 2013/10/25 08:06:11 Unable to locate ping iman@test:~$ sudo docker run ubuntu touch /home/test iman@test:~$ sudo docker run ubuntu ls /home/test ls: cannot access /home/test: No such file or directory 

我还用交互式会话testing了相同的结果。 我忘记了什么吗?

编辑:重要的新的DOCKER用户

正如@ mohammed-noureldin和其他人所说,实际上这不是一个容器退出 。 每次它只是创build一个新的容器。

您需要提交对容器所做的更改,然后运行它。 尝试这个:

 sudo docker pull ubuntu sudo docker run ubuntu apt-get install -y ping 

然后使用此命令获取容器ID:

 sudo docker ps -l 

提交对容器的更改:

 sudo docker commit <container_id> iman/ping 

然后运行容器:

 sudo docker run iman/ping ping www.google.com 

这应该工作。

当你使用docker run来启动一个容器时,它实际上根据你指定的图像创build一个新的容器

除了这里其他有用的答案,请注意,您可以在退出后重新启动现有容器,并且您的更改仍然存在。

 docker start f357e2faab77 # restart it in the background docker attach f357e2faab77 # reattach the terminal & stdin 

有以下几种方法来保存容器数据:

  1. Docker卷

  2. Docker提交

    a)从Ubuntu映像创build容器并运行bashterminal。

      $ docker run -i -t ubuntu:14.04 /bin/bash 

    b)在terminal内安装curl

      # apt-get update # apt-get install curl 

    c)离开集装箱docker

      # exit 

    d)通过执行以下命令logging您的容器ID:

      $ docker ps -a 

    e)将容器保存为新图像

      $ docker commit <container_id> new_image_name:tag_name(optional) 

    f)validation你可以看到你的新卷像安装。

      $ docker images $ docker run -it new_image_name:tag_name bash # which curl /usr/bin/curl 

除了Unferth的回答 ,build议创build一个Dockerfile 。

在一个空目录中,用下面的内容创build一个名为“Dockerfile”的文件

 FROM ubuntu RUN apt-get install ping ENTRYPOINT ["ping"] 

使用Dockerfile创build一个图像 。 让我们使用一个标签,所以我们不需要记住hex图像编号。

 $ docker build -t iman/ping . 

然后在容器中运行图像

 $ docker run iman/ping stackoverflow.com 

如果你想在你的容器中保存数据,你可能需要查看docker卷。 访问https://docs.docker.com/engine/tutorials/dockervolumes/ 。 docker文档是一个很好的开始

我的build议是pipe理docker,与docker撰写。 是一个很容易的方式来pipe理您的项目的所有docker的容器,您可以映射版本和链接不同的容器一起工作。

这些文档很容易理解,比docker的文档更好。

Docker-Compose文档

最好

类似的问题(也没有单独的Dockerfile可以解决这个问题)带我到这个页面。

第0阶段:希望Dockerfile能够解决这个问题:直到–dns和–dns-search将出现在Dockerfile支持中 – 没有办法整合基于Intranet的资源。

阶段1:在使用Dockerfile构build镜像之后(通过Dockerfile必须在当前文件夹中的严重故障),通过运行Docker运行脚本来映射部署基于Intranet的内容。 例如: docker run -d \ --dns=${DNSLOCAL} \ --dns=${DNSGLOBAL} \ --dns-search=intranet \ -t pack/bsp \ --name packbsp-cont \ bash -c " \ wget -r --no-parent http://intranet/intranet-content.tar.gz \ tar -xvf intranet-content.tar.gz \ sudo -u ${USERNAME} bash --norc"

第二阶段:守护进程模式下应用docker运行脚本,提供本地dnslogging,以便下载和部署本地的东西。

重要的一点:运行脚本应该以/usr/bin/sudo -u ${USERNAME} bash --norc类的东西来结束,即使在安装脚本完成之后,运行脚本/usr/bin/sudo -u ${USERNAME} bash --norc可以运行。

,对于完整的自动化问题,不能在交互模式下运行容器,因为它将保持在内部命令提示符下,直到按下CTRL-CTRL-q

,如果在安装脚本结束时不会执行交互式bash,则脚本执行完毕后,容器将立即终止,从而失去所有安装结果。

第三阶段:容器仍在后台运行,但目前还不清楚容器是否已经结束安装过程。 使用下面的块来确定执行程序结束: while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done while ! docker container top ${CONTNAME} | grep "00[[:space:]]\{12\}bash \--norc" - do echo "." sleep 5 done脚本将进一步只有在完成安装后进行。 这是调用提交当前容器ID和目标映像名称的正确时刻(它可能与构build/运行过程相同,但附加了本地安装目的标记)例如: docker commit containerID pack/bsp:toolchained 。看到这个链接如何获得适当的containerID

阶段4:容器已经被本地安装更新,并且已被提交到新分配的映像(添加了目的标签的映像)。 现在停止容器运行是安全的。 例如: docker stop packbsp-cont

阶段5:在本地安装的容器需要运行的任何时候,用先前保存的映像启动它。 例如: docker run -d -t pack/bsp:toolchained