为什么要端口映射? 在启动容器时,如果不配置宿主机器与虚拟机的端口映射,外部程序是无法访问虚拟机的,因为没有端口。 端口映射的指令是什么? 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端口。 如果没有任何回复,表示端口映射失败。 5.1 自动映射端口 -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 绑定端口到指定接口 基本语法 $ 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>
1.3 上述启动参数解释: -h 是指启动后容器中的主机名。 --name 是宿主机上容器的名称,以后启动停止容器不必用容器ID,用名称即可,如docker stop redis-test。 -d 以后台形式运行。 -p 指定映射端口,如果需要映射UDP端口,则格式是 -p3000:3000/udp。 debian02 是基础镜像名称。 /etc/rc.local 是容器的启动命令,把多个启动脚本放/etc/rc.local中,方便多个程序随容器开机自启动。
1、单IP多容器映射规划方案
主机名称 | ssh映射 | mysql映射 | nginx映射 | redis映射 | ||||
redis-test | 51000 | 22 | 51001 | 3306 | 51004 | 80 | 51002 | 6379 |
51005 | 8000 | 51003 | 6381 | |||||
51006 | 8888 | |||||||
scheduler-test | 52000 | 22 | 52001 | 3306 | 52004 | 80 | 52002 | 6379 |
52005 | 8888 | 52003 | 6381 | |||||
52006 | 8000 | |||||||
… | … | … | … | … | … | … | … | … |
2、多IP多容器映射规划方案
主机名称 | 对外访问IP | 容器开放端口 | 操作系统 |
iframe-test | 10.18.103.2 | 22 3306 80 8000 8888 443 6379 6381 | debian7 |
web-test | 10.18.103.3 | 22 3306 80 8000 8888 443 6379 6381 | debian7 |