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一个包都收不到

posted on 2022-07-22 22:02  2002ljy  阅读(455)  评论(0编辑  收藏  举报

导航

Live2D