docker镜像的导出和导入以及导入后运行

当在虚拟机上docker镜像能够成功运行起来后,接下来需要把虚拟机上的镜像从虚拟机上导出然后导入到服务器上并运行

  1. 构建镜像,使用docker-compose --compatibility build 命令构建镜像,这时docker-compose.yml文件是用来构建镜像的,所以里面要写的是构建镜像的语句(可以参考前几篇docker文章),构建前把之前的镜像删除掉,批量删除某前缀的镜像命令如下,把xxx改为前缀即可
docker images |grep xxx | awk -F' ' '{print $1}' | xargs docker rmi
  1. 构建完成镜像之后,导出成tar包,导出脚本如下,需要修改的地方就是第二行到第四行,tmp.txt的作用是限定导出哪些镜像,BAKDIR是定一个导出tar包的存放位置,LOGDIR是定一个日志位置方便查看是否导出报错
LIST=""
TXT=/home/ljy/Downloads/tmp.txt
BAKDIR=/home/ljy/Downloads/andawell
LOGDIR=/home/ljy/Downloads/andawell/log
LOGFILE=$LOGDIR/bak.`date +%Y%m%d`.log

[ ! -d $BAKDIR ] && mkdir -p $BAKDIR
[ ! -d $LOGDIR ] && mkdir -p $LOGDIR

if [ -n "$LIST" ]
then
        for list in $LIST
        do
                RESLIST=`docker images |grep $list | awk '{print $1}'`
                for reslist in $RESLIST
                do
                RESTAG=`docker images |grep "$reslist" |awk '{a=$1":"$2;print a }'`
                BAKNAME=`docker images |grep "$reslist" |awk '{a=$1":"$2;print a }'|sed 's/\//_/g'`
                /usr/bin/docker save $RESTAG -o $BAKDIR/$BAKNAME.tar  >> $LOGFILE 2>&1
                done
        done
else
        RESLIST=`cat $TXT|awk '{print $1}'`
        for reslist in $RESLIST
        do
                RESTAG=`docker images |grep "$reslist" |awk '{a=$1":"$2;print a }'`
                BAKNAME=`docker images |grep "$reslist" |awk '{a=$1":"$2;print a }'|sed 's/\//_/g'`
                /usr/bin/docker save $RESTAG -o $BAKDIR/$BAKNAME.tar  >> $LOGFILE 2>&1
        done
        /usr/bin/rm -f $TXT
fi

if [ -s $LOGFILE ]
then
        echo -e "\033[31mERROR:Images Backup Failed!\033[0m"
        echo -e "\033[31mPlease View The Log Lile : $LOGFILE\033[0m"
else
        /usr/bin/rm -f $LOGFILE
fi

tmp.txt文件内容如下

awxx508_hardware-service    latest
awxx508_materials-service   latest
awxx508_auth-service        latest
awxx508_upms-service        latest
awxx508_web                 latest
awxx508_api-gateway         latest
awxx508_registery-center    latest
  1. 把导出的tar包传到服务器上,然后使用导入脚本,把tar包转为docker镜像,批量导入镜像脚本如下,需要修改的地方就是TARDIR,这个脚本会把这个目录下的所有tar包转化为docker镜像
#!/bin/sh

STATE=""
RECEIVE=$1
TARDIR="/home/ljy/Downloads/andawell"
SUFFIX="*.tar"
LIST=`ls $TARDIR/$SUFFIX`
LOGFILE=$TARDIR/import.error.`date +%Y%m%d`.log
BAKLOGFILE=$TARDIR/bak.`date +%Y%m%d`.log

STATEIMPORT() {
for i in $STATE
do
/usr/bin/docker load -i $i >/dev/null 2>>$LOGFILE
done
}

RECEIVEIMPORT() {
for i in $RECEIVE
do
/usr/bin/docker load -i $i >/dev/null 2>>$LOGFILE
done
}

