当容器退出时,我丢失了数据

尽管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 start f357e2faab77 # restart it in the background
    docker attach f357e2faab77 # reattach the terminal & stdin
    

    如果您希望将数据持久化在容器中,您可能需要查看docker卷。访问https://docs.docker.com/engine/tutorials/dockervolumes/。docker文档是一个很好的开始

    有以下几种方法持久化容器数据:

    1. 码头工人卷

    2. < p >码头工人提交

      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退出从用户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选项。

    -t和-d选项很重要,创建的容器被分离,并可以使用-t选项重新连接,如下所示。

    使用——name选项,你可以将容器命名为mycontainername。

    sudo docker exec -ti mycontainername bash
    

    和上面的命令帮助您使用bash shell登录到容器。从此时起,你在容器中所做的任何更改都会被docker自动保存。 例如- apt-get install curl在容器内 你可以毫无问题地退出容器,docker会自动保存更改

    在接下来的用法中,您所要做的就是每次想要使用这个容器时运行这两个命令。

    下面的命令将启动已停止的容器:

    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
    
    在我的例子中: 7efe2989e877 -是之前运行的容器的imageid 我用

    Docker ps a

    没有一个答案能解决这个设计选择的问题。我认为docker这样工作是为了防止这2个错误:

    • 反复重启
    • 局部的错误

    上面的问题都有很好的答案。也许不需要另一个答案,但我仍然想用最简单的语言就这个话题发表我的个人观点。

    这里有一些关于集装箱的要点。有助于我们得出结论的图片:

      <李> docker映像可以是:
      1. created-from-a-given-container
      2. 删除
      3. used-to-create-any-number-of-containers
      4. 李< / ol > < / > <李> docker容器可以是:
        1. 从镜像创建
        2. 开始
        3. 停止
        4. 重新启动
        5. 删除
        6. used-to-create-any-number-of-images
        7. 李< / ol > < / > <李> docker run命令执行此操作:
          1. 下载映像或使用缓存的映像
          2. 从中创建一个新容器
          3. 启动容器
          4. 李< / ol > < / > <李> 当使用Dockerfile创建映像时:
            1. 众所周知,映像最终将用于运行docker容器。
            2. 在发出docker build命令后,docker幕后会创建一个带有base-file-system的运行容器,并按照Dockerfile中的步骤根据开发人员的需要配置该容器。
            3. 在容器配置了Dockerfile的规格后,它将作为一个映像提交。
            4. 图像准备摇滚&滚!
            5. 李< / ol > < / >

    结论:

    正如我们所看到的,docker容器独立于docker镜像。

    容器可以重新启动,前提是该容器的唯一ID [使用docker ps --all获取id]

    任何操作,如创建新目录,创建文件,安装工具等,都可以在容器运行时在容器中完成。一旦容器停止,它将持久化所有更改。容器停止和重新启动就像重新启动计算机系统一样。

    一个已经创建的容器总是可以重新启动,但是当我们发出docker run命令时,一个新的容器就会从一个映像中创建出来,因此它就像一个新的计算机系统。正如我们现在所理解的那样,在旧容器中所做的更改在这个新容器中不可用。

    最后一点:

    我想现在很明显为什么数据似乎丢失了,但它总是在那里。但在一个不同的(旧的)容器里。因此,请注意docker start &docker run命令&永远不要对它们感到困惑。