Docker端口暴露的几种方式

 更新时间:2025年12月03日 10:50:38   作者:SRE成长记  
主要介绍了Docker端口暴露的几种方式,包括-p(--publish)、-P(--publish-all)和EXPOSE,具有一定的参考价值,感兴趣的可以了解一下

知识点回顾

Docker要映射了端口,外部才能访问到容器服务。Docker映射端口有3个指令,含义分别为:

1. -p(--publish):将容器端口直接映射到宿主机端口,这是最常用、最灵活的方式。格式为:

-p [宿主机IP:][宿主机端口]:[容器端口]

2. -P( --publish-all):将 Dockerfile 中 EXPOSE 声明的所有端口随机映射到宿主机的高位端口(通常高于 32768)。

3. EXPOSE:在 Dockerfile 中使用的指令。它只是一个元数据(声明),用于说明容器预期会监听哪些端口,不会将端口映射到宿主机。

使用场景

1. 不暴露任何端口(默认场景)

命令

docker run -d [image]

这是最隔离的状态。容器内的端口完全封闭,只有容器自己可以访问。无论是宿主机还是外部网络,甚至是其他容器,都无法通过网络连接到这个容器服务。

网络可达:

2. 使用-P(大写)随机映射端口

前提: 要求使用的镜像的 Dockerfile 中已经用 EXPOSE 指令声明了要暴露的端口。

命令

docker run -d -P [image]

Docker 宿主机会随机选择一个未被占用的高位端口映射到容器的目标端口。

网络可达:

以minio为例子,编写Dockerfile如下:

FROM www.myharbor.com/library/asianux-7.6.1810:v1
RUN set -ex \
  && mkdir -p /data \
  && mkdir -p /minio
COPY minio /minio/
RUN chmod 777 /minio/minio
EXPOSE 9000 9001    ##声明暴露端口
CMD ["/minio/minio","server","/data","--console-address",":9001"]

构建一个镜像并启动:

# docker build . -t www.myharbor.com/minio:v1
# docker run -d -P www.myharbor.com/minio:v1

可以看到端口已经映射 出来了,并且通过端口访问正常:

3. 使用-p(小写,手动指定映射)

这是最常用的方式,有几种不同的用法:

3.1 映射到宿主机所有接口的随机端口

命令

docker run -d -p [容器端口] [image]

将容器的指定端口映射到宿主机所有网络接口的一个随机高位端口。效果类似-P,但只针对指定的一个端口。

例如:

3.2 映射到宿主机所有接口的特定端口

命令

docker run -d -p [宿主机端口]:[容器端口] [image]

将容器的指定端口映射到宿主机所有网络接口(0.0.0.0)的指定端口。

例如:

3.3 映射到宿主机特定IP的特定端口

命令

docker run -d -p [宿主机IP]:[宿主机端口]:[容器端口] [image]

将容器的某个端口映射到宿主机特定IP(例如:10.0.0.101)的指定端口。这样只有通过这个特定IP才能访问,增加了安全性。

访问方式http://10.0.0.101:[映射端口] (通过宿主机其他IP无法访问)

例如:

3.4 指定协议映射端口

命令

docker run -d -p [宿主机端口]:[容器端口]/[协议] [image] 

默认映射协议是 TCP,如果需要其它协议例如UDP,可以这样指定。

例如:

网络可达:

4. 使用--expose(运行时暴露端口)

命令

docker run -d --expose 80 --expose 443 nginx

这个命令的效果类似于在 Dockerfile 中使用 EXPOSE 指令。它只是在运行时为容器打开这些端口,但并没有映射到宿主机。这些端口只对在同一个自定义网络中的其他容器开放,用于容器间通信。

例如:

网络可达:

-p 隐含了 --expose 的功能。使用 -p 80:80 时,Docker 会自动--expose 80

总结

总结以上几种端口映射方式如下:

到此这篇关于Docker端口暴露的几种方式的文章就介绍到这了,更多相关Docker端口暴露内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Docker 容器指定自定义网段的固定IP/静态IP地址

    Docker 容器指定自定义网段的固定IP/静态IP地址

    这篇文章主要介绍了Docker 容器指定自定义网段的固定IP/静态IP地址的相关资料,需要的朋友可以参考下
    2016-12-12
  • vscode利用ssh配置docker容器并开启远程编程模式的详细步骤

    vscode利用ssh配置docker容器并开启远程编程模式的详细步骤

    这篇文章主要介绍了vscode利用ssh配置docker容器内开启远程编程模式,本文给大家讲解的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-03-03
  • 阿里云镜像安装docker报错的问题及解决方案

    阿里云镜像安装docker报错的问题及解决方案

    这篇文章主要介绍了阿里云镜像安装docker报错的问题及解决方案,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-08-08
  • Docker安装配置Redis镜像的实现步骤

    Docker安装配置Redis镜像的实现步骤

    Redis是一个由Salvatore Sanfilippo写的key-value存储系统,是跨平台的非关系型数据库。Redis 是一个开源的使用 ANSI C 语言编写、遵守 BSD 协议、支持网络、可基于内存、分布式、可选持久性的键值对(Key-Value)存储数据库,并提供多语言API,本文带你在Docker安装配置它
    2021-11-11
  • Springboot使用docker-compose实现动态配置过程

    Springboot使用docker-compose实现动态配置过程

    这篇文章主要介绍了Springboot使用docker-compose实现动态配置全过程,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-03-03
  • docker自定义网络从入门到实践

    docker自定义网络从入门到实践

    Docker 网络模式决定了容器之间、容器与宿主机之间的通信方式,掌握网络机制是理解容器互联互通的关键,本文给大家介绍docker自定义网络从入门到实践,感兴趣的朋友跟随小编一起看看吧
    2025-10-10
  • 使用Docker容器运行Oracle数据库方式

    使用Docker容器运行Oracle数据库方式

    这篇文章主要介绍了使用Docker容器运行Oracle数据库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-05-05
  • 修改docker网桥网段范围实现方式

    修改docker网桥网段范围实现方式

    文章介绍了如何修改Docker默认的172.17.0.0/16网桥网段,以避免与局域网冲突,提供了两种方法:一种是修改Docker配置文件并重启服务,另一种是创建自定义网络并指定子网范围,同时,还提到了一些参考命令,如查看docker0网桥信息和删除docker0网桥
    2025-12-12
  • Docker给容器添加新端口映射的两种方法及常用命令举例详解

    Docker给容器添加新端口映射的两种方法及常用命令举例详解

    Docker是一个开源的应用容器引擎,允许开发者打包和发布应用到任何流行的Linux机器上,并实现虚拟化,这篇文章主要介绍了Docker给容器添加新端口映射的两种方法及常用命令的相关资料,需要的朋友可以参考下
    2025-03-03
  • No route to host两个docker容器的服务访问不通的解决

    No route to host两个docker容器的服务访问不通的解决

    在CentOS服务器上使用Docker容器时,当容器之间的服务调用出现“Failed to establish a new connection: [Errno 113] No route to host”错误,是因为容器的报文源地址被防火墙拦截,解决方法有两种:在防火墙上开放指定端口或关闭防火墙
    2025-02-02

最新评论