LISTIMPORT() {
for i in $LIST
do
/usr/bin/docker load -i $i >/dev/null 2>>$LOGFILE
done
}

IMAGESBAK(){
IMGINFO=`docker images |awk '{print $1,$2,$3}'|sed 1d >> $TARDIR/tmp.txt`
RESLIST=`/usr/bin/cat $TARDIR/tmp.txt |awk '{print $1}' `
for i in $RESLIST
do
    RESTAG=`docker images |grep "$i" |awk '{a=$1":"$2;print a }'`
    BAKNAME=`docker images |grep "$i" |awk '{a=$1":"$2;print a }'|sed 's/\//_/g'`
    /usr/bin/docker save $RESTAG -o $TARDIR/$BAKNAME_`date +%Y%m%d`.tar >/dev/null 2>>$BAKLOGFILE
done
if [ -s $BAKLOGFILE ]
then
    echo -e "\033[31mERROR:Images Backup Failed!\033[0m"
    echo -e "\033[31mPlease View The Log Lile : $BAKLOGFILE\033[0m"
else
    /usr/bin/rm -f $BAKLOGFILE
fi
/usr/bin/rm -f $TARDIR/tmp.txt
}

/usr/bin/rm -f $TARDIR/*.log
##read -p "Whether to backup the current images[y/n]:" INPUT
if [[ "n" = "y" ]] || [[ "n" = "Y" ]]
then
    IMAGESBAK
else
    if [[ -n "$RECEIVE" ]] || [[ -n "$STATE" ]]
    then
        if [ -n "$RECEIVE" ]
        then
                RECEIVEIMPORT
        else
                STATEIMPORT
        fi
    else
        LISTIMPORT
    fi
fi

##ERROR Output
if [ -s $LOGFILE ]
then
    echo -e "\033[31mERROR:Images Import Failed!\033[0m"
    echo -e "\033[31mPlease View The Log Lile : $LOGFILE\033[0m"
else
    /usr/bin/rm -f $LOGFILE
fi

接下来的操作就和之间使用docker-compose启动服务一样了,启动的docker-compose.yml如下(修改需要修改的端口号、数据库版本、挂载目录、镜像名称等即可使用)

version: '3'
services:
 myMysql:
   image: mysql:5.7.26
   container_name: myMysql
   restart: always
   environment:
     TZ: Asia/Shanghai
     MYSQL_ROOT_PASSWORD: root
   command:
     --lower_case_table_names=1
   ports:
     - 5036:3306
   deploy:
    resources:
     limits:
      memory: 3072M 
   volumes:
     - /usr/local/andawell/work/mysql/data:/var/lib/mysql
 registery-center:
  image: register
  restart: always
  hostname: registry-center
  ports: 
   - 5000:5000
  deploy:
   resources:
    limits:
     memory: 3072M
 upms-service:
  image: upms
  restart: always
  depends_on:
   - registery-center
  ports:
   - 5003:5003
  deploy:
   resources:
    limits:
     memory: 3072M
 auth-service:
  image: auth
  restart: always
  depends_on:
   - upms-service
  ports:
   - 5002:5002
  deploy:
   resources:
    limits:
     memory: 3072M
 materials-service:
  image: materials
  restart: always
  depends_on:
   - auth-service
  ports: 
   - 5009:5009
  deploy:
   resources:
    limits:
     memory: 3072M
 hardware-service:
  image: hardware
  restart: always
  depends_on:
   - materials-service
  ports: 
   - 5008:5008
  deploy:
   resources:
    limits:
     memory: 3072M
 api-gateway:
  image: api-gateway
  restart: always
  depends_on:
   - materials-service
  ports: 
   - 5010:5010
  deploy:
   resources:
    limits:
     memory: 2048M
 web:
  image: web
  restart: always
  ports:
   - 5066:5066
  deploy:
   resources:
    limits:
     memory: 2048M
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值