Docker 当容器退出时,我会丢失数据
尽管Docker和我在容器退出时丢失了数据 我已安装Docker,如下所述: 在ubuntu 13.04上没有任何问题 但退出时会丢失所有数据Docker 当容器退出时,我会丢失数据,docker,Docker,尽管Docker和我在容器退出时丢失了数据 我已安装Docker,如下所述: 在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 versio
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
我还使用交互式会话对其进行了测试,得到了相同的结果。我忘了什么吗
编辑:对于新DOCKER用户很重要
正如@mohammed noureldin和其他人所说,实际上这不是一个退出的容器。每次它只是创建一个新容器。您需要修改对容器所做的更改,然后运行它。试试这个:
sudo docker pull ubuntu
sudo docker run ubuntu apt-get install -y ping
$ docker run iman/ping stackoverflow.com
然后使用以下命令获取容器id:
sudo docker ps -l
提交对容器的更改:
sudo docker commit <container_id> iman/ping
sudo docker run iman/ping ping www.google.com
sudo docker start mycontainername
sudo docker exec -ti mycontainername bash
这应该会起作用。此外,建议创建一个
在空目录中,创建一个名为“Dockerfile”的文件,该文件包含以下内容
FROM ubuntu
RUN apt-get install ping
ENTRYPOINT ["ping"]
使用Dockerfile创建图像。让我们使用一个标记,这样我们就不需要记住十六进制图像编号
$ docker build -t iman/ping .
然后在容器中运行图像
$ docker run iman/ping stackoverflow.com
当您使用
docker run
启动容器时,它实际上会根据您指定的图像创建一个新容器
除了这里的其他有用答案外,请注意,您可以在现有容器退出后重新启动它,并且您所做的更改仍然存在
docker start f357e2faab77 # restart it in the background
docker attach f357e2faab77 # reattach the terminal & stdin
如果要将数据持久化到容器中,可能需要查看docker卷。参观docker文档是一个非常好的起点有以下方法可以持久保存容器数据:
$ docker run -i -t ubuntu:14.04 /bin/bash
b) 在终端内部安装旋涡
# apt-get update
# apt-get install curl
c) 离开集装箱码头
# exit
d) 通过执行以下命令记录容器id:
$ docker ps -a
e) 将容器另存为新图像
$ docker commit <container_id> new_image_name:tag_name(optional)
我的建议是管理docker,由docker撰写。是一种管理项目所有docker容器的简单方法,您可以映射版本并链接不同容器以协同工作 这些文档非常容易理解,比docker的文档要好 最好的类似的问题(Dockerfile无法单独解决)将我带到了这一页 第0阶段: 总之,希望Dockerfile能够解决这个问题:在Dockerfile支持中出现--dns和--dns搜索之前,没有办法将基于intranet的资源集成到Dockerfile中 第一阶段: 使用docker文件构建映像后(顺便说一句,docker文件存在严重问题,它必须位于当前的文件夹中),通过运行docker运行脚本,可以部署基于intranet的映像。例子:
docker run-d\
--dns=${DNSLOCAL}\
--dns=${DNSGLOBAL}\
--dns搜索=内部网\
-t组/bsp\
--名称packbsp cont\
bash-c“\
wget-r--没有父级http://intranet/intranet-content.tar.gz \
tar-xvf intranet-content.tar.gz\
sudo-u${USERNAME}bash--norc“
第二阶段:
在守护进程模式下应用docker运行脚本提供本地dns记录,以便能够下载和部署本地内容
要点:运行脚本应该以类似于/usr/bin/sudo-u${USERNAME}bash--norc的内容结尾,这样即使在安装脚本完成后也可以保持容器运行
否,不可能在交互式模式下运行容器,因为它将保留在内部命令提示符中,直到按下CTRL-p CTRL-q
否,如果在安装脚本结束时不执行交互bash,则容器将在脚本执行完成后立即终止,从而丢失所有安装结果
第三阶段:
容器仍在后台运行,但尚不清楚容器是否已结束安装过程。使用以下程序块确定执行过程的完成情况:
虽然docker容器顶部${CONTNAME}grep“00[:space:]\{12\}bash\--norc”-
做
回声”
睡眠5
完成
只有在安装完成后,脚本才会继续。现在正是调用的适当时机:commit,提供当前容器id和目标映像名称(它可能与构建/运行过程相同,但附加了本地安装目的标记。例如:docker commit containerID pack/bsp:toolchained
)。
请参阅此链接,了解如何获得正确的
第4阶段:容器已使用本地安装更新,并已提交到新分配的映像(添加了目的标记的映像)。现在可以安全地停止容器运行。示例:docker stop packbsp cont
stage5:本地安装的容器需要运行的任何时候,都可以使用以前保存的映像启动它。
示例:docker-run-d-t-pack/bsp:toolchained
这是来自用户kgs的精彩回答
docker start $(docker ps -a -q --filter "status=exited")
(or in this case just docker start $(docker ps -ql) 'cos you don't want to start all of them)
docker exec -it <container-id> /bin/bash
docker start$(docker ps-a-q--filter“status=exited”)
(或者在本例中,只需docker start$(docker ps-ql)'因为您不想启动所有这些程序)
docker exec-it/bin/bash
第二行非常重要。因此exec用于代替run,而不是在映像上,而是在containerid上。您可以在容器启动后执行此操作。对于您的问题,我有一个更简单的答案,请运行以下两个命令
sudo docker run -t -d ubuntu --name mycontainername /bin/bash
sudo docker ps -a
上面的ps-a命令返回所有容器的列表。使用引用图像名称的容器名称--“ubuntu”。docker会自动为容器生成名称,例如--'lightlyxuyzx'
,如果您不使用--name选项
-t和-d选项很重要,创建
sudo docker start mycontainername
sudo docker exec -ti mycontainername bash
docker run -t -d --name mycontainername -p 5000:5000 -v ~/PROJECTS/SPACE:/PROJECTSPACE 7efe2989e877 /bin/bash