Docker 概念很难理解?一文搞定 Docker 端口绑定
译者 | 苏本如,责编 | 夕颜
出品 |
CSDN(ID:CSDNnews)
以下为译文:
作为初级开发人员的你,是不是参加过这样的面试,在面试中面试官希望你准确地回答Docker的工作原理?现今的面试官们希望应聘者能够深入了解8项、10项、甚至更多的技术。其实这有点疯狂。在大学或其他学校里,他们很可能根本不会教你任何关于Docker的知识。然而,如果你真的能够深入了解Docker,那么你就可以从一大群应聘者中脱颖而出。
当你开始使用Docker时,首先会遇到的问题之一是你无法连接到Docker容器。这篇文章将详细解释这个问题为什么会发生,同时我也会解释端口绑定(port binding)是如何工作的。
即使你是一个经验丰富的开发人员,你也应该了解什么是端口绑定。否则,你在面试时会显得很傻。如果你还没有了解,那么现在就给自己拿杯咖啡。我一定会让你把你想知道的关于这个话题的一切内容都记在你的脑子里,只需要花费你六分钟!
让我们从一个Nginx Docker容器开始吧!
如果你对Docker有一点点了解的话,你就无需担心了。因为我会尽量详细地解释关于Docker的一切。首先,我需要确保你理解Docker容器和Docker镜像之间的区别。
你可以把Docker镜像看作一个文件,它包含了运行一个特定程序的所有依赖项和配置。为什么要这样做?因为Docker想要解决的首个问题就是系统/程序安装的噩梦。
我们都经历过在Windows、Mac或Linux系统上安装程序的情况。然而令人沮丧的是,系统每次都会提示你缺少另一个程序。就像下面系统提示你要不要安装的那样,我猜你每次遇到这个问题都会选择安装,对吧?
你也要安装这个程序吗?…
最终你会发现,你不但需要安装很多不同的程序,而且经常还需要配置系统变量等等。在最坏的情况下,这些会把你的系统弄得一团糟。
你一定不希望你组织里的每个人都经历这种麻烦,对吗?
Docker镜像可以帮助你解决这个麻烦,因为一个Docker镜像里包含了安装程序所需的所有内容。而Docker容器则是Docker镜像的运行实例。
Docker为你解决了安装的噩梦。而Docker容器包含了它运行时所需要的一切,不多也不少。你可以在Windows、Linux或Mac上运行一个Docker容器。基本上,只要你将Docker安装好,你就可以在任何地方运行它。
关于Docker的优势已经讲得够多了。接下来,我们要做的是让一个Docker容器开始运行起来。
让我们从一个Nginx Docker容器开始。Nginx是一个运行在端口80上的web服务器。下面,我将使用Nginx Docker镜像以分离模式(后台运行)启动一个Docker容器,命令如下:
docker container run -d nginx
这个命令将会生成一个新的Docker容器,你会看到这个新的Docker容器的UUID。如果你不知道UUID是什么,那么请认真阅读我写的这篇文章中的所有内容。使用Docker容器的ps命令(docker ps),你将看到这个Docker容器处于活跃状态:
现在,如果你试图使用curl命令或使用一个浏览器直接连接到这个Docker容器,你会遇到连接失败的错误(见下面)。因为你不能直接连接到一个Docker容器,原因是什么呢?Docker的文档只是解释说端口80易受攻击…这个解释有点不明不白。但是别担心,我会在下一节详细给出解释!
curl -I 127.0.0.1:80
curl: (7) Failed to connect to 127.0.0.1 port 80: Connection refused
为什么我不能直接连接到一个Docker容器?
事实上,Docker容器可以在不作任何配置的情况下连接到外部世界。这一点太好了,因为这样我们就不必改变我们以前编程过的任何东西。
但是默认地,外部世界无法直接连接到一个Docker容器。
说到这里,我想你应该明白了,这一点和我们预想的不同。那么你应该如何连接到你的Docker容器呢?好吧,有多种选择。让我们探索一下。
docker container run -P -d nginx
-
Docker container port -
netstat
docker container port *insert container_uuid*
80/tcp -> 0.0.0.0:32768
netstat -ntlp
docker container run -p 8080:80 -d nginx
curl -I 0.0.0.0:8080HTTP/1.1 200 OK
Server: nginx/1.17.9
Date: Sun, 08 Mar 2020 11:38:47 GMT
Content-Type: text/html
Content-Length: 612
Last-Modified: Tue, 03 Mar 2020 14:32:47 GMT
Connection: keep-alive
ETag: "5e5e6a8f-264"
Accept-Ranges: bytes
docker run -d -p 127.0.0.1:8000:80 nginx
结束语
原文链接:
https://medium.com/better-programming/how-does-docker-port-binding-work-b089f23ca4c8
☞
☞