已开启的容器如何配置端口映射

2022-03-05  本文已影响0人  沿哲

如果在docker run命令里没有配置-p参数,后来又需要加上该怎么办?

方法一(尝试无效

有教程说编辑/var/lib/docker/containers/[容器ID]/下的文件修改
但是我尝试后不起作用==

方法二:配置IPTABLES

教程在此

前提
  1. 比如我的某个容器ip是172.16.0.2,在我的服务器上,想追加开放888端口
  2. 已经通过docker network create --subnet=172.16.0.0/16 mynetwork创建了子网,通过ifconfig查看得知mynetwork对应的网桥是br-e5d905c72d10
  3. 为了验证容器端口正确开放,需用另一台电脑(我的笔记本)进行测试
开始配置
iptables -A DOCKER ! -i br-e5d905c72d10 -o br-e5d905c72d10 -p tcp --dport 888 -d 172.16.0.2 -j ACCEPT
image
iptables -t nat -A POSTROUTING -p tcp --dport 888 -s 172.16.0.2 -d 172.16.0.2 -j MASQUERADE
image
iptables -t nat -A DOCKER ! -i br-e5d905c72d10 -p tcp --dport 888 -j DNAT --to-destination 172.16.0.2:888

测试888端口

我的笔记本和容器节点172.16.0.2通过socket进行聊天

# 服务器的容器节点上
import socket
fwq=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
fwq.bind(('0.0.0.0',888))
#监听5个连接
fwq.listen(5)
print('开始聊天!')
conn,addr=fwq.accept()  
while 1:
    #接收到的信息大小为1024字节
    client_msg=conn.recv(1024)
    #接收到的信息为编码的,在这里需要解码
    recvmsg=client_msg.decode('utf-8')
    #判断如果输入为“q”,则退出这个循环,关闭套接字
    if recvmsg=='q':
        break
    print('client msg:'+recvmsg)
    replymsg=input('reply:')
    conn.send(replymsg.encode('utf-8')) #发消息
#关闭第一个套接字
fwq.close()
#关闭新创建的套接字
conn.close()
# 我的笔记本
import socket
#创建一个套接字
client=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
'''连接这个地址和端口号,这个就像是打电话一样,这个是先
拨通电话号'''
client.connect(('容器节点所在主机的IP',888))
while 1:
    #输入你要发送的内容
    send_msg=input("你说:")
    #将发送过去的消息进行编码
    client.send(send_msg.encode('utf-8')) 
    #这个就是进行一个while循环结束的判断,不然就会成为死循环
    if send_msg=='q':
        break
    #将接收到的消息进行解码(最多能接收到的消息就1024个字节)
    back_msg=client.recv(1024).decode('utf-8')
    #打印出接收到的消息
    print(back_msg)
#关闭创建的套接字
client.close()

附iptables查看与删除命令

iptables -t nat -vnL POSTROUTING --line-number #查看

iptables -t nat -D POSTROUTING 6 #删除标号为6的规则

iptables -t nat -D DOCKER 6
iptables  -vnL DOCKER --line-number

iptables -D DOCKER 6
上一篇下一篇

猜你喜欢

热点阅读