您的位置:首页 > 运维架构 > Docker

Docker端口映射

2017-08-03 16:04 218 查看
为什么要端口映射?

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

端口映射的指令是什么?

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、单IP多容器映射规划方案

    此种环境适用只有单个IP环境下,如云主机等。

1.1 端口映射规划表格:

    规划不同的端口段,映射到容器从而对外提供服务。
主机名称
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









 docker run -h="redis-test"  --name redis-test -d -p 51000:22 -p 51001:3306   -p 51003:6379 -p 51004:6381  -p 51005:80 -p  51006:8000 -p 51007:8888   debian02 /etc/rc.local 

docker run -h="salt_zabbix_manager02"  --name salt_zabbix_manager02 -d -p 52000:22 -p   52001:3306 -p 52003:6379 -p 52004:6381  -p  52005:80 -p 52006:8000 -p 52007:8888  debian02 /etc/rc.local 





​1.3 上述启动参数解释:

-h  是指启动后容器中的主机名。

--name 是宿主机上容器的名称,以后启动停止容器不必用容器ID,用名称即可,如docker stop redis-test。

-d   以后台形式运行。

-p   指定映射端口,如果需要映射UDP端口,则格式是 -p3000:3000/udp。

debian02  是基础镜像名称。

/etc/rc.local  是容器的启动命令,把多个启动脚本放/etc/rc.local中,方便多个程序随容器开机自启动。



2、多IP多容器映射规划方案

    此规划比较适用于内网测试研发环境,所有对外访问IP都需要配置在宿主机上,如以第二IP eth0:1,eth0:2这种形式配置,然后每个IP和容器的端口映射配置就可以一致了。

 

2.1 端口与IP映射规划表格:

(此处是内网IP,宿主机IP是10.28.103.1)
主机名称
对外访问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
 2.2 对应容器启动命令:

    docker run -h="iframe-test"  --name iframe-test -d -p 10.18.103.2:22:22 -p  10.18.103.2:3306:3306 -p 10.18.103.2:6379:6379 -p 10.18.103.2:6381:6381  -p 10.18.103.2:80:80 -p 10.18.103.2:8000:8000 -p 10.18.103.2:8888:8888 -p 10.18.103.2:443:443 debian-iframe-test
/etc/rc.local





    docker run -h="web-test"  --name web-test -d -p 10.18.103.3:22:22 -p 10.18.103.3:3306:3306  -p 10.18.103.3:6379:6379 -p 10.18.103.3:6381:6381  -p 10.18.103.3:80:80 -p 10.18.103.3:8000:8000  -p 10.18.103.3:8888:8888 -p 10.18.103.3:443:443 debian-iframe-test
/etc/rc.local

 

3、端口映射动态扩容方案

    在工作当中,一般增加新的服务时,就需新增一个端口映射,由于无法动态调整,通常都需要commit到新的镜像,然后在基于新的镜像来起容器,确实是一件很麻烦的事。

    但映射的本质,是通过iptables来完成的。所以我们可以动态的用iptables增加端口映射即可,如下:

 

3.1 用iptables查看容器映射情况:



root@qssec-iframe:~# iptables -t nat -nvL



Chain DOCKER (2 references)

 pktsbytes target     prot opt in     out    source               destination        

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8000 to:172.17.0.3:8000

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:443 to:172.17.0.3:443

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:3306 to:172.17.0.3:3306

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6379 to:172.17.0.3:6379

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:6381 to:172.17.0.3:6381

 3470  190K DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:80 to:172.17.0.3:80

    0     0 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:8888 to:172.17.0.3:8888

   41  2336 DNAT       tcp --  !docker0 *       0.0.0.0/0            0.0.0.0/0            tcp dpt:50000 to:172.17.0.3:22

#从这里可以找到docker容器里使用的IP,然后在用iptables增加映射即可。

 

3.2 举例新增zabbix端口的映射:



  3.2.1 单IP单容器端口扩容:

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 10050 -j DNAT --to-destination  172.17.0.3:10050

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 10051 -j DNAT --to-destination  172.17.0.3:10051

 

  3.2.2 单IP多容器端口扩容:

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 50010 -j DNAT --to-destination  172.17.0.3:10050

      iptables -t nat -A PREROUTING  -p tcp -m tcp --dport 50011 -j DNAT --to-destination  172.17.0.3:10051

#另一个容器则可以规划为60010,60011,这样在zabbix监控的时候,就需要指定客户容器的端口连接了。

 

  3.2.3 多IP多容器端口扩容:

      iptables -t nat -A PREROUTING -d  10.18.103.2 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.3:10050

      iptables -t nat -A PREROUTING -d  10.18.103.2 -p tcp -m tcp --dport 10051 -j DNAT --to-destination 172.17.0.3:10051

      #iptables -t nat -A PREROUTING -d  10.18.103.3 -p tcp -m tcp --dport 10050 -j DNAT --to-destination 172.17.0.4:10050

      #iptables -t nat -A PREROUTING -d  10.18.103.3 -p tcp -m tcp --dport 10051 -j DNAT --to-destination 172.17.0.4:10051

#这样zabbix连接10.18.103.2,3的正常zabbix端口就可以了。

​​
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: