Dockerfile的EXPOSE

文章目录

  • 环境
  • 总结
  • 测试
    • 使用EXPOSE
      • 测试1:不做端口映射
      • 测试2:-p 8080:80
      • 测试3:-P
      • 测试4:--network=host
    • 不使用EXPOSE
  • 参考

环境

  • RHEL 9.3
  • Docker Community 24.0.7

总结

如果懒得看测试的详细信息,可以直接看结果:

docker run 选项在Dockerfile里 EXPOSE 80在Dockerfile里不 EXPOSE 80备注
在容器外无法访问容器的80端口在容器外无法访问容器的80端口
-p 8080:8080808080显式指定映射端口
-P随机端口随机端口随机映射端口
--network=host8080直接使用容器的端口

所以,EXPOSE并不会真正开放端口,它更像是一个说明文档,由image的开发者声明image所监听的端口,使用者以此为依据,在启动容器时,可以以不同的策略来开放端口。

测试

使用EXPOSE

创建 Dockerfile 文件如下:

FROM nginx:alpineEXPOSE 80

构建:

docker build -t kai0107_1 .

测试1:不做端口映射

启动容器:

docker run kai0107_1

查看容器:

➜  ~ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS     NAMES
430b0c2bee65   kai0107_1   "/docker-entrypoint.…"   5 seconds ago   Up 5 seconds   80/tcp    recursing_noyce

检查该容器:

➜  ~ docker container inspect 430b0c2bee65 | grep -i3 port"Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0
--"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "",
--"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"80/tcp": {}},"Tty": false,
--"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"80/tcp": null},"SandboxKey": "/var/run/docker/netns/c762f4dc271b",

注:可以用 -f 选项指定输出格式,参见 https://docs.docker.com/engine/reference/commandline/inspect

打开浏览器,访问 http://localhost:80 ,如下:

在这里插入图片描述

可见,在容器之外,无法访问80端口。

测试2:-p 8080:80

启动容器:

docker run -p 8080:80 kai0107_1

查看容器:

➜  ~ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED              STATUS              PORTS                                   NAMES
dd9ea9e98b4b   kai0107_1   "/docker-entrypoint.…"   About a minute ago   Up About a minute   0.0.0.0:8080->80/tcp, :::8080->80/tcp   naughty_almeida

注: 0.0.0.0:: 都是代表匹配所有IP地址。前者是IPv4的写法,后者是IPv6的写法。

检查该容器:

➜  ~ docker container inspect dd9ea9e98b4b | grep -i3 port"Config": {}},"NetworkMode": "default","PortBindings": {"80/tcp": [{"HostIp": "","HostPort": "8080"}]},
--"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "",
--"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"80/tcp": {}},"Tty": false,
--"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"80/tcp": [{"HostIp": "0.0.0.0","HostPort": "8080"},{"HostIp": "::","HostPort": "8080"}]},

打开浏览器,访问 http://localhost:8080 ,如下:

在这里插入图片描述

可见,在容器外部,可以通过8080端口访问容器里的80端口。

测试3:-P

启动容器:

docker run -P kai0107_1

查看容器:

➜  ~ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS                                     NAMES
241fd7f0ee87   kai0107_1   "/docker-entrypoint.…"   5 seconds ago   Up 4 seconds   0.0.0.0:32768->80/tcp, :::32768->80/tcp   jovial_haslett

检查该容器:

➜  ~ docker container inspect 241fd7f0ee87 | grep -i3 port"Config": {}},"NetworkMode": "default","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0
--"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": true,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "",
--"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"80/tcp": {}},"Tty": false,
--"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"80/tcp": [{"HostIp": "0.0.0.0","HostPort": "32768"},{"HostIp": "::","HostPort": "32768"}]},

打开浏览器,访问 http://localhost:32768 ,如下:

在这里插入图片描述

可见,在容器外部,可以通过32768端口访问容器里的80端口。

注意:32768是一个随机端口。下次再启动容器时,可能就是另外一个端口了。

测试4:–network=host

启动容器:

docker run --network=host kai0107_1

查看容器:

➜  ~ docker ps
CONTAINER ID   IMAGE       COMMAND                  CREATED         STATUS         PORTS     NAMES
adcbcdd4698c   kai0107_1   "/docker-entrypoint.…"   6 seconds ago   Up 6 seconds             quizzical_hugle

