docker容器迁移+容器与宿主机通信
- 本篇是上一篇配置Ubuntu 21.04镜像下的容器并实现运行python文件的续集
- 本篇部分内容也零星的记录在docker学习记录
docker容器迁移
- 参考:docker容器打包成镜像、镜像备份、镜像迁移(恢复)、发布到阿里云仓库
- 我是先以从仓库pull下来的ubuntu 21.04镜像创建容器并进行设置,然后现在想把配置好的容器做成一个可以复制移动的效果
- 方法:把容器打包成镜像,镜像可以压缩成tar文件传输,到目的地再解压导入镜像。
- 容器打包成镜像指令:
docker commit [-m="提交的描述信息"] [-a="创建者"] 容器名称|容器ID 生成的镜像名[:标签名]
- 解释:
-m= : 为镜像添加描述信息
-a= : 为镜像添加创建者信息
容器名称|容器ID : 当前要被打包的容器名称或容器ID
生成的镜像名[:标签名] : 指定镜像名称或标签名称
镜像名必须要全部小写,否则将不能打包
- 容器打包以后 在宿主机就会有新创的镜像,但是要移植的话还是需要压缩
压缩指令参考:介绍Docker容器迁移到其他服务器的5种方法的方法三 - 容器压缩指令:
可以使用“docker save”压缩镜像并将其迁移到新服务器。
docker save image-name > image-name.tar
- 在新服务器中,使用“docker load”将压缩镜像文件用于创建新镜像。
cat image-name.tar | docker load
附:ssh将本机文件传输至远程服务器:ssh传输文件
容器与宿主机通信
- 初步理解看这个:ubuntu-docker入门到放弃(五)docker网络管理
- 容器里面都是虚拟网卡eth0,它用veth-pair和宿主机形成映射关系,一般对应的宿主机网卡以v开头,查询对应关系的方法:16 如何找到docker中容器网卡外联的veth pair的另一张网卡
- 在容器运行
ip link show eth0
,在宿主机运行ip link show|grep id
找对应,id是容器查询出来的结果 - 问题陈述:单个容器发包给在宿主机的服务器,服务器可以sniff嗅探指定以v开头的网卡来抓包,那么多个容器与宿主机发包时,没查到一句sniff可以嗅探多网卡的方法,而用循环开放多个sniff嗅探不同网卡不知道为什么一个包都抓不到
- 解决方案:容器创建为桥接网络的模式(用docker run -i -t -d xxxx这样创建的用的就是桥接网络),创建完成后,在宿主机使用ifconfig一般在第一个会看到一个叫docker0的网卡,这是容器共用的网卡,所有sniff只需要嗅探docker0就可以抓到各个容器发送的包
杂碎
- 一开始没想到用桥接,也没想到docker0就是公用的bridge,做了一个python读取ifconfig输入并分割每组网卡信息,并获取容器对应的v开头的网卡名字,还是记录一下:
from scapy.all import *
import pprint
import os,re
import time
def packet_callback(packet):
pprint.pprint(packet)
def execCmd(cmd):
r = os.popen(cmd)
text = r.read()
r.close()
return text
if __name__ == '__main__':
num=3
command = "sudo su"
password = " "
os.system('echo %s | sudo -S %s' % (password, command))
# cmd="ip link show eth0"
#for i in range(num):
# os.system("docker exec -it -u root client%d /bin/bash" %(i+1))
# result=execCmd(cmd)
# os.system("exit")
#print(result)
eth_club=list()
i=1
#while True:
# os.system("docker stop client%d" %i)
# if i>=num:
# break
#else:
# i=i+1
i=1
while True:
# os.system("docker start client%d" %i)
# time.sleep(10)
result=execCmd("ifconfig")
#print("-------------------------------------------------------")
result=result.split("\n\n")
eth=result[len(result)-1-i]
eth=eth[0:11]
eth_club.append(eth)
if i>=num:
break
else:
i=i+1
print(type(eth_club[2]))
print(str(eth_club))
i=0
while True:
sniff(filter="ip src 192.168.0.2 ",prn=packet_callback,iface=eth_club[i],count=0)
if i>=num:
break
else:
i=i+1
- 这份代码就是所说的,循环开多个sniff一个包都收不到