Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/docker/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker 当容器退出时,我会丢失数据_Docker - Fatal编程技术网

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

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

尽管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 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卷

  • 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)
    

  • 我的建议是管理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