Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Docker:123-125/tcp和0.0.0.0:123-125->;之间Docker ps输出的区别是什么;123-125/tcp符号?_Docker_Containers_Port - Fatal编程技术网

Docker:123-125/tcp和0.0.0.0:123-125->;之间Docker ps输出的区别是什么;123-125/tcp符号?

Docker:123-125/tcp和0.0.0.0:123-125->;之间Docker ps输出的区别是什么;123-125/tcp符号?,docker,containers,port,Docker,Containers,Port,使用standart命令启动docker容器后 docker run -p 123-125:123-125 -it <container_name> "bin/bash" docker run-p 123-125:123-125-it“bin/bash” 。。。用CTRL-P+CTRL-Q退出时,我注意到我突然在docker ps的端口列中看到两个块: 100-102/tcp,0.0.0.0:123-125:123-125/tcp 我从来没有为我的容器设置1

使用standart命令启动docker容器后

docker run -p 123-125:123-125 -it <container_name> "bin/bash" 
docker run-p 123-125:123-125-it“bin/bash”
。。。用CTRL-P+CTRL-Q退出时,我注意到我突然在docker ps的端口列中看到两个块:

100-102/tcp,0.0.0.0:123-125:123-125/tcp

我从来没有为我的容器设置100-102个端口

我不能得到两样东西:

  • docker ps输出中的这两个符号100-102/tcp和0.0.0.0:123-125:123-125/tcp之间有什么区别
  • 如果我的-p参数只是清单123-125:123-125/tcp,为什么我在docker ps中有额外的100-102/tcp输出

  • 第一个参数是容器公开的端口。它们可能暴露在用于创建图像的Dockerfile中。它们只是一种规范/文档,告诉您应该发布这些端口

    第二个参数是绑定到主机系统的公开端口:这些端口链接到来自主机的端口,并且它们对来自任何IP地址(0.0.0.0)的外部连接开放。这些端口是发布的(因此
    -p

    如果您使用
    -p
    选项运行容器,它将发布/绑定所有公开的端口(或端口范围,在您的情况下)。使用
    -p
    发布端口仅公开和绑定使用该选项指定的端口。这就是你想要的

    下面是一个更清楚的例子:

  • 我创建了一个
    Dockerfile
    。在其中,我公开了端口范围3000-3002
  • 我构建映像:
    docker build-t测试。
  • 我运行一个容器:
    docker运行测试
  • 以下是docker ps的结果:

    CONTAINER ID   IMAGE     COMMAND                 [...] PORTS           NAMES
    59b8a12a8d70   testing   "docker-entrypoint.s…"  [...] 3000-3002/tcp   amazing_gagarin
    
    CONTAINER ID   IMAGE     COMMAND                 [...] PORTS                                             NAMES
    d55dd52d94a3   testing   "docker-entrypoint.s…"  [...] 3000-3002/tcp, 0.0.0.0:3005-3007->3005-3007/tcp   agitated_boyd
    
    如您所见,我没有发布任何端口,但我可以在
    docker ps

  • 我尝试连接到
    localhost:3000
    :没有任何功能->端口未发布

  • 我启动另一个带有
    docker run-p 3005-3007:3005-3007测试的容器

  • 以下是docker ps的结果:

    CONTAINER ID   IMAGE     COMMAND                 [...] PORTS           NAMES
    59b8a12a8d70   testing   "docker-entrypoint.s…"  [...] 3000-3002/tcp   amazing_gagarin
    
    CONTAINER ID   IMAGE     COMMAND                 [...] PORTS                                             NAMES
    d55dd52d94a3   testing   "docker-entrypoint.s…"  [...] 3000-3002/tcp, 0.0.0.0:3005-3007->3005-3007/tcp   agitated_boyd
    
  • 我尝试连接到
    localhost:3005
    :它可以工作!->我发布了我的端口,将它们绑定到我的主机端口,这样我就可以连接到它们(还因为我的应用程序确实侦听3000-3007之间的端口)

  • 我尝试连接到
    localhost:3000
    :它仍然不工作->端口范围3000-3002仍然未发布,但仍然标记为已公开,告诉我可能要使用此范围

  • 有关
    -p
    选项的格式,请参见:
    格式:ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort | containerPort

  • 0.0.0.0
    指定可在主机上访问容器的IP
    0.0.0.0
    是默认值,表示所有IP地址(即,连接到主机的每个人都可以通过公开的端口123-125访问您的容器)。另一方面,
    127.0.0.1
    意味着您只能从localhost访问容器

  • 我假设附加端口可以由您的基本映像(在Dockerfile中的
    中定义)公开

  • 顺便说一句,我不确定带三个冒号的语法
    0.0.0.0:123-125:123:125
    是否正确。

    发布选项(-p)没有遵循任何允许的格式:

    ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort |集装箱港口

    给定的run命令有3个冒号,但第一部分不是IP。所以,我相信Docker没有很好地接受你的指挥

    如果要将容器端口123..125匹配到相应的主机端口SM,正确的run命令是:

    docker run -p 123-125:123-125 -it <container_name> "bin/bash" 
    
    docker run-p 123-125:123-125-it“bin/bash”
    
    我不确定为什么
    100:102/tcp
    映射会产生。尽管图像的基本图像可能在
    EXPOSE
    中建议使用
    102
    端口,但除非您使用
    docker run-p 100:102
    明确指定,否则不应将其公开。我假设此映射可能是由
    -p
    选项中不正确的三个冒号语法意外导致的。为了清楚起见,在docker运行示例中,它应该是
    ,而不是
    。当您在docker文件中公开时,即使未发布/绑定,也会显示公开的端口。查看我的答案@user14967413我非常确定,他的
    docker ps
    的实际结果是
    100-102/tcp
    ,并且他也使用
    -p 123-125:123-125
    运行他的容器,这是由于他问题中的错误键入。如果不是,他将有一个完全不同的错误,他会询问这个错误,并且无法连接到他的容器。我在回答他的问题:公开和出版有什么区别?那么你知道公开和出版有什么区别吗@Miamibeacht其语法正确:请参见问题标题。这只是问题正文中的一个输入错误。费里亚是对的。但是-接得好,查理!它们的语法是正确的:参见问题标题。这只是问题正文中的一个错误输入。很好的解释!谢谢你,费里亚!