尽管Docker的交互式教程和常见问题解答,当容器退出时,我丢失了我的数据。
我已经安装Docker如下所述: docker 321446 次浏览
你需要提交你对容器所做的改变,然后运行它。试试这个:
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
这应该有用。
除了Unferth的回答之外,建议创建Dockerfile。
在空目录中,创建名为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 run
除了这里其他有用的答案外,请注意,您可以在现有容器退出后重新启动它,而您的更改仍然存在。
docker start f357e2faab77 # restart it in the background docker attach f357e2faab77 # reattach the terminal & stdin
如果您希望将数据持久化在容器中,您可能需要查看docker卷。访问https://docs.docker.com/engine/tutorials/dockervolumes/。docker文档是一个很好的开始
有以下几种方法持久化容器数据:
码头工人卷
A)从ubuntu镜像创建容器并运行bash终端。
$ 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)
F)验证您可以看到您的新图像与curl安装。
$ docker images $ docker run -it new_image_name:tag_name bash # which curl /usr/bin/curl
我的建议是管理docker,使用docker compose。是一个简单的方法来管理所有docker的容器为您的项目,你可以映射版本和链接不同的容器一起工作。
文档非常容易理解,比docker的文档更好。
Docker-Compose Docs
最好的
类似的问题(仅靠Dockerfile无法解决)将我带到了这个页面。
<强> 0阶段: 对于所有人来说,希望Dockerfile可以修复它:直到——dns和——dns-search出现在Dockerfile支持中-没有办法将基于内网的资源集成到
< >强阶段1: 在使用Dockerfile构建映像之后(顺便说一下,Dockerfile必须在当前的文件夹中,这是一个严重的故障),通过运行docker运行脚本,有一个映像来部署基于内部网的内容。例子: Docker运行-d \ ——dns = $ {DNSLOCAL} \ ——dns = $ {DNSGLOBAL} \ ——dns搜索=内部网\ -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" < /代码> < / p > < >强阶段2: 在守护进程模式中应用docker运行脚本,提供本地dns记录,以便能够下载和部署本地东西。< / p > 重要的一点:运行脚本应该以类似/usr/bin/sudo -u ${USERNAME} bash --norc的内容结束,以便在安装脚本完成后仍然保持容器运行。 没有,不可能在完全自动化的情况下以交互模式运行容器,因为它将保持在内部shall命令提示符中,直到CTRL-p CTRL-q被按下。 没有,如果交互bash不会在安装脚本的末尾执行,容器将在脚本执行完成后立即终止,失去所有的安装结果。 < >强阶段3: 容器仍在后台运行,但不清楚容器是否已结束安装过程或尚未。使用以下块来确定执行过程结束: 虽然!docker容器top ${CONTNAME} | grep "00[:space:]]\{12\}bash \——norc" - 做 回声”。“ 睡5 完成 该脚本只有在完成安装后才会继续执行。此时调用:提交,提供当前容器id以及目标映像名称(它可能与构建/运行过程中相同,但附加了本地安装目的标记)。例子:docker commit containerID pack/bsp:toolchained。 请参阅此链接,了解如何获得正确的containerID 阶段4:容器已经与本地安装一起更新,并且已被提交到新分配的映像中(添加了purposes标签的映像)。现在可以安全地停止容器运行了。例如:docker stop packbsp-cont stage5:当容器需要运行本地安装时,使用之前保存的映像启动它。 例如:docker run -d -t pack/bsp:toolchained < / p >
Docker运行-d \ ——dns = $ {DNSLOCAL} \ ——dns = $ {DNSGLOBAL} \ ——dns搜索=内部网\ -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" < /代码> < / p > < >强阶段2: 在守护进程模式中应用docker运行脚本,提供本地dns记录,以便能够下载和部署本地东西。< / p > 重要的一点:运行脚本应该以类似/usr/bin/sudo -u ${USERNAME} bash --norc的内容结束,以便在安装脚本完成后仍然保持容器运行。 没有,不可能在完全自动化的情况下以交互模式运行容器,因为它将保持在内部shall命令提示符中,直到CTRL-p CTRL-q被按下。 没有,如果交互bash不会在安装脚本的末尾执行,容器将在脚本执行完成后立即终止,失去所有的安装结果。 < >强阶段3: 容器仍在后台运行,但不清楚容器是否已结束安装过程或尚未。使用以下块来确定执行过程结束: 虽然!docker容器top ${CONTNAME} | grep "00[:space:]]\{12\}bash \——norc" - 做 回声”。“ 睡5 完成 该脚本只有在完成安装后才会继续执行。此时调用:提交,提供当前容器id以及目标映像名称(它可能与构建/运行过程中相同,但附加了本地安装目的标记)。例子:docker commit containerID pack/bsp:toolchained。 请参阅此链接,了解如何获得正确的containerID 阶段4:容器已经与本地安装一起更新,并且已被提交到新分配的映像中(添加了purposes标签的映像)。现在可以安全地停止容器运行了。例如:docker stop packbsp-cont stage5:当容器需要运行本地安装时,使用之前保存的映像启动它。 例如:docker run -d -t pack/bsp:toolchained < / p >
< >强阶段2: 在守护进程模式中应用docker运行脚本,提供本地dns记录,以便能够下载和部署本地东西。< / p >
重要的一点:运行脚本应该以类似/usr/bin/sudo -u ${USERNAME} bash --norc的内容结束,以便在安装脚本完成后仍然保持容器运行。
/usr/bin/sudo -u ${USERNAME} bash --norc
没有,不可能在完全自动化的情况下以交互模式运行容器,因为它将保持在内部shall命令提示符中,直到CTRL-p CTRL-q被按下。
没有,如果交互bash不会在安装脚本的末尾执行,容器将在脚本执行完成后立即终止,失去所有的安装结果。
< >强阶段3: 容器仍在后台运行,但不清楚容器是否已结束安装过程或尚未。使用以下块来确定执行过程结束: 虽然!docker容器top ${CONTNAME} | grep "00[:space:]]\{12\}bash \——norc" - 做 回声”。“ 睡5 完成 该脚本只有在完成安装后才会继续执行。此时调用:提交,提供当前容器id以及目标映像名称(它可能与构建/运行过程中相同,但附加了本地安装目的标记)。例子:docker commit containerID pack/bsp:toolchained。 请参阅此链接,了解如何获得正确的containerID
虽然!docker容器top ${CONTNAME} | grep "00[:space:]]\{12\}bash \——norc" - 做 回声”。“ 睡5 完成
docker commit containerID pack/bsp:toolchained
阶段4:容器已经与本地安装一起更新,并且已被提交到新分配的映像中(添加了purposes标签的映像)。现在可以安全地停止容器运行了。例如:docker stop packbsp-cont
docker stop packbsp-cont
stage5:当容器需要运行本地安装时,使用之前保存的映像启动它。 例如:docker run -d -t pack/bsp:toolchained < / p >
docker run -d -t pack/bsp:toolchained
一个聪明的答案在这里如何继续一个docker退出从用户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
第二句话至关重要。所以exec被用来代替run,而且不是在映像上而是在容器id上。而且是在容器启动之后。
对于你的问题,我有一个更简单的答案,运行以下两个命令
sudo docker run -t -d ubuntu --name mycontainername /bin/bash sudo docker ps -a
上面的ps -a命令返回所有容器的列表。取引用映像名称的容器名称- 'ubuntu'。docker自动为容器生成名称,例如- 'lightlyxuyzx',如果你不使用——name选项。
'lightlyxuyzx'
-t和-d选项很重要,创建的容器被分离,并可以使用-t选项重新连接,如下所示。
使用——name选项,你可以将容器命名为mycontainername。
sudo docker exec -ti mycontainername bash
和上面的命令帮助您使用bash shell登录到容器。从此时起,你在容器中所做的任何更改都会被docker自动保存。 例如- apt-get install curl在容器内 你可以毫无问题地退出容器,docker会自动保存更改
apt-get install curl
在接下来的用法中,您所要做的就是每次想要使用这个容器时运行这两个命令。
下面的命令将启动已停止的容器:
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
Docker ps a
没有一个答案能解决这个设计选择的问题。我认为docker这样工作是为了防止这2个错误:
上面的问题都有很好的答案。也许不需要另一个答案,但我仍然想用最简单的语言就这个话题发表我的个人观点。
这里有一些关于集装箱的要点。有助于我们得出结论的图片:
结论:
正如我们所看到的,docker容器独立于docker镜像。
容器可以重新启动,前提是该容器的唯一ID [使用docker ps --all获取id]。
docker ps --all
任何操作,如创建新目录,创建文件,安装工具等,都可以在容器运行时在容器中完成。一旦容器停止,它将持久化所有更改。容器停止和重新启动就像重新启动计算机系统一样。
一个已经创建的容器总是可以重新启动,但是当我们发出docker run命令时,一个新的容器就会从一个映像中创建出来,因此它就像一个新的计算机系统。正如我们现在所理解的那样,在旧容器中所做的更改在这个新容器中不可用。
最后一点:
我想现在很明显为什么数据似乎丢失了,但它总是在那里。但在一个不同的(旧的)容器里。因此,请注意docker start &docker run命令&永远不要对它们感到困惑。
docker start