为什么要端口映射?
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。
端口映射的指令是什么?
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 123 123端口映射支持的格式有:
ip:hostport:containerport #指定ip、指定主机port、指定容器port ip::containerport #指定ip、未指定主机port、指定容器port hostport:container #未指定ip port、指定主机port、指定容器port 123 123二、映射所有接口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)" 1234567 1234567三、映射到指定地址的指定端口
将容器的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 #验证是否可以访问默认首页 123 123四、映射到指定地址的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 1234 1234五、查看映射端口配置
通过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 则监听所有网络接口。