Docker -it 命令与 Docker 图像或 Docker 容器相关
Docker -it command is related to a Docker image or Docker container
我是 Docker 的新手,正在尝试使用 101-tutorial docker image(https://github.com/dockersamples/101-tutorial)
了解 Docker
在本课中,他们试图解释当 2 个容器实例 运行 来自同一图像时,第一个容器创建的数据在默认情况下在第二个容器中不可用(除非我们是使用容器体积和安装等)。
第 1 点和第 2 点表明 ubuntu 容器是 运行ning 并且有一个名为 data.txt.
的文件
据我了解,docker -it
用于访问 docker 容器内的终端。 https://docs.docker.com/engine/reference/run/
但是我不明白第三点中使用的命令。为什么 docker run -it ubuntu ls /
命令 运行 在 Ubuntu 图像上而不是在使用容器 ID 的容器上?该命令是否仅用于显示图像内的内容,而不是使用 ls /
显示 docker 容器内的内容?
我预计第 3 点应该创建另一个容器实例然后 运行 ls /
但根据 docker ps
我看到只有一个 ubuntu 容器 运行宁在我的机器上。
正如 documentation for docker run
中所说:
Docker runs processes in isolated containers. A container is a process which runs on a host. The host may be local or remote. When an operator executes docker run, the container process that runs is isolated in that it has its own file system, its own networking, and its own isolated process tree separate from the host.
进程完成后,容器将关闭。
至于你的问题是否 "refers to an image or a container" - 你将图像作为参数来创建容器,然后 运行 在创建的容器中执行进程。
Docker 容器的生命周期是:
- docker 运行
imagename
-> 从镜像 imagename
创建容器 x
- docker exec
x
ls
-> 在运行ning容器中执行命令ls
x
- docker 停止
x
-> 停止容器(但在 docker container ls -a
中仍然可见)
- docker 启动
x
-> 重启容器 x
- docker 停止
x
-> 再次停止容器 x
- docker rm
x
-> 删除容器 x
(现在 ls -a
也不会显示)
Docker个容器之间是完全隔离的。当您使用镜像创建容器时,系统中的一小部分资源在命名空间和 cgroup 的帮助下被隔离,然后镜像中的文件被复制到这个隔离环境的资源中。
当您执行命令 docker run -it ubuntu ls /
时,它会创建一个新容器,运行 指定的命令 ls /
并为您提供 docker 容器的交互式 tty使用 -i
和 -t
标志。
在 运行 执行此过程并向您显示输出后,容器立即退出,因此 docker ps
的输出中没有任何显示。为了检查创建的容器,运行 docker ps --all
命令。
我看到问题是关于 docker run imagename
命令的。
TLDR:- You don't see the docker container because the docker container was created and started and then exited immediately. Why? Because it all comes down to the CMD
command that is given in the Dockerfile
which is used to build the docker image that you are trying to run (ubuntu
docker image in this case).
一些关于Docker和docker run
命令的背景:-
在你的情况下,当你 运行 docker run ubuntu
命令时,docker 容器被创建并启动,然后立即退出,所以你不会在 docker ps
中看到它容器列表,但您可以在 docker ps -a
命令结果中看到它,状态为 exited
。
这是因为容器旨在 运行 特定任务或流程,例如托管 Web 服务器或应用程序服务器或数据库的实例,或者只是执行某种计算或分析。
一旦任务完成,容器就会退出。容器只有在其内部的进程处于活动状态时才会存在。如果容器内的 WebService 停止或崩溃,则容器退出。
那么谁定义容器内的进程是什么运行?
如果我们查看 docker 文件中流行的 docker 图像,例如 nginx,我们会看到一条名为 CMD
的指令,它代表定义程序的命令 运行 启动时在容器内。
对于nginx镜像是nginx命令,对于mysql镜像是mysqld命令。
您之前尝试做的是 运行 一个带有 Ubuntu 图像的容器,如果我们看到该图像的 docker 文件 () 我们将看到它使用 bash
作为 CMD
行中的默认命令。现在 bash
并不是真正像网络服务器或数据库服务器那样的进程。它是一个 shell ,用于侦听来自终端的输入,如果找不到终端,它就会退出。因此,当您 运行 之前的图像然后 Docker 从图像创建一个容器并启动 bash 程序。默认情况下,docker 不会将终端附加到容器,当它是 运行 时,因此 bash 程序找不到终端并退出。由于创建容器时启动的进程已完成,因此容器也会退出。
那么我们如何指定不同的命令来启动容器呢?
一个选项是将命令附加到 docker 运行 命令,这样它会覆盖图像中指定的默认命令。例如 docker run ubuntu sleep 5
将 sleep 5 命令作为添加的选项。这样当容器启动时它 运行s 睡眠程序等待 5 秒然后退出。但是我们如何使这种变化永久化。假设我们希望图像在启动时始终 运行 睡眠命令。然后我们应该从基础 ubuntu 图像创建我们自己的图像并指定一个新命令。
Docker文件,
使用CMD
指令,
FROM Ubuntu
CMD sleep 5
或者同时使用Entrypoint
和CMD
指令哪个更好,
FROM Ubuntu
ENTRYPOINT ["sleep"]
CMD ["5"]
所以我们现在可以使用 docker build
命令构建新图像并将其命名为 ubuntu-sleeper 或类似名称。我们现在可以简单地 运行 docker run ubuntu-sleeper
命令并得到相同的结果,它总是休眠 5 秒然后退出
我是 Docker 的新手,正在尝试使用 101-tutorial docker image(https://github.com/dockersamples/101-tutorial)
了解 Docker在本课中,他们试图解释当 2 个容器实例 运行 来自同一图像时,第一个容器创建的数据在默认情况下在第二个容器中不可用(除非我们是使用容器体积和安装等)。
第 1 点和第 2 点表明 ubuntu 容器是 运行ning 并且有一个名为 data.txt.
的文件据我了解,docker -it
用于访问 docker 容器内的终端。 https://docs.docker.com/engine/reference/run/
但是我不明白第三点中使用的命令。为什么 docker run -it ubuntu ls /
命令 运行 在 Ubuntu 图像上而不是在使用容器 ID 的容器上?该命令是否仅用于显示图像内的内容,而不是使用 ls /
显示 docker 容器内的内容?
我预计第 3 点应该创建另一个容器实例然后 运行 ls /
但根据 docker ps
我看到只有一个 ubuntu 容器 运行宁在我的机器上。
正如 documentation for docker run
中所说:
Docker runs processes in isolated containers. A container is a process which runs on a host. The host may be local or remote. When an operator executes docker run, the container process that runs is isolated in that it has its own file system, its own networking, and its own isolated process tree separate from the host.
进程完成后,容器将关闭。
至于你的问题是否 "refers to an image or a container" - 你将图像作为参数来创建容器,然后 运行 在创建的容器中执行进程。
Docker 容器的生命周期是:
- docker 运行
imagename
-> 从镜像imagename
创建容器 - docker exec
x
ls
-> 在运行ning容器中执行命令ls
x
- docker 停止
x
-> 停止容器(但在docker container ls -a
中仍然可见) - docker 启动
x
-> 重启容器x
- docker 停止
x
-> 再次停止容器x
- docker rm
x
-> 删除容器x
(现在ls -a
也不会显示)
x
Docker个容器之间是完全隔离的。当您使用镜像创建容器时,系统中的一小部分资源在命名空间和 cgroup 的帮助下被隔离,然后镜像中的文件被复制到这个隔离环境的资源中。
当您执行命令 docker run -it ubuntu ls /
时,它会创建一个新容器,运行 指定的命令 ls /
并为您提供 docker 容器的交互式 tty使用 -i
和 -t
标志。
在 运行 执行此过程并向您显示输出后,容器立即退出,因此 docker ps
的输出中没有任何显示。为了检查创建的容器,运行 docker ps --all
命令。
我看到问题是关于 docker run imagename
命令的。
TLDR:- You don't see the docker container because the docker container was created and started and then exited immediately. Why? Because it all comes down to the
CMD
command that is given in theDockerfile
which is used to build the docker image that you are trying to run (ubuntu
docker image in this case).
一些关于Docker和docker run
命令的背景:-
在你的情况下,当你 运行 docker run ubuntu
命令时,docker 容器被创建并启动,然后立即退出,所以你不会在 docker ps
中看到它容器列表,但您可以在 docker ps -a
命令结果中看到它,状态为 exited
。
这是因为容器旨在 运行 特定任务或流程,例如托管 Web 服务器或应用程序服务器或数据库的实例,或者只是执行某种计算或分析。
一旦任务完成,容器就会退出。容器只有在其内部的进程处于活动状态时才会存在。如果容器内的 WebService 停止或崩溃,则容器退出。
那么谁定义容器内的进程是什么运行?
如果我们查看 docker 文件中流行的 docker 图像,例如 nginx,我们会看到一条名为 CMD
的指令,它代表定义程序的命令 运行 启动时在容器内。
对于nginx镜像是nginx命令,对于mysql镜像是mysqld命令。
您之前尝试做的是 运行 一个带有 Ubuntu 图像的容器,如果我们看到该图像的 docker 文件 (bash
作为 CMD
行中的默认命令。现在 bash
并不是真正像网络服务器或数据库服务器那样的进程。它是一个 shell ,用于侦听来自终端的输入,如果找不到终端,它就会退出。因此,当您 运行 之前的图像然后 Docker 从图像创建一个容器并启动 bash 程序。默认情况下,docker 不会将终端附加到容器,当它是 运行 时,因此 bash 程序找不到终端并退出。由于创建容器时启动的进程已完成,因此容器也会退出。
那么我们如何指定不同的命令来启动容器呢?
一个选项是将命令附加到 docker 运行 命令,这样它会覆盖图像中指定的默认命令。例如 docker run ubuntu sleep 5
将 sleep 5 命令作为添加的选项。这样当容器启动时它 运行s 睡眠程序等待 5 秒然后退出。但是我们如何使这种变化永久化。假设我们希望图像在启动时始终 运行 睡眠命令。然后我们应该从基础 ubuntu 图像创建我们自己的图像并指定一个新命令。
Docker文件,
使用CMD
指令,
FROM Ubuntu
CMD sleep 5
或者同时使用Entrypoint
和CMD
指令哪个更好,
FROM Ubuntu
ENTRYPOINT ["sleep"]
CMD ["5"]
所以我们现在可以使用 docker build
命令构建新图像并将其命名为 ubuntu-sleeper 或类似名称。我们现在可以简单地 运行 docker run ubuntu-sleeper
命令并得到相同的结果,它总是休眠 5 秒然后退出