docker:实例演示妙用export让容器和数据分离

简介:docker-export用于将容器打包成基础镜像,主要作用就是制作基础镜像,特别是在容器非常大的情况下,拉取了一个空白系统镜像,创建容器后安装了一堆自己需要的环境,就可以使用 export 命令打包成自己的基础镜像,作为后续使用。export 打包的镜像,使用 import 命令进行导入,导入时可以指定新的镜像名称,本地如有相同名称的镜像,则原有镜像的名称会被拿掉,赋予给新导入的镜像,原镜像变成只能通过镜像 ID 进行管理。export 导出的镜像不会保留历史记录。通过export制作的基础镜像可以压缩到很小例如几十Mb的存储空间,避免了多次提交后镜像越来越大的弊端,一定程度上实现了数据和容器相对高耦合,低内聚的目标。

历史攻略:

docker:容器打包成镜像

gin:通过dockerfile部署

docker:上传镜像到dockerhub

场景假设:你通过gin框架写了一套平台,并且内容很大可能有400G,并且都是存在于容器内,现在开发完成了,你希望将比较大的内容抽离出来,以挂载的方式分离到容器外,即分离到宿主机。这个时候,如果使用常规的docker-commit很可能造成新增到500G的更大的镜像。从简化思路出发,更推荐直接使用docker-export。

操作思路:

1、docker exec -it 容器id /bin/bash  # 进入容器
2、env # 主要记录容器内程序的运行环境变量,dockerfile构建时利用。
3、将需要的分离的内容cp到宿主机,删除容器内已经cp完成的内容。
4、docker export 你的当前容器id  > mygin-min.tar   #
5、docker import mygin-min.tar  # 会输出一个镜像id
6、docker tag 镜像id mygin-min:1.0.1
7、mkdir dockerbuild && cd dockerbuild/
8、nano Dockerfile
9、docker build -t mygin-min:1.0.2 .
10、docker save mygin-min:1.0.2 > mygin-env-min.tar
11、docker run xxxxxxx -v 步骤3的cp到宿主机的内容:容器内路径 xxxxx

案例实践:

1、拉取镜像并运行:(实际场景下,看项目情况而定,将tom-gin:1.0.0当成是已经写好的平台,并且内容很大,需要抽离数据),当前镜像:1.11GB

docker run --name test-gin -p 8889:8888 -d tomrunrunrun888/tom-gin:1.0.0

2、docker exec -it test-gin /bin/bash

3、env # 主要记录容器内程序的运行环境变量,dockerfile构建时利用。

HOSTNAME=34e0ae1a7b9f
PWD=/home/workspace
HOME=/root
GOLANG_VERSION=1.17.13
TERM=xterm
SHLVL=1
PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
GOPATH=/go
_=/usr/bin/env

4、将需要的分离的内容cp到宿主机,删除容器内已经cp完成的内容。

