Docker 概念很难理解?一文搞定 Docker 端口绑定


作者 | Dieter Jordens

译者 | 苏本如,责编 | 夕颜

出品 | 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容器呢?好吧,有多种选择。让我们探索一下。

1. 公开Docker的所有端口

docker container run -P -d nginx

这里的-P命令打开容器公开的每个端口。Docker会标识在Dockerfile中公开的每个端口,以及使用带有--expose 参数的Docker container build命令公开的每个端口。每个公开的端口都直接绑定在主机的一个“随机”端口上。

听起来不错,但是我们现在该怎么找到这些端口呢?别担心,我们会找到你心爱的端口的,甚至有多种方法可以帮助找到它们。接下来我将向你展示两种不同的方法:

  • Docker container port

  • netstat

我们的第一个选择是使用上面的Docker命令(docker container port)。你只需要键入上面的命令和容器UUID。你就会看到Docker容器的端口80绑定到了IP地址为0.0.0.0的主机端口32768上(如果你自己尝试执行该命令,则会看到一个不同的端口)。

docker container port *insert container_uuid*
80/tcp -> 0.0.0.0:32768

我们的另一个选择是使用netstat命令。要查找所有打开的端口,你可以执行以下命令。注意,Docker公开的端口混杂在其他端口中间,本例中第三行的那个端口就是我们要找的。

netstat -ntlp

      

使用netstat命令找到的所有打开的端口

2. 公开一个特定端口

             端口绑定示例:将Docker容器的80端口绑定到主机的8080端口上

公开所有Docker端口通常不是一个好主意,默认情况是根本不公开任何端口,这是为了安全起见。你不想公开一切,因为这样做根本没有任何好处,对吧?

如果你只想公开一个端口,请执行以下命令:

docker container run -p 8080:80 -d nginx

这个命令使得Nginx容器的80端口通过主机端口8080对外公开。现在,我们就可以通过多种方式连接到容器。例如,使用curl命令或通过一个浏览器。这是不是太棒了!

恭喜你,现在你终于明白了Docker端口绑定最重要的部分了!下面我将向你展示curl命令执行的结果:

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

如果你在浏览器中访问这个地址:0.0.0.0:8080,那么你的浏览器会向你展示如下的内容:

       

通过浏览器连接到0.0.0.0:8080的情况

还有一件事

默认情况下,Docker会将容器端口公开到IP地址0.0.0.0(这个地址和系统上的任何IP都匹配)上。你也可以告诉Docker要绑定哪个IP,这个IP可以是127.0.0.1,也可以是其他IP地址。

如果你想将Docker容器的80端口绑定到主机系统端口8000和IP地址127.0.0.1(也称为本地主机)上,你只需运行以下命令:

docker run -d -p 127.0.0.1:8000:80 nginx

结束语

对于使用Docker容器来说,Docker的端口绑定是一个很重要的概念。一开始可能因为需要配置传入连接(incoming connection)的问题,会让人困惑。但是Docker在提供所有需要的文档方面做得很出色。

不过,作为开发者,有些Docker的概念比其他概念更难理解。希望读完这篇文章后,你对Docker端口绑定已经很清楚了。如果没有,请在下面留言!

原文链接:

https://medium.com/better-programming/how-does-docker-port-binding-work-b089f23ca4c8

本文为CSDN翻译文章,转载请注明出处。

推荐阅读:一文了解 Spring Boot 服务监控,健康检查,线程信息,JVM堆信息,指标收集,运行情况监控!
现代编程语言大 PK,2020 年开发者关心的七大编程语言!
Java 堆内存是线程共享的!面试官:你确定吗?
比特币最主流,以太坊大跌,区块链技术“万金油”红利已结束 | 区块链开发者年度报告
超轻量级中文OCR,支持竖排文字识别、ncnn推理,总模型仅17M
用 3 个“鸽子”,告诉你闪电网络是怎样改变加密消息传递方式的!
真香,朕在看了!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/518847.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

阿里云高级技术专家张毅萍:我眼中的边缘计算

边缘计算是目前公认的大方向,越来越多的边缘计算应用将随着5G建设的步伐而兴起。阿里云边缘计算团队的目标是在行业爆发来临之前,完成基础计算资源平台的构建,为产业提供基于体验的计算调度能力,进而助推整个产业快速应用发展。那…

docker 安装 mysql和Navicat Premium 远程连接

文章目录1. 安装mysql2. Navicat Premium 远程连接1. 安装mysql # 通过搜索镜像 docker search mysql# 拉取mysql镜像 docker pull mysql# 查看拉取的mysql镜像 docker images#创建MySQL容器 docker run -di --name mymysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql# 查…

牛客网SQL篇刷题篇(1-2)

https://www.nowcoder.com/ta/sql

阿里PB级Kubernetes日志平台建设实践

阿里PB级Kubernetes日志平台建设实践 QCon是由InfoQ主办的综合性技术盛会,每年在伦敦、北京、纽约、圣保罗、上海、旧金山召开。有幸参加这次QCon10周年大会,作为分享嘉宾在刘宇老师的运维专场发表了《阿里PB级Kubernetes日志平台建设实践》&#xff0c…

果断拿下4000万美元D轮融资,Rancher发力中国本土化与国产化!

2020年3月17日,业界应用广泛的Kubernetes管理平台创建者Rancher Labs(以下简称Rancher)宣布完成新一轮4000万美元D轮融资。 本轮融资由Telstra Ventures领投,既有投资者Mayfield、Nexus Venture Partners、国富绿景创投&#xff0…

