在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。
容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P 或 -p 参数来指定端口映射。
当使用 -P 标记时,Docker 会随机映射一个 49000~49900 的端口到内部容器开放的网络端口。
端口映射通过-P和-p参数来实现
一、-P将容器内部开放的网络端口随机映射到宿主机的一个端口上;
二、-p指定要映射的端口,一个指定端口上只可以绑定一个容器;
docker指令:docker run -p ip:hostPort:containerPort 镜像
使用-p参数 会分配宿主机的端口映射到虚拟机。
IP表示主机的IP地址。
hostPort表示宿主机的端口。
containerPort表示虚拟机的端口。
映射三种支持的格式
1、映射所有接口地址
hostPort:containerPort:映射本机的指定端口到虚拟机的指定端口。(常用)
如:6379:6379,映射本机的6379端口到虚拟机的6379端口。
出现0.0.0.0:6379->6379/tcp表示宿主机的6379端口映射到了虚拟机的6379端口。
此时默认会绑定本地所有接口上的所有地址。
若出现6379/tcp的表示宿主机并没有打开与虚拟机的端口映射。
2、映射到指定地址的指定端口
ip:hostPort:containerPort:映射指定地址的指定端口到虚拟机的指定端口(不常用)
如:将容器的6380端口映射到指定地址127.0.0.1的6380端口上:
3、映射到指定地址的任意端口
ip::containerPort:映射指定地址的任意端口到虚拟机的指定端口。(不常用)
如:将容器的6381端口映射到127.0.0.1的任意端口上,本地主机会自动分配一个端口
注意:
-
容器有自己的内部网络和 ip 地址(使用
docker inspect
可以获取所有的变量,Docker 还可以有一个可变的网络配置。) -
-p
标记可以多次使用来绑定多个端口
映射结果查看
-
使用docker ps命令查看
出现6379/tcp的表示宿主机并没有打开与虚拟机的端口映射。
出现0.0.0.0:3306->3306/tcp表示宿主机的3306端口映射到了虚拟机的3306端口。
- 使用docker port NAME查看端口映射情况
使用 docker port
来查看当前映射的端口配置,也可以查看到绑定的地址
表示虚拟机的3306端口映射到了主机的3306端口。
如果没有任何回复,表示端口映射失败。
自动映射端口
-P使用时需要指定--expose选项,指定需要对外提供服务的端口
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>确定具体的绑定信息。
绑定端口到指定接口
基本语法
$ sudo docker run -p [([<host_interface>:[host_port]])|(<host_port>):]<container_port>[/udp] <image> <cmd>
默认不指定绑定 ip 则监听所有网络接口。
绑定 TCP 端口
# Bind TCP port 8080 of the container to TCP port 80 on 127.0.0.1 of the host machine.
$ sudo docker run -p 127.0.0.1:80:8080 <image> <cmd> # Bind TCP port 8080 of the container to a dynamically allocated TCP port on 127.0.0.1 of the host machine.
$ sudo docker run -p 127.0.0.1::8080 <image> <cmd> # Bind TCP port 8080 of the container to TCP port 80 on all available interfaces of the host machine.
$ sudo docker run -p 80:8080 <image> <cmd> # Bind TCP port 8080 of the container to a dynamically allocated TCP port on all available interfaces
$ sudo docker run -p 8080 <image> <cmd>
绑定 UDP 端口
# Bind UDP port 5353 of the container to UDP port 53 on 127.0.0.1 of the host machine.
$ sudo docker run -p 127.0.0.1:53:5353/udp <image> <cmd>