容器退出时我丢失了我的数据
尽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
有以下几种方法来保存容器数据:
-
Docker卷
-
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