简介: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、访问页面检查结果:
至此,妙用export让容器和数据分离的基本流程和演示完成。