外部访问docker容器(docker run -p/-P 指令)

本文介绍如何在Docker容器中运行网络应用并将其暴露给外部。通过-P参数实现随机端口映射,通过-p参数指定具体端口映射方式。支持hostPort:containerPort、ip:hostPort:containerPort及ip::containerPort等多种格式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P(大写) 或 -p (小写) 参数来指定端口映射。

(1)当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
使用 docker ps 可以看到,本地主机的 49155 被映射到了容器的 5000 端口。此时访问本机的 49155 端口即可访问容器内 web 应用提供的界面。

 $ sudo docker run -d -P training/webapp python app.py
 $ sudo docker ps -l
 CONTAINER ID  IMAGE                   COMMAND       CREATED        STATUS        PORTS                    NAMES
 bc533791f3f5  training/webapp:latest  python app.py 5 seconds ago  Up 2 seconds  0.0.0.0:49155->5000/tcp  nostalgic_morse

同样的,可以通过 docker logs 命令来查看应用的信息。

$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -

(2)-p(小写)则可以指定要映射的IP和端口,但是在一个指定端口上只可以绑定一个容器。支持的格式有 hostPort:containerPortip:hostPort:containerPortip::containerPort

  • hostPort:containerPort(映射所有接口地址)
    将本地的 5000 端口映射到容器的 5000 端口,可以执行如下命令:

$ sudo docker run -d -p 5000:5000 training/webapp python app.py 此时默认会绑定本地所有接口上的所有地址。

  • ip:hostPort:containerPort (映射指定地址的指定端口)
    指定映射使用一个特定地址,比如 localhost 地址 127.0.0.1

$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py

  • ip::containerPort (映射指定地址的任意端口)
    绑定 localhost 的任意端口到容器的 5000 端口,本地主机会自动分配一个端口。

sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py

还可以使用 udp 标记来指定 udp 端口

$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py

查看映射端口配置
使用 docker port 来查看当前映射的端口配置,也可以查看到绑定的地址

 $ docker port nostalgic_morse 5000
 127.0.0.1:49155.

注意:

  • 容器有自己的内部网络和 ip 地址(使用 docker inspect 可以获取所有的变量,Docker 还可以有一个可变的网络配置。)
  • -p 标记可以多次使用来绑定多个端口
    例如

$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py

原文链接:https://yeasy.gitbooks.io/docker_practice/content/network/port_mapping.html

### 使用 `docker run` 命令中的 `-p` 选项 #### 映射单个端口 为了将主机的特定端口映射到容器内的某个端口,可以使用如下命令格式: ```bash sudo docker run -d -p hostPort:containerPort image_name command ``` 例如,要绑定本地主机的5000端口至容器内部的服务监听端口同样为5000,则可执行下面这条指令[^1]: ```bash sudo docker run -d -p 5000:5000 training/webapp python app.py ``` #### 绑定指定IP地址上的端口 如果希望仅允许来自特定网络接口(即特定 IP 地址)的数据流进入容器服务,可以通过增加冒号前缀的方式指明该 IP: ```bash sudo docker run -d -p ip:hostPort:containerPort image_name command ``` 比如只让本机回环设备(localhost)连接到运行的应用程序实例上,那么应该这样操作[^2]: ```bash sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py ``` #### 动态分配主机端口号 当不确定具体想要使用的主机侧开放哪个端口时,可以让 Docker 自动选取一个未被占用的高数值范围内的端口并与给定的目标容器端口关联起来。此时只需省略掉中间部分即可实现此功能。 对于上述例子而言,若想随机挑选一个可用端口并将其转发给容器里的5000端口的话,应当采用这种方式调用命令: ```bash sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py ``` #### UDP 协议支持 默认情况下,所创建出来的 TCP 类型的端点;然而有时也需要处理基于UDP协议的消息传输需求。为此可以在定义好两端之后附加 `/udp` 后缀来表明意图。 这里给出一段用于启动带有UDP通信能力的服务样例代码片段: ```bash sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值