MySQL 8.0 技术详解

MySQL 8.0 简介 MySQL 5.7 到 8.0,Oracle 官方跳跃了 Major Version 版本号,随之而来的就是在 MySQL 8.0 上做了许多重大更新,在往企业级数据库的路上大步前行,全新 Data Dictionary 设计,支持 Atomic DDL&#xff0c…

解决:Error response from daemon: manifest for xxx:latest not found: manifest unknown...

在使用docker 拉去最新的镜像时,会提示如下错误: 这里错误的意思是docker需要我们指定下载镜像的版本号。 但是我们想下载最新的版本号,该如何得知最新的版本号呢? 我们可以登录docker hub:https://hub.docker.com/…

牛客网SQL篇刷题篇(3-10)

https://www.nowcoder.com/ta/sql 1.inner join 和left join (1)在表中存在至少一个匹配时,INNER JOIN 关键字返回行。 SELECT *** FROM A INNER JOIN B ON 条件 注释:INNER JOIN 与 JOIN 是相同的。 (2&#…

技术三板斧:关于技术规划、管理、架构的思考

阿里妹导读:实践需要理论的指导,理论从实践中来。作为技术工程师,要不断地从事件中反思经验、总结规律,才能避免踏入同一个坑,才能更高效地完成 KPI ,甚至是晋升。今天的文章来自阿里巴巴高级技术专家毕啸&…

让服务器突破性能极限 阿里云神龙论文入选计算机顶会ASPLOS

疫情肆虐,全球多个科技领域盛会宣布改为线上举办,计算机领域顶会 ASPLOS也不例外。 日前,ASPLOS 2020公布了计算机界最新科技成果,其中包括阿里云提交的名为《High-density Multi-tenant Bare-metal Cloud》的论文,该…

自动化日志收集及分析在支付宝 App 内的演进

背景 结合《蚂蚁金服面对亿级并发场景的组件体系设计》,我们能够通盘了解支付宝移动端基础组件体系的构建之路和背后的思考,本文基于服务端组建体系的大背景下,着重探讨“自动化日志手机与分析”在支付宝 App 内的演进之路。 支付宝移动端技…

牛客网SQL篇刷题篇(16-23)

https://www.nowcoder.com/ta/sql 1.SQL嵌套查询 https://www.cnblogs.com/glassysky/p/11559082.html (1)什么是嵌套查询 .   嵌套查询的意思是,一个查询语句(select-from-where)查询语句块可以嵌套在另外一个查询块的where子句中&…

突破性能极限——阿里云神龙最新ASPLOS论文解读

作者 | 阿里云神龙团队责编 | 徐威龙封图| CSDN 下载于视觉中国日前,ASPLOS 2020公布了计算机界最新科技成果,其中包括阿里云提交的名为《High-density Multi-tenant Bare-metal Cloud》的论文,该论文阐述了阿里云自研的神龙服务器架构如何解…

1分钟 搭建xxl-job任务调度中心

文章目录一、前提环境1. 安装java环境2. 安装maven打包环境3. docker安装mysql二、搭建xxl-job 服务端(源码)三、搭建xxl-job 服务端(docker)四、常见异常解决方案4.1. docker中mysql容器的ip怎样获取?4.2. xxl-job 连…

Schedulerx2.0分布式计算原理最佳实践

1. 前言 Schedulerx2.0的客户端提供分布式执行、多种任务类型、统一日志等框架,用户只要依赖schedulerx-worker这个jar包,通过schedulerx2.0提供的编程模型,简单几行代码就能实现一套高可靠可运维的分布式执行引擎。 这篇文章重点是介绍基于…

一个优秀的可定制化Flutter相册组件,看这一篇就够了

背景 在做图片、视频相关功能的时候,相册是一个绕不开的话题,因为大家基本都有从相册获取图片或者视频的需求。最直接的方式是调用系统相册接口,基本功能是满足的,一些高级功能就不行了,例如自定义UI、多选图片等。 …

牛客网SQL篇刷题篇(24-31)

https://www.nowcoder.com/ta/sql 1.NOT IN NOT IN运算符允许从结果集中排除特定值的列表。 2.sql子查询 https://www.cnblogs.com/fzxey/p/10896244.html#where%E5%AD%90%E6%9F%A5%E8%AF%A2 子查询就是将一个查询(子查询)的结果作为另一个查询&…

最近看Kafka源码,着实被它的客户端缓冲池技术优雅到了

作者 | 犀牛饲养员责编 | 徐威龙封图| CSDN 下载于视觉中国最近看kafka源码,着实被它的客户端缓冲池技术优雅到了。忍不住要写篇文章赞美一下(哈哈)。注:本文用到的源码来自kafka2.2.2版本。背景当我们应用程序调用kafka客户端 pr…

相信坚持的力量,我的程序员打怪升级之路

我是来自阿里云-云通信技术团队的玄照,2015年底进入阿里,刚渡过三年醇,正迈向五年陈的路上。个人兴趣爱好广泛,静的、动的,音乐、游戏、电影、运动都比较喜欢。 玄照,阿里云高级技术专家 程序生涯启航 第…

牛客网SQL篇刷题篇(32-37)

https://www.nowcoder.com/ta/sql 1.sql group_contact()、concat()、concat_ws函数 https://blog.csdn.net/qq_36250202/article/details/99308824 eg:将employees表的所有员工的last_name和first_name拼接起来作为Name,中间以一个空格区分 SELECT CONCAT(las…