(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker cp test-gin:/go ./
(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker cp test-gin:/usr ./
(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# ll
total 16
drwxr-xr-x  4 root root 4096 Feb 10 01:37 ./
drwxr-xr-x 15 root root 4096 Feb 10 00:56 ../
drwxrwxrwx  5 root root 4096 Nov 19 23:08 go/
drwxr-xr-x 11 root root 4096 Jul 11  2022 usr/

docker exec -it test-gin /bin/bash
root@c0054afcd7d3:/# rm -rf go/
root@c0054afcd7d3:/# rm -rf /usr/*

5、docker export 你的当前容器id > mygin-min.tar

(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker export c0054afcd7d3  > mygin-min.tar 
(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# ls -lh
total 69M
drwxrwxrwx  5 root root 4.0K Nov 19 23:08 go
-rw-r--r--  1 root root  69M Feb 10 01:39 mygin-min.tar
drwxr-xr-x 11 root root 4.0K Jul 11  2022 usr

经过操作,此时导出的tar包只剩余69M了。只要肯copy到宿主机,你甚至可以压缩到只有几M的tar包。

6、docker import mygin-min.tar # 会输出一个镜像id

(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker import mygin-min.tar
sha256:273156792ebc223753e8f56a32eb06de0c2f1c55994e741533bfdd91a5f152c8
(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker images
REPOSITORY                     TAG       IMAGE ID       CREATED         SIZE
<none>                         <none>    273156792ebc   7 seconds ago   69.6MB

7、docker tag 镜像id mygin-min:1.0.1

8、mkdir dockerbuild && cd dockerbuild/

9、vim Dockerfile

FROM mygin-min:1.0.1
MAINTAINER "公众号: 玩转测试开发"

ENV HOSTNAME=34e0ae1a7b9f
ENV PWD=/home/workspace
ENV HOME=/root
ENV GOLANG_VERSION=1.17.13
ENV TERM=xterm
ENV SHLVL=1
ENV PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV GOPATH=/go
ENV _=/usr/bin/env
WORKDIR /home/workspace
EXPOSE 8888

ENTRYPOINT ["./main"]

10、docker build -t mygin-min:1.0.2 . 这一步会把环境变量重新加载回去。但是数据还没有。

(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export/dockerbuild# docker build -t mygin-min:1.0.2 .
Sending build context to Docker daemon  2.048kB
Step 1/14 : FROM mygin-min:1.0.1
 ---> 273156792ebc
Step 2/14 : MAINTAINER "公众号: 玩转测试开发"
 ---> Running in 822bc97e7890
Removing intermediate container 822bc97e7890
 ---> 9f623423bc0d
Step 3/14 : ENV HOSTNAME=34e0ae1a7b9f
 ---> Running in 04031a989016
Removing intermediate container 04031a989016
 ---> 241e6f5824c2
Step 4/14 : ENV PWD=/home/workspace
 ---> Running in 287d99725e30
Removing intermediate container 287d99725e30
 ---> 338e19249b5e
Step 5/14 : ENV HOME=/root
 ---> Running in ff68307a2696
Removing intermediate container ff68307a2696
 ---> 6bc22b29dce6
Step 6/14 : ENV GOLANG_VERSION=1.17.13
 ---> Running in d0250776e7a7
Removing intermediate container d0250776e7a7
 ---> d47be35f2db6
Step 7/14 : ENV TERM=xterm
 ---> Running in d9fad97cd5f7
Removing intermediate container d9fad97cd5f7
 ---> cb0b395ad653
Step 8/14 : ENV SHLVL=1
 ---> Running in 2a5941b59ab8
Removing intermediate container 2a5941b59ab8
 ---> bf19524455e5
Step 9/14 : ENV PATH=/go/bin:/usr/local/go/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
 ---> Running in 224cf673e46f
Removing intermediate container 224cf673e46f
 ---> 0d147b94e8fa
Step 10/14 : ENV GOPATH=/go
 ---> Running in 333359b0a016
Removing intermediate container 333359b0a016
 ---> 91eba633e064
Step 11/14 : ENV _=/usr/bin/env
 ---> Running in 5483e35eb198
Removing intermediate container 5483e35eb198
 ---> e6119392ecd3
Step 12/14 : WORKDIR /home/workspace
 ---> Running in 66cb64c574c8
Removing intermediate container 66cb64c574c8
 ---> ae1249005f75
Step 13/14 : EXPOSE 8888
 ---> Running in ad6667d35597
Removing intermediate container ad6667d35597
 ---> 248807df5de6
Step 14/14 : ENTRYPOINT ["./main"]
 ---> Running in 7d26cd2aa11f
Removing intermediate container 7d26cd2aa11f
 ---> 1bf36511411f
Successfully built 1bf36511411f
Successfully tagged mygin-min:1.0.2

11、docker save mygin-min:1.0.2 > mygin-env-min.tar

(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export/dockerbuild# docker save mygin-min:1.0.2 > mygin-env-min.tar
(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export/dockerbuild# ls -lh
total 69M
-rw-r--r-- 1 root root 373 Feb 10 01:42 Dockerfile
-rw-r--r-- 1 root root 69M Feb 10 01:42 mygin-env-min.tar

12、docker run xxxxxxx -v 步骤3的cp到宿主机的内容:容器内路径 xxxxx

(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker run -p 8866:8888 --name test-gin-new -v /home/write-pro/docker-export/go:/go -v /home/write-pro/docker-export/usr/:/usr -d mygin-min:1.0.2
9af7c34b7f94c96d5eede05b7fc44fd47160209073aff553294e78b0ecf2cc4c
(base) root@ci4vyvxi572ysx2s:/home/write-pro/docker-export# docker ps -a
CONTAINER ID   IMAGE                                COMMAND                  CREATED         STATUS         PORTS                                       NAMES
9af7c34b7f94   mygin-min:1.0.2                      "./main"                 4 seconds ago   Up 3 seconds   0.0.0.0:8866->8888/tcp, :::8866->8888/tcp   test-gin-new

13、访问页面检查结果:

https://mmbiz.qpic.cn/mmbiz_png/g5foreJ2Epp9kW8pg3OsDcQB4AEzvBJNnfl8oNyVoqDryFlEqIvOSkEOnl0KufKJDS0s3G4EbibqqyXmbj5hzqw/640?wx_fmt=png&wxfrom=5&wx_lazy=1&wx_co=1

至此,妙用export让容器和数据分离的基本流程和演示完成。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值