为什么要端口映射?

在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。

端口映射的指令是什么?

docker指令:docker run -p ip:hostPort:containerPort redis

使用-p参数会分配宿主机的端口映射到虚拟机。 
IP表示主机的IP地址。 
hostPort表示宿主机的端口。 
containerPort表示虚拟机的端口。

支持的格式有三种:

ip:hostPort:containerPort:映射指定地址的指定端口到虚拟机的指定端口(不常用) 
如:127.0.0.1:3306:3306,映射本机的3306端口到虚拟机的3306端口。 
ip::containerPort:映射指定地址的任意端口到虚拟机的指定端口。(不常用) 
如:127.0.0.1::3306,映射本机的3306端口到虚拟机的3306端口。 
hostPort:containerPort:映射本机的指定端口到虚拟机的指定端口。(常用) 
如:3306:3306,映射本机的3306端口到虚拟机的3306端口。

如何查看是否映射成功?

使用docker ps命令查看


出现6379/tcp的表示宿主机并没有打开与虚拟机的端口映射。 
出现0.0.0.0:3306->3306/tcp表示宿主机的3306端口映射到了虚拟机的3306端口。

也可以使用docker port NAME查看端口映射情况。

 
表示虚拟机的3306端口映射到了主机的3306端口。 
如果没有任何回复,表示端口映射失败。

*****************************************************

Docker运行容器之后却发现没IP,没端口,那要如何访问容器呢? 
下面我来介绍下Docker通过端口映射来实现网络访问

一、从外部访问容器应用

在启动容器的时候,如果不指定对应参数,在容器外部是无法通过网络来访问容器内的网络应用和服务的。 
当容器中运行一些网络应用,要让外部访问这些应用时,可以通过-P或-p参数指定端口映射。 
先来说说p和P吧

  • -p 可以指定要映射的端口,并且,在一个指定端口上只可以绑定一个容器
  • -P 它会随机映射一个端口至容器内部开放的网络端口(范围不详,似乎都上万)

先申明一下,我这边 
client ip address 为192.168.0.225 
registry ip address 为192.168.0.216:5000

docker run -d -it --name nginx -P 192.168.0.216:5000/nginx
docker ps -a            #查看容器是否在运行 
docker logs nginx       #查看nginx容器的log
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

端口映射支持的格式有:

ip:hostport:containerport   #指定ip、指定主机port、指定容器port
ip::containerport           #指定ip、未指定主机port、指定容器port
hostport:container          #未指定ip port、指定主机port、指定容器port     
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

二、映射所有接口ip

下列命令查看到0.0.0.0监听5000端口
docker run -d -it -p 5000:5000 --name registry 192.168.0.216:5000/registry
docker ps -a | grep 5000     

多次使用-p标记可以绑定多个端口
docker run -d -it -p 800:80 -p 8088:8080 --name tomcat 192.168.0.216:5000/tomcat
docker ps -a | egrep "(80|8080)"
 
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

三、映射到指定地址的指定端口

将容器的80 port映射到192.168.0.225:800
docker run -d -it -p 192.168.0.225:800:80 --name web_server 192.168.0.216:5000/nginx
curl 192.168.0.225:800     #验证是否可以访问默认首页
 
 
  • 1
  • 2
  • 3
  • 1
  • 2
  • 3

四、映射到指定地址的udp端口

这里且不说能不能访问,只是一种映射方式。大家别见怪
docker run -d -it -p 192.168.0.225:300:3000/udp --name unknown 192.168.0.216:5000/nginx
netstat -anpu |grep udp
udp    0    0    192.168.0.225:300    0.0.0.0:*     24588/docker-proxy
 
 
  • 1
  • 2
  • 3
  • 4
  • 1
  • 2
  • 3
  • 4

五、查看映射端口配置

通过docker port container_ID 可以查看到容器映射了哪些端口及协议
[root@docker ~]#docker port tomcat
8080/tcp -> 192.168.0.225:32769
[root@docker ~]#docker port unknown
3000/udp -> 192.168.0.225:300
*******************************************

Docker 端口映射:

最近抽空,把Docker 端口映射的资料整理了一下,以便后续项目应用,大家也可以参考下。

?
1
# Find IP address of container with ID <container_id> 通过容器 id 获取 ip $ sudo docker inspect <container_id> | grep IPAddress | cut -d '"' -f 4

无论如何,这些 ip 是基于本地系统的并且容器的端口非本地主机是访问不到的。此外,除了端口只能本地访问外,对于容器的另外一个问题是这些 ip 在容器每次启动的时候都会改变。
Docker 解决了容器的这两个问题,并且给容器内部服务的访问提供了一个简单而可靠的方法。Docker 通过端口绑定主机系统的接口,允许非本地客户端访问容器内部运行的服务。为了简便的使得容器间通信,Docker 提供了这种连接机制。

5.1 自动映射端口大写的-P (默认情况下expose端口:80, 443)

-P使用时需要指定--expose选项,指定需要对外提供服务的端口

$ sudo docker run -t -P --expose 22 --name server ubuntu:14.04

使用docker run -P自动绑定所有对外提供服务的容器端口,映射的端口将会从没有使用的端口池中 (49000..49900) 自动选择,你可以通过docker ps、docker inspect <container_id>或者docker port <container_id> <port>确定具体的绑定信息。

5.2 绑定端口到指定接口小写的-p

基本语法

$ sudo docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image> <cmd>

默认不指定绑定 ip 则监听所有网络接口。


Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