Docker】给运行的容器添加端口映射

      最近使用Docker作为容器,部署项目的时候,发现有个问题就是容器只能在启动的时候配置预先配置端口,但是往往实际应用的过程中会发现端口不够用,然后网上找了一下资料,大概的方案有两种:

  • 方法一:把正在运行的容器打包成为docker镜像,然后直接使用run命令重新添加端口映射。这个方法虽然简单,但是很麻烦而且某些情况下还是会有些问题的,例如:你的容器已经占用了100GB的容量,这时候为了增加端口,而把容器再打包成镜像这是不实际的。【docker常用命令-传送门】

  • 方法二:获取需要添加端口的,正在运行的docker容器的内网ip地址(一般是172开头的),然后在宿主机的防火墙上面添加端口映射,直接映射容器的ip地址即可。

  • 上述两个方案的参考资料【怎么给运行中的docker容器添加新的端口】

由于上述资料给出的方案2使用的是iptable,但是centos7已经没有使用iptable了,所以就需要改用firewall了。

Centos7 添加端口映射

上网找了一下资料,然后自己配置了一下就成功了,先列出参考链接:

  1. centos7安装telnet服务
  2. linux/centos7 端口映射
  3. CentOS7使用firewalld打开关闭防火墙与端口
安装Telnet服务
  1. 首先需要确认宿主机能不能连接docker容器的网络以及对应的端口,所以我们需要安装telnet来测试端口是否能够连通。输入以下命令检查是否安装了telnet服务
 	rpm -qa telnet-server
 	rpm -qa xinetd

如果没有安装,则先安装。安装命令如下:

	# 安装 telnet
	yum list |grep telnet
	yum install telnet-server.x86_64
	yum install telnet.x86_64
	
	# 安装xinetd 
	yum list |grep xinetd
	yum install xinetd.x86_64

	# 将xinetd服务加入开机自启动:
	systemctl enable xinetd.service

	# 将telnet服务加入开机自启动:
    systemctl enable telnet.socket

	# 最后,启动以上两个服务即可:
	# 由于telnet服务也是由xinetd守护的,所以安装完telnet-server,要启动telnet服务就必须重新启动xinetd 。

   	systemctl start telnet.socket
	systemctl start xinetd
	(或service xinetd start)

	# 使用telnet命令测试端口是否连通
	telnet 172.17.0.1 8080

另外补充一下查看ip地址的命令

  1. centos7查看ip地址命令
    ip address
  2. docker容器 查看ip地址命令
    ifconfig
使用firewalld实现端口映射功能:
  1. 启动firewalld功能

     systemctl start firewalld
    
  2. 永久打开端口(示例端口3000/tcp)【注意,这里打开的是宿主机的端口,而不是容器的端口】

     firewall-cmd --add-port=3000/tcp --permanent
     # 批量打开端口命令
     firewall-cmd --permanent --zone=public --add-port=100-500/tcp
     firewall-cmd --permanent --zone=public --add-port=100-500/udp
    
  3. 重新加载生效:

     firewall-cmd --reload
    
  4. 查看打开的端口

     firewall-cmd --list-ports
    
  5. 永久添加映射规则【端口3000 映射到 172.17.0.1:8080端口,172.17.0.1为docker容器的ip地址】

     firewall-cmd --add-forward-port=port=3000:proto=tcp:toaddr=172.17.0.1:toport=8080 --permanent
    
  6. 永久允许防火墙伪装ip:

     firewall-cmd --add-masquerade --permanent
    
  7. 关闭端口

     firewall-cmd --zone=public --remove-port=80/tcp --permanent
    
  8. 允许某个ip访问端口

     firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.142.166" port protocol="tcp" port="5432" accept"
    
  9. 查看firewalld配置文件

     cat /etc/firewalld/zones/public.xml 
     # 因为有些端口只允许某些ip访问, 需要查看配置文件才能看得到
    
其他资料

【传送门】centos7 firewall常用命令

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