问题标签 [docker-run]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4491 浏览

docker - docker run --name vs --hostname 作为命令行选项的区别(ping:错误地址)

--name1.docker命令和--hostnamein有什么区别run

2.为什么foo不能通过bar它的hostname=到达barhost

创建网络和连接到它的两个容器:

barhostfoo终端ping

给出结果:

错误地址“barhost”

但 pingbarfoo

成功:

PING bar (172.31.0.2):56 个数据字节 64 个字节来自 172.31.0.2:seq=0 ttl=64 time=0.260 ms 64 个字节来自 172.31.0.2:seq=1 ttl=64 time=0.155 ms

--- bar ping 统计 --- 2 个数据包传输,2 个数据包接收,0% 丢包

3.如果你不能从它那里达到,bar为什么可以从内部做到这一点?hostnamefoobar

barhostbar终端ping

成功:

PING barhost (172.31.0.2):56 个数据字节 64 个字节来自 172.31.0.2:seq=0 ttl=64 时间=0.135 ms 64 个字节来自 172.31.0.2:seq=1 ttl=64 时间=0.127 ms

--- barhost ping 统计 --- 发送 2 个数据包,接收 2 个数据包,0% 数据包丢失

0 投票
1 回答
176 浏览

docker - Docker 命名空间、docker on virtualbox、镜像环境

假设我正在使用一组 CLI docker run 命令来创建容器、网络(在我的例子中为桥接类型)的整个环境并将容器连接到特定网络。

直到我只想在一台机器上拥有一个这样的环境之前,一切都运行良好。

但是,如果我想在同一台机器上拥有与我刚刚创建的环境相似的环境,但出于不同的目的(测试),我会遇到名称冲突问题,因为我无法创建和启动容器和网络同名。

到目前为止,我尝试以与第一个环境相同的方式启动第二个环境,但为所有容器和网络名称添加前缀。
这行得通,但有一个缺陷:在运行对 URI 的所有请求的应用程序中,由于它们有一个结构,所以它们被破坏了

并且应用程序无法访问<prefix-container-name>

我想要实现的是在与我可以用来执行应用程序测试等的第二个环境相同的机器上运行第一个环境的精确副本。

  1. 在 Docker 中是否有命名空间的概念或类似的概念?
    我可以在所有用于创建环境的 docker run etc 命令之前使用的命令,并且只有两个 bash 脚本,它们仅在开头的命名空间命令不同?
  2. 可以使用虚拟机,即 Oracle Virtualbox 来解决我的问题吗?为第二个环境创建虚拟机?这不是矫枉过正吗,会增加额外的麻烦吗?
  3. 也许有一种--hostnamefordocker run命令允许使用此名称从其他容器访问容器?Unlucky--hostname只能通过这个名称从容器本身访问容器,而不是从任何其他容器。也许有一个选项或命令可以创建别名、虚拟主机或任何我可以放入应用程序 URI 的神奇通用名称,<scheme>://<magic-name>:<port-number>因此只要magic-name在环境网络中可用,创建具有不同容器和网络名称的第二个环境就不会出现问题
  4. 我需要环境的精确副本是因为我想运行测试并检查它们是否也在依赖级别上失败,我认为这是来自持续集成过程的非常简单的场景。对于我想要实现的目标,是否有任何专门的开源解决方案?我不使用 docker composer,而是使用带有所有 docker cli 命令的 bash 脚本来启动和运行整个环境。

感谢您的帮助。

0 投票
1 回答
5468 浏览

docker - 在 macOS 和 Windows 上替代 --network 主机的 Docker

我有两个码头集装箱:

  • 数据库
  • 使用数据库的应用程序

我像这样运行我的数据库容器:

docker run --name my-db -p 127.0.0.1:3306:3306 my-db-image

我的应用容器是这样的:

docker run --name my-app --network host -it my-app-image

