
转载说明:如果您喜欢这篇文章并打算转载它,请私信作者取得授权。感谢您喜爱本文,请文明转载,谢谢。
知识点回顾
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。
总结
总结以上几种端口映射方式如下:



893

被折叠的 条评论
为什么被折叠?