检查该容器:

➜  ~ docker container inspect adcbcdd4698c | grep -i3 port"Config": {}},"NetworkMode": "host","PortBindings": {},"RestartPolicy": {"Name": "no","MaximumRetryCount": 0
--"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "",
--"AttachStdin": false,"AttachStdout": true,"AttachStderr": true,"ExposedPorts": {"80/tcp": {}},"Tty": false,
--"HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {},"SandboxKey": "/var/run/docker/netns/default","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,

打开浏览器,访问 http://localhost:80 ,如下:

在这里插入图片描述
可见,在容器外部,可以通过80端口访问容器里的80端口。

不使用EXPOSE

创建 Dockerfile 文件如下:

FROM nginx:alpine

再次做测试1到测试4,其结果和使用EXPOSE时是完全一致的。

参考

  • https://docs.docker.com/engine/reference/run/#expose-incoming-ports
  • https://blog.csdn.net/qq_33801641/article/details/121122334
  • https://www.php.cn/faq/494255.html
  • https://yeasy.gitbook.io/docker_practice/network/port_mapping

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

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

相关文章

使用is跳转页面的几种方法

1&#xff0c;open() 打开一个新的浏览器窗口 <input type"button" value"去往新窗口按钮" onclick"fun1()">function fun1() {window.open("https://blog.csdn.net/daxiang12092205/article/details/11878477/")} 2&#xff…

二叉树的深度和高度问题(算法村第八关白银挑战)

二叉树的最大深度 104. 二叉树的最大深度 - 力扣&#xff08;LeetCode&#xff09; 给定一个二叉树 root &#xff0c;返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1&#xff1a; 输入&#xff1a;root [3,9,20,null,null…

11.perror函数的使用

文章目录 perror函数介绍简介&#xff1a; 测试代码 perror函数介绍 函数原型&#xff1a;void perror(char const *message); 简介&#xff1a; perror函数&#xff0c;以一种简单、统一的方式报告错误。标准库函数在一个外部整型变量errno&#xff08;在errno.h中定义&…

阿里云大数据ACA及ACP复习题(61~80)

61.网络爬虫又称为网络机器人、网络蜘蛛&#xff0c;也可以称它是一种(A)工具 A:从互联网自动提取网页中数据的工具 B:一种病毒软件 C:沉迷于网络有网瘾的人的代称 D:以上都不对 解析&#xff1a;网络爬虫&#xff08;又称为网页蜘蛛&#xff0c;网络机器人&#xff0c;在FOAF社…

JavaWeb——后端案例

五、案例 1. 开发规范—Restful REST&#xff08;Representational State Transfer&#xff09;&#xff0c;表述性状态转换&#xff0c;是一种软件架构风格 注&#xff1a; REST是风格&#xff0c;是约定方式&#xff0c;不是规定&#xff0c;可以打破描述模块的功能通常使…

RA4000CE (RTC模块)适用于汽车,工作温度范围宽,稳定性高

RA4000CE是一个集成了32.768 kHz数字温度补偿晶体振荡器(DTCXO)的RTC模块&#xff0c;适用于汽车&#xff0c;工作温度范围宽&#xff0c;稳定性高。它包括各种功能&#xff0c;如具有闰年校正的秒到年时钟/日历&#xff0c;时间警报&#xff0c;唤醒计时器&#xff0c;时间更新…

ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题

ubuntu解决在pycharm上使用jupyter无法导入虚拟环境中的包的问题 根本原因是jupyter 没有和他对应的kernel 需要先使用命令行建立kernel 下载ipykernel pip install ipykernel 首先激活conda conda activate然后添加你的kernel到虚拟环境 python -m ipykernel install -…

P4994 终于结束的起点————C

目录 终于结束的起点题目背景题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 提示样例 1 解释数据范围提示 解题思路Code运行结果 终于结束的起点 题目背景 终于结束的起点 终于写下句点 终于我们告别 终于我们又回到原点 …… 一个个…

stable diffusion 进阶教程-controlnet详解(持续更新中)

说明 插件下载链接:https://pan.baidu.com/s/1-qmJzqcB72nTv_2QLmR-gA?pwd=8888 提取码: 8888 讨论Q群:830970289 个人微信:mindcarver 如果在按着教程尝试的过程中有错误或问题,可以上面询问讨论,或者评论区留言 如果教程有什么问题,请帮忙纠正,持续更新(部分控制插件…

Android WiFi 连接

Android WiFi 连接 1、设置中WiFi显示2、WiFi 连接流程2.1 获取PrimaryClientModeManager2.2 ClientModeImpl状态机ConnectableState2.3 ISupplicantStaNetworkCallback 回调监听 3、 简要时序图4、原生低层驱动5、关键日志 1、设置中WiFi显示 Android WiFi基础概览 packages/a…

【英文时评】太卷了?今年流行“逆向考研”

视频链接&#xff1a;【英文时评】太卷了&#xff1f;今年流行“逆向考研”_哔哩哔哩_bilibili 重要短语or词汇 陌生短语or词汇 Hello and welcome back to YYDS with me Liao. Much has happened since you missed our show. A new phenomenon has occured more undergradu…

关于对象存储的若干事

引言 最近在阅读鸣嵩的一篇文章&#xff0c;数据库的下一场革命&#xff1a;S3 延迟已降至原先的 10%&#xff0c;云数据库架构该进化了 收获很多&#xff0c;过去时间也基于对象存储做过一些功能实现&#xff0c;特记录下。关于鸣嵩&#xff1a; 曹伟&#xff0c;花名鸣嵩&am…

C++-构造与解析

构造函数 构造函数是与同类名的特殊成员函数&#xff0c;主要用来初始化对象的数据成员。 构造函数的特点&#xff1a; 与类同名没有返回类型可以被重载由系统自动调用&#xff0c;不允许在程序中显示调用。 #include <iostream> using namespace std;class student{…

用友NC word.docx 任意文件读取漏洞复现

0x01 产品简介 用友NC是一款企业级ERP软件。作为一种信息化管理工具,用友NC提供了一系列业务管理模块,包括财务会计、采购管理、销售管理、物料管理、生产计划和人力资源管理等,帮助企业实现数字化转型和高效管理。 0x02 漏洞概述 用友NC 系统word.docx等接口存在任意文件…

JavaScript 基础二part1.运算符:赋值、一元、比较、逻辑运算符

JavaScript 基础二 1.1 赋值运算符1.2 一元运算符自增运算符的用法&#xff1a;例题 1.3 比较运算符不同类型间的比较严格相等对 null 和 undefined 进行比较 1.4 逻辑运算符例题 1.5 运算符优先级 1.1 赋值运算符 赋值运算符&#xff1a;对变量进行赋值的运算符 已经学过的赋…

光速爱购--靠谱的SpringBoot项目

简介 这是一个靠谱的SpringBoot项目实战&#xff0c;名字叫光速爱购。从零开发项目&#xff0c;视频加文档&#xff0c;十天就能学会开发JavaWeb项目。 教程路线是&#xff1a;搭建环境> 安装软件> 创建项目> 添加依赖和配置> 通过表生成代码> 编写Java代码&g…

2023年12 月电子学会Python等级考试试卷(四级)答案解析

青少年软件编程(Python)等级考试试卷(四级) 分数:100 题数:38 一、单选题(共25题,共50分) 1. 下列有关分治算法思想的描述不正确的是?( ) A. 将问题分解成的子问题具有相同的模式。

C语言中的printf函数详解

介绍 在C语言中&#xff0c;printf函数是一个非常重要的输出函数&#xff0c;用于在屏幕上显示各种数据类型的值。它通过占位符来指定输出的格式&#xff0c;并可以根据需要进行格式化输出。 常用的占位符列表 以下是printf函数中常用的占位符列表&#xff1a; %a &#xf…

HarmonOS 通用组件(Checkbox)

本文中 我们来说 通用组件中的 Checkbox 我们先搭起一个基本的架子组件 Entry Component struct Index {build() {Row() {Column() {Row() {}}.width(100%)}.height(100%)} }我们可以在Row 行组件中加入代码 Checkbox({name: "age"}) Text("年龄")这样 就…

专为Mac用户设计的思维导图软件MindNode 2023 for Mac助您激发创意!

在现代快节奏的生活中&#xff0c;我们经常需要整理思绪、规划项目、记录灵感。而思维导图作为一种高效的思维工具&#xff0c;能够帮助我们更好地整理和展现思维。现在&#xff0c;我们介绍一款强大而直观的思维导图软件——MindNode 2023 for Mac&#xff0c;助您拓展思维边界…