如果在docker run
命令里没有配置-p
参数,后来又需要加上该怎么办?
方法一(尝试无效
有教程说编辑/var/lib/docker/containers/[容器ID]/下
的文件修改
但是我尝试后不起作用==
方法二:配置IPTABLES
前提
- 比如我的某个容器ip是172.16.0.2,在我的服务器上,想追加开放888端口
- 已经通过
docker network create --subnet=172.16.0.0/16 mynetwork
创建了子网,通过ifconfig
查看得知mynetwork
对应的网桥是br-e5d905c72d10
- 为了验证容器端口正确开放,需用另一台电脑(我的笔记本)进行测试
开始配置
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
网友评论