Docker端口映射

2023-05-16

为什么要端口映射?

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

端口映射的指令是什么?

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,宿主机IP10.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端口就可以了。

​​
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker端口映射 的相关文章

随机推荐

  • Huawei交换机链路聚合eth-trunk配置

    华三的动态对接华为的lacp 华三的静态对接华为的手工 华为手工模式配置 xff1a 1 执行命令 system view xff0c 进入系统视图 2 执行命令 interface eth trunk trunk id xff0c 进入
  • Windows每月安装补丁

    1 打开windows补丁的网站 Microsoft Update Catalog 2 搜索Cumulative Windows Server 2016 3 点击Download下载2023年4月补丁合集
  • Windows server 2022安装与激活

    1 下载 百度网盘下载 链接 xff1a https pan baidu com s 18c5smZPzbk0ClhEYh4LQ2w 提取码 xff1a w7i8 2 安装 最近版本新出的镜像官方的 EFI 文件在虚拟机上部署有问题 xff
  • 使用UltraISO制作U盘启动安装系统的方法

    1 下载并安装好UltraISO 下载链接ultraiso绿色版下载 ultraiso绿色版免费版下载v9 7 6 3810 软件爱好者 2 安装好UltraISO以后 xff0c 双击图标打开软件 3 点击 文件 菜单 打开 xff0c
  • u盘变成驱动器怎么变回来

    1 首先按下键盘 win 43 r 打开运行 xff0c 输入 cmd 回车确定 2 在其中输入 diskpart 回车确定 3 然后不要关闭 xff0c 右键此电脑 xff0c 打开 管理 4 在磁盘管理下确认一下自己的u盘盘符 5 确认
  • 全国DNS服务器IP地址大全详细介绍

  • Nginx之TCP/UDP反向代理

    Nginx从1 9 13起开始发布ngx stream core module模块不仅能支持TCP代理及负载均衡 其实也是支持UDP协议的 1 Nginx下载 wget http nginx org download nginx 1 24
  • 【无标题】

    错误代码 root 64 xxx nginx sbin nginx t nginx emerg unknown directive 34 stream 34 in usr local nginx conf nginx conf 118 ng
  • pm2常用的命令用法介绍

    pm2 是一个带有负载均衡功能的Node应用的进程管理器 当你要把你的独立代码利用全部的服务器上的所有CPU 并保证进程永远都活着 0秒的重载 PM2是完美的 下面我们来看pm2常用的命令用法介绍吧 PM2 xff08 github上的源码
  • 华为CE12808更换主控板

    在更换主控板的过程中 xff0c 务必缓慢 平稳地插拔单板 xff0c 避免左右晃动而导致触碰相邻单板 xff0c 造成正在运行中的单板发生故障 在主控板拔插的过程中严禁用手接触单板上的元器件 xff0c 以免损坏单板 新的主控板在出厂时已
  • 迪普防火墙FW1000普通双击热备配置

    一 组网图 二 端口聚合配置 三 配置三层接口地址 四 配置普通双机热备 五 配置安全域 六 配置地址对象 七 配置服务对象 八 配置静态路由 九 配置VRRP 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十三 配置包过
  • 迪普防火墙F1000静默双击热备配置

    一 组网图 二 创建端口聚合 三 配置心跳接口IP地址 四 配置静默双击热备 五 配置三层接口IP地址 六 配置安全域 七 配置地址对象 八 配置服务对象 九 配置静态路由 十 配置NAT地址池 十一 配置源NAT 十二 配置目的NAT 十
  • Zabbix用户及用户组权限概述

    本文简单介绍用户及用户组权限 xff0c 参考官方文档 xff1a https www zabbix com documentation 5 2 manual config users and usergroups 一 概述 Zabbix
  • 使用nginx反向代理MRCP SERVER

    MRCP V2 的消息组成 MRCP xff08 V2 xff09 的交互过程可以分为三部分 1 SIP交互 xff1a Session Initiation Protocol xff0c 缩写SIP 正如协议的名称所言 xff0c 用于初
  • 一文搞懂如何使用STM32驱动直流电机(普通PWM输出和L298N、高级定时器输出带死区双通道互补PWM和IR2110S及自举电路、H桥电路和电机正反转)

    本文将用最通俗易懂的语言讲解怎么使用STM32驱动直流电机 xff0c 以及在使用过程中容易遇到的问题和解决办法 本文将介绍两种驱动方式 xff1a 普通PWM驱动L298N驱动直流电机 xff1b 互补PWM驱动IR2110S驱动直流电机
  • Linux —— 线程池

    目录 一 什么是线程池 二 线程池的优点 三 线程池的应用 四 实现一个简单的线程池 五 单例模式 1 饿汉实现方式 2 懒汉实现方式 3 单例模式实现线程池 xff08 懒汉方式 xff09 六 其他常见的各种锁 一 什么是线程池 线程池
  • 跟我一起写Shell脚本之二十二--常用命令(xargs)

    1 介绍 xargs 是一个强有力的命令 xff0c 它能够捕获一个命令的输出 xff0c 然后传递给另外一个命令 命令格式 xff1a xargs options command 选项 xff1a a file 从文件中读入作为 stdi
  • 解决Win10笔记本电脑Wifi频繁断线的问题

    Win10无线总是掉线怎么回事 经常有网友抱怨 xff0c 电脑升级Win10之后 xff0c 无线网络经常容易掉线或者不稳定的情况 有时候即便是勾选了自动连接Wifi xff0c 断线后也不会自动连接 Win10笔记本Wifi总是断线解决
  • 国内各个界面库比较,告诉你怎么选择界面库?

    目前网络上的界面库多彩多样 这里以个人的观点 xff0c 来评价一下界面库 如果有不当的地方望批评指出 1 Skin 43 43 www uipower com 该界面库是基于WIN32的界面库 xff0c 以上海勇进公司的形式来运作 xf
  • Docker端口映射

    为什么要端口映射 xff1f 在启动容器时 xff0c 如果不配置宿主机器与虚拟机的端口映射 xff0c 外部程序是无法访问虚拟机的 xff0c 因为没有端口 端口映射的指令是什么 xff1f docker指令 xff1a docker r