0
点赞
收藏
分享

微信扫一扫

docker 被映射的端口可以相同吗

Docker 被映射的端口可以相同吗?

在使用 Docker 进行应用程序容器化时,我们通常需要将容器内部的端口映射到主机上,以实现容器与外部环境的通信。这个过程中,一个常见的问题是,Docker 容器的被映射的端口能否相同?

答案是:不能。在同一个主机上,同一端口只能被一个容器绑定。

让我们用一个示例来说明这个问题。

假设我们有一个简单的 Flask 应用程序,它监听在容器内的5000端口:

from flask import Flask
app = Flask(__name__)

@app.route('/')
def hello():
    return "Hello, Docker!"

if __name__ == '__main__':
    app.run(host='0.0.0.0', port=5000)

我们将这个应用程序容器化,并将容器的5000端口映射到主机的5000端口:

docker run -p 5000:5000 flask-app

现在,我们可以通过访问 http://localhost:5000 来访问容器中的应用程序。

如果我们尝试再次运行一个同样映射到主机的容器,并将其端口设置为5000,Docker 将会报错:

docker run -p 5000:5000 another-flask-app

错误信息如下所示:

docker: Error response from daemon: driver failed programming external connectivity on endpoint amazing_shirley (9c107b3aef4fd2d9d01230df1a0a6c7c3c5eaa7b08a5d9e0f4ef0e7b6b01f5f6): Bind for 0.0.0.0:5000 failed: port is already allocated

这是因为主机的5000端口已经被第一个容器占用了。

要解决这个问题,我们可以选择一个不同的端口来映射到主机上。例如,我们可以将第二个容器的端口映射为5001:

docker run -p 5001:5000 another-flask-app

现在,我们可以通过访问 http://localhost:5001 来访问第二个容器中的应用程序。

通过这个示例,我们可以得出结论:在同一主机上,Docker 容器的被映射的端口不能相同。

同时,我们还可以使用以下命令来查看主机上已经被占用的端口:

sudo lsof -i :5000

这个命令将会返回占用5000端口的进程和应用程序的详细信息。

总结:在 Docker 中,被映射的端口不能相同。为了避免端口冲突,我们应该为每个容器选择不同的端口进行映射。

举报

相关推荐

0 条评论