为什么要端口映射?
在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。
端口映射的指令是什么?
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吧
先申明一下,我这边
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
端口映射支持的格式有:
ip:hostport:containerport #指定ip、指定主机port、指定容器port
ip::containerport #指定ip、未指定主机port、指定容器port
hostport:container #未指定ip port、指定主机port、指定容器port
二、映射所有接口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)"
三、映射到指定地址的指定端口
将容器的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 #验证是否可以访问默认首页
四、映射到指定地址的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
五、查看映射端口配置
通过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
|
无论如何,这些 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
5.2 绑定端口到指定接口小写的-p
基本语法
$ sudo docker run -p [([
默认不指定绑定 ip 则监听所有网络接口。