我正在尝试为mongod运行修复命令,但守护程序发出冲突错误,所以我删除了容器并再次运行修复命令并且守护程序再次给出了同样的冲突错误,这次我删除了容器中显示的容器ID错误和守护进程说"没有这样的id"。
所以,任何人都可以告诉我如何删除此容器,以便我可以成功运行修复命令。
我正在显示我的docker命令,如下所示
root@ip-172-31-6-252:~# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
NAMES
1f7bdd83dac0 mongo:latest "/entrypoint.sh mong 23 hours ago Up 23 hours 27017/tcp
cpx.db
11e2123f7e2a centralpx/cpx.server:latest "/run.sh" 2 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp
cpx.server.live
4008c7772f63 centralpx/cpx-ftp "/bin/sh -c '/usr/sb 7 months ago Up 4 months 0.0.0.0:21->21/tcp, 0.0.0.0:30000-30009->30000-30009/tcp cpx.ftp
root@ip-172-31-6-252:~# docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
mongo latest 21e69f355287 8 days ago 366.4 MB
centralpx/cpx.server latest 894a3c5fce73 2 weeks ago 429 MB
centralpx/cpx-ftp latest e35ba5efa239 9 months ago 425.5 MB
root@ip-172-31-6-252:~# docker exec -it cpx.db /bin/bash
root@1f7bdd83dac0:/# mongod --shutdown
killing process with pid: 1
FATA[0026] Error response from daemon: Container 1f7bdd83dac037293d5086e86a3df7117b4b6eb2a3478d65848643eff9c4d568 is not running: Exited (0) Less than a second ago
root@ip-172-31-6-252:~#
root@ip-172-31-6-252:~# sudo docker run -it -p 28001:27017 --name cpx.db mongo:latest mongod --dbpath /data/db --repair
FATA[0000] Error response from daemon: Conflict. The name "cpx.db" is already in use by container 8b2a8c98971c. You have to delete (or rename) that container to be able to reuse that name.
上面的命令给出了冲突错误,所以我们删除了容器" cpx.db",下面是docker命令
root@ip-172-31-6-252:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1f7bdd83dac0 mongo:latest "/entrypoint.sh mong 23 hours ago Exited (0) 3 minutes ago cpx.db
11e2123f7e2a centralpx/cpx.server:latest "/run.sh" 2 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp cpx.server.live
4008c7772f63 centralpx/cpx-ftp "/bin/sh -c '/usr/sb 7 months ago Up 4 months 0.0.0.0:21->21/tcp, 0.0.0.0:30000-30009->30000-30009/tcp cpx.ftp
root@ip-172-31-6-252:~# docker rm cpx.db
cpx.db
root@ip-172-31-6-252:~# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
11e2123f7e2a centralpx/cpx.server:latest "/run.sh" 2 weeks ago Up 2 weeks 0.0.0.0:80->80/tcp cpx.server.live
4008c7772f63 centralpx/cpx-ftp "/bin/sh -c '/usr/sb 7 months ago Up 4 months 0.0.0.0:21->21/tcp, 0.0.0.0:30000-30009->30000-30009/tcp cpx.ftp
然后我们再次运行修复命令,因为冲突的容器被删除,下面是我们的命令和输出
root@ip-172-31-6-252:~# sudo docker run -it -p 28001:27017 --name cpx.db mongo:latest mongod --dbpath /data/db --repair
FATA[0000] Error response from daemon: Conflict. The name "cpx.db" is already in use by container 8b2a8c98971c. You have to delete (or rename) that container to be able to reuse that name.
守护进程再次出现冲突错误
我们再次删除了冲突消息中显示的ID的容器,如下所示,并且它没有显示此类ID。请参考下面的
root@ip-172-31-6-252:~# docker rm 8b2a8c98971c
Error response from daemon: no such id: 8b2a8c98971c
FATA[0000] Error: failed to remove one or more containers
所以,任何人都可以帮助我们删除这个不存在的容器,或者任何人都可以帮助我们摆脱这个问题。
正如您在实例化已停止的容器的命令中指出的那样,我试图纠正我在命令中的错误并运行此命令
sudo docker mongod --dbpath /data/db --repair
此命令给出错误
docker: 'mongod' is not a docker command. See 'docker --help'
如果我从命令中删除docker并运行此命令
sudo mongod --dbpath /data/db --repair
然后它给出了错误
sudo: mongod: command not found
我可以问,如果我的下面命令错误,因为我正在使用已停止的容器
root@ip-172-31-6-252:~# sudo docker run -it -p 28001:27017 --name cpx.db mongo:latest mongod --dbpath /data/db --repair
然后,如果我删除了容器并运行此命令,那么为什么这个命令没有执行并且出现冲突错误?
编辑: 根据最近的回复和解释,我已经更新了我的命令如下,只需检查一下,让我知道你方是否有任何更正
sudo docker run -it -p 28000:27017 --name cpx.db1 -v /home/ubuntu/data/cpx.db:/data/db -d mongo:latest mongod --dbpath /data/db --repair
我的新流程如下: 1)转到正在运行的容器并停止mongodb,这将自动停止正在运行的容器 2)运行更新的修复命令,如下所示
sudo docker run -it -p 28000:27017 --name cpx.db1 -v /home/ubuntu/data/cpx.db:/data/db -d mongo:latest mongod --dbpath /data/db --repair
此命令将创建一个名为" cpx.db1"的新容器。它将使用volume来挂载db并运行修复命令
3)我将删除这个新容器" cpx.db1"因为我想用旧的。
如果我错了,请告诉我
提前多多感谢。
谢谢
编辑: 我运行命令,我认为它工作,因为它没有给出任何错误,但它执行得非常快,所以我很困惑,我特此声明我的命令和输出供您参考
我输入了db container
docker exec -it cpx.db /bin/bash
我为mongodb运行shutdown命令
mongod --shutdown
这是输出(因为只有进程在容器中运行所以在杀死这一个进程后我才离开容器)
killing process with pid: 1
FATA[0015] Error response from daemon: Container bd910137a3957c79b304dbbbd221317c909e6779de01ed6f780857e3914c577c is not running: Exited (0) Less than a second ago
然后我运行修复命令,如下所示
sudo docker run -it -p 28000:27017 --name cpx.db1 -v /home/ubuntu/data/cpx.db:/data/db -d mongo:latest mongod --dbpath /data/db --repair
这是输出
d6b61222c7145f178e95974c87f95cb06fc8aa5c0c1adc929050ca172ab5f73f
然后我启动旧容器
docker start cpx.db
db开始
没有错误,但我很困惑,修复命令是否成功运行?你能查看我编辑过的帖子,让我知道你的观点。
答案 0 :(得分:3)
sudo docker run -it -p 28001:27017 --name cpx.db mongo:latest mongod --dbpath /data/db --repair
这是问题所在。
您实际上并没有重复使用同一个容器,而是 实现新的 。因此,冲突是因为你试图给新容器一个已经取名的名字。
您之前停止的容器仍然停止,并且您不使用此命令行。
此命令行还总结了您的问题:您不了解 images 和容器之间的区别。你试图操纵一个你应该实际操纵一个容器的图像(你停止的那个)。
据我所知,不可能重新启动一个容器,该容器具有与最初用作入口点的进程不同的进程(如果我错了,我希望其他人会写一个答案来解释如何这样做)。
但首先请注意,将整个数据库存储在容器中是一个糟糕的设计,因为您无法轻松访问它,并且在删除容器时会丢失它。
我如何启动您的容器并不清楚,但如果您不这样做,则应将数据库存储在mounted volume。
这样你的数据库是持久的,你可以删除或停止你的容器(甚至不是),并且仍然可以访问你的数据库(例如,甚至可以从主机访问)。
如果您使用卷,您可以停止容器,如果您需要相同的环境,可以从主机执行repair
操作 - 或者从另一个容器执行操作 - 然后重新启动第一个容器就足够了。
以下是卷使用的简短示例:
docker run -ti -P -v /host/path:/container/path image sh
这样您运行一个shell,主机中的/host/path
目录将被安装在容器内的/container/path
位置:另一个(来自主机或容器)的更改将出现在另一个
我提供的链接中有更多信息。
您似乎误以为图像和容器(容器用于运行进程),您确实需要了解其中的差异。
使用泊坞窗,您可以使用图像来实现容器。
您可以从同一图像中实现多个容器。 如果图像是烤盘,那么容器就是一块蛋糕。
您可能不必删除图像而是删除正在运行的容器(假设您遇到冲突,因为您尝试使用已经由其他正在运行的容器使用的端口来运行容器)。 / p>
列出容器:
docker ps -a
(-a
允许列出已停止的容器。)
获得容器的id
后,可以将其传递给docker stop
命令,然后使用docker rm
命令删除已停止的容器(您也可以使用容器的名称)
删除容器(docker rm
)和删除图像(docker rmi
)是两回事。
编辑:
1
sudo docker mongod --dbpath /data/db --repair
mongod
不是docker命令。 (run
,build
,ps
等是另一方面。)
2
sudo mongod --dbpath /data/db --repair
在这里,您甚至不使用泊坞窗。您只需尝试直接在主机上运行mongod
。
3
sudo docker run -it -p 28001:27017 --name cpx.db mongo:latest mongod --dbpath /data/db --repair
从手册:
docker run:
在新容器
中运行命令
因此,您不会重复使用已停止的容器,只需实例化一个新容器。
请注意,删除和 STOPPING 容器不一样。
假设您已经使用卷将数据库文件存储在主机中,只需:
停止容器。
启动一个名为的新容器以继续进行修复操作(仍然使用卷)。
此容器将在流程结束时退出,您可以将其删除。
从(1)重新启动容器,甚至启动一个新容器(如果要在这种情况下重复使用相同的名称,则需要删除旧容器,它是如果你想使用一个新的,最好这样做。
另请注意,如果您没有首先使用卷,则可能无法直接从主机文件系统访问数据库内容(它包含在您的容器中,因此它不是持久性的。)
如果是这样,最简单的方法可能是创建一个新的数据库,将存储在您的主机上,这样您就可以拥有持久且易于访问的数据。
如果您这样做,使用卷可以从容器中访问此数据库(主机上的数据库)。