这在 Linux 上运行良好。我可以从主机系统和应用程序容器访问数据库。完美的。

但是--network host不适用于 Mac 和 Windows:

主机网络驱动程序仅适用于 Linux 主机,不支持 Docker for Mac、Docker for Windows 或 Docker EE for Windows Server。

(来源:https ://docs.docker.com/network/host/ )

我仍然可以127.0.0.1:3306从主主机访问数据库,但我无法从应用程序容器访问它。

我该如何解决这个问题?如何让应用程序容器连接到数据库(并使用 继续从主主机访问数据库127.0.0.1:3306)?

我试过使用host.docker.internalgateway.docker.internal但它不起作用。

我也尝试--network my-network在创建后使用启动两个容器my-networkdocker network create my-network但它不起作用。

我不知道如何解决这个问题。

0 投票
2 回答
33 浏览

docker - 如何找到从 SHA1 中提取的图像?

当我们运行 docker 容器时,如果相关图像不在本地 repo 中,它正在被下载,而是按特定顺序下载,即父图像等。
如果我对图像一无所知,我怎么能找到基于哪些图像基于拉出的图层,如docker run? 输出仅显示任何上的 SHA1docker run etc

0 投票
3 回答
41 浏览

docker - 容器继续运行是否有最低条件?

为什么入口点指定在后台运行命令时容器退出?例如,如果我运行docker run -d ubuntu bash -c "sleep 12000&"容器退出。如果我运行docker run -d ubuntu bash -c "sleep 12000"容器继续运行。
后台的进程是否不足以保持容器运行?
为什么sleep在后台或前台运行会影响这一点?

0 投票
1 回答
963 浏览

docker - Docker 运行时环境变量不可用

我需要在运行 docker run 命令时在运行时传递一个变量,并且要在容器内读取该变量。

这是我使用的 docker run 命令

但变量 URL 在容器内不可用。我的 Dockerfile 如下

在容器内,out.log 仅显示以下输出

网址是

我错过了什么?

0 投票
1 回答
1064 浏览

docker - 当入口点在 docker run 上回显时,为什么未设置 env 变量?

为什么作为入口点运行的命令看不到环境变量?
例子:

但是当我启动 shell 时,环境变量就在那里:

为什么在使用echoas 入口点的第一种情况下它没有找到 env 变量集?

0 投票
1 回答
323 浏览

docker - 是否有在 dockerfile 中声明多个 CMD 的真实用例?

根据文档

一个 Dockerfile 中只能有一个 CMD 指令。如果您列出多个 CMD,则只有最后一个 CMD 才会生效。

为什么要列出多CMD条指令?我真的不明白这个指导方针。这是否像“黑客”,因为他们没有/不能对 docker 文件进行验证以抱怨定义了超过 1 个 CMD 指令,或者这是一个真实的用例?即在某些情况下,我们可以定义超过 1 个 CMD,但如果只执行最后一个,我们就可以了(那么为什么之前定义了)?
有人可以对此有所了解吗?

0 投票
1 回答
1329 浏览

docker - Docker 运行失败错误“额外参数 XXX”

我正在尝试运行我的本地 docker 文件/docker compose 设置。

我收到以下错误。

当我查看日志时

当我尝试启动或运行它时

Docker ps-a 显示

码头工人组成 --build

Docker 检查显示以下路径和参数

我的 docker compose 文件看起来像这样

我的 docker 文件看起来像这样

0 投票
1 回答
120 浏览

docker - 如何docker run,支持Ctrl+C,不结合stderr

我有一堆在 docker 容器中运行的脚本。它们由脚本调用,并不意味着是交互式的。外部脚本有时在终端中运行,有时则不在(如 CI 中)。

我想支持用户使用Ctrl+杀死脚本C,所以我目前通过-t( --tty)。但我发现这个选项结合了stdoutstderr。我不想要那个。

有没有办法我可以支持Ctrl+C并且仍然有stderr