Dockerfile的EXPOSE

2024-01-08 04:52
文章标签 dockerfile expose

本文主要是介绍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

这篇关于Dockerfile的EXPOSE的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/582380

相关文章

前端 Dockerfile 及 Nginx 配置

🚀 需求:前端 Vue 项目,需要打包为 Docker 镜像,并通过外部 Nginx 访问到这个前端容器。 ⭐ 解决:使用 Nginx 作为 Docker 基础镜像,即使用 Nginx 代理前端静态资源。 Dockerfile Dockerfile 如下: #使用 nginx 最新版本作为基础镜像FROM harbor.xxx.com/enterprise/nginx:1.26-boo

【docker1】docker的下载安装、容器与docker、Dockerfile的写法

1 容器 1、容器1、什么是容器?用镜像启动的一个对外可以提供服务的进程即为容器。1、容器的本质是进程2、容器是由镜像创建的,跟镜像中保存的内容完全一致。3、容器与容器之间是完全隔离的(可以理解为国中之国)4、每一个容器都需要做的是尽量保持自己的体积足够的小。2、容器的生命周期容器之内必须至少有一个进程运行在前台。如果一个进程都没有的话,那么此容器就相当于完成了它的声明周期。3、容器的基本使用0

Docker数据卷和Dockerfile

1、什么是Docker数据卷 前言:         在下载的镜像中,我们不能够去改变它内部的一些配置,因为docker的镜像文件是已经配置好的,无法改变,我们只能改变镜像启动后的容器里面的内容,但是又因为,容器本来就是一个临时的,当容器停止了,那么我们内部的一些存储的数据也将会丢失,那么docker官方为了能够解决这个临时性的问题而产生了数据卷(volume)这个组件。

特征选择错误:The classifier does not expose coef_ or feature_importances_ attributes

在利用RFE进行特征筛选的时候出现问题,源代码如下: from sklearn.svm import SVRmodel_SVR = SVR(C=1.0, cache_size=200, coef0=0.0, degree=3, epsilon=0.1, gamma='auto',kernel='rbf', max_iter=-1, shrinking=True, tol=0.001, verb

dockerfile部署fastapi项目

dockerfile部署fastapi项目 1、Dockerfile # 使用Python官方镜像作为基础镜像FROM python:3.8-slim# 更新apt-get源并安装依赖# RUN apt-get update -y && apt-get install -y git# 设置环境变量ENV PYTHONDONTWRITEBYTECODE 1ENV PYTHONUNBUFF

Docker —— Dockerfile 详解

制作Docker image 有两种方式:一是使用 Docker container,直接构建容器,再导出成 image 使用;二是使用 Dockerfile,将所有动作写在文件中,再 build 成 image。Dockerfile 的方式非常灵活,推荐使用。 本次实验环境:腾讯云服务器 CentOS 6.7 x86_64 一.Dockerfile 基本结构 一般的,Dockerfi

docker实战扩展三(dockerfile中run的详细用法)

RUN 是 Dockerfile 中的一个重要指令,用于在镜像构建过程中执行命令。它将在镜像构建过程中创建一个新的临时容器,执行指定的命令,并将执行结果提交到镜像层。每一个 RUN 指令都会创建一个新的镜像层。 RUN 指令的基本用法 Shell 形式 最常见的形式是 shell 形式,这种形式的 RUN 指令会在 /bin/sh -c 中运行。适用于大多数简单命令: RUN <comma

docker实战扩展四( Dockerfile 中,COPY . .详细讲解)

在 Dockerfile 中,COPY . . 是一个常用的指令,它的作用是将构建上下文中的所有文件复制到镜像中的指定目录。为了更好地理解这个指令,我们需要先了解两个概念:构建上下文和容器中的工作目录。 概念解释 构建上下文: 构建上下文是指在执行 docker build 命令时,Docker CLI 将指定目录的内容(包括子目录和文件)发送给 Docker 守护进程。构建上下文的路径通常

Dockerfile 实例

删除不需要的镜像:示例:通配符可用 [root@docker ~]# docker images REPOSITORY                  TAG       IMAGE ID       CREATED         SIZE <none>                      <none>    580260c93725   2 hours ago     4.27MB

8.30-使用docker容器部署考试项目+使用Dockerfile部署java项目

部署考试系统 一、在容器中部署nginx 1.编写docker脚本 [root@docker001 ~]# vim docker.shcat << EOF | tee /etc/modules-load.d/k8s.conf overlaybr_netfilterEOFmodprobe overlaymodprobe br_netfiltercat << EOF | tee /etc