尽管Docker的交互式教程和常见问题,我丢失了我的数据时,容器退出。

我已经安装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 

我还用互动会话测试了它,得到了同样的结果。我是不是忘了什么?

编辑:对docker新用户很重要

正如@ mohammad -noureldin和其他人所说,实际上这不是一个容器退出。每次它都会创建一个新容器。


当前回答

我的建议是管理docker,使用docker compose。是一个简单的方法来管理所有docker的容器为您的项目,你可以映射版本和链接不同的容器一起工作。

文档非常容易理解,比docker的文档更好。

Docker-Compose文档

Best

其他回答

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

Docker volumes Docker commit a) create container from ubuntu image and run a bash terminal. $ docker run -i -t ubuntu:14.04 /bin/bash b) Inside the terminal install curl # apt-get update # apt-get install curl c) Exit the container terminal # exit d) Take a note of your container id by executing following command : $ docker ps -a e) save container as new image $ docker commit <container_id> new_image_name:tag_name(optional) f) verify that you can see your new image with curl installed. $ docker images $ docker run -it new_image_name:tag_name bash # which curl /usr/bin/curl

您需要向容器提交所做的更改,然后运行它。试试这个:

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

这应该有用。

对于你的问题,我有一个更简单的答案,运行以下两个命令

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在容器内安装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 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文档是一个很好的开始