当我运行或启动Docker容器时,它不会保持运行状态。Docker start只会返回我给它的任何容器的名称,但实际上不会做任何事情。Docker run(例如$ docker run -p 8080:80 --name hello -d hello-world)将创建它,但它将立即退出。
如果我在其中一个之后运行docker ps,它将不会显示任何当前运行的列表。如果我运行docker ps -a,它将显示我所有的容器,并显示我刚刚尝试运行的容器,几秒钟前退出。
这是常见的吗?我如何让我的容器保持运行?我正在学习如何使用Docker,这是最糟糕的经历之一。谢谢你的任何帮助或建议
7条答案
按热度按时间kse8i1jr1#
Docker容器在其主进程完成时退出。
hello-world
主进程只是打印一些文本并退出,所以container也退出。你可以直接运行这个命令来查看它的文本:
如果你想要一个运行的容器,也许你可以尝试nginx demo:
然后您可以使用您的web浏览器访问
http://localhost:8080
。hwamh0ep2#
要知道你的容器有什么问题,可以使用(docker logs(你的容器名))命令。
然后你就能找出你的容器出了什么问题
mtb9vblg3#
Docker容器通常用于在隔离环境中运行应用程序/进程。
当您运行hello-world镜像时,它会创建一个容器,该容器的唯一目的是使用标准输出打印出名称。这是唯一运行的进程,容器完成了它的工作。这就是为什么你什么也看不到,当做
docker ps
。为了保持容器运行,您需要在该容器中有一个将运行的进程(例如:服务器、数据库、应用程序等)
尝试从mysql镜像中创建一个容器,然后检查正在运行的容器。
muk1a3rh4#
在命令中,指定
-d
标志(也称为detach),表示Run container in background and print container ID
(来自Docker docs)。在这里查看更多关于此的讨论:Docker container will automatically stop after "docker run -d"docker run -p 8080:80 --name hello -d hello-world
如果在没有
-d
标志的情况下运行它,它应该在前台运行并将输出发送到终端docker run -p 8080:80 --name hello hello-world
在
docker ps -a
中看不到它的运行,因为该容器只是执行hello-world脚本并退出。如果容器启动了一个长时间运行的进程,那么你可以在docker ps -a
中找到它。要验证这一点,您可以尝试运行nginx演示容器(例如nginx-hello),提供“Hello World”/演示页面。igsr9ssn5#
这是常见的吗?我如何让我的容器保持运行?
当你启动一个Docker容器时会发生什么?
默认情况下,它执行命令/Dockerfile镜像中指定的入口点。通常,命令或入口点是位于映像中脚本或程序。
当脚本/程序退出时,容器也会退出。仅此而已
为了保持容器的活动,脚本/程序必须保持运行。
你启动一个hello图像容器,一个“hello”容器说“hello”并退出。这可能是一个简单的脚本:
所以这是预期完成并退出容器。运行数据库或Web服务器,您将看到不同的行为。脚本/程序继续运行...而你却不去阻止所以当你不停止的时候容器也会一直运行。
要进行实验,您可以使用一个无限命令运行
hello-world
容器:您将看到容器保持运行。
xa9qqrwz6#
当我尝试启动一个mysql容器时,我遇到了类似的问题。我将数据定向到目录
mysql_data
,但当我试图启动容器时,它会立即退出。在检查了日志后,我发现这是因为我用来写入数据的目录不是空的。我创建了一个新的空目录,容器启动并保持正常运行。这是我的命令
docker run --name container-name -e MYSQL_ROOT_PASSWORD=my-pword -v /Users/user_name/user_dir/mysql_data:/var/lib/mysql -p 3306:3306 -d mysql
docker start container-name
启动容器,然后使用docker ps
oo7oh9g97#
在我的例子中,在设置PostgreSQL容器时,我忘记添加POSTGRES_PASSWORD,这是必须的。查看psql镜像描述