Docker端口暴露的几种方式
知识点回顾
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端口暴露内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!
相关文章
Alpine镜像中telnet转移至busybox-extras
今天小编就为大家分享一篇关于Alpine镜像中telnet转移至busybox-extras,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧2018-12-12


最新评论