最近学习 docker,看到了这样一篇文章《Docker 的 Image 太大,怎么变小?》,原博客地址没找到,感兴趣的可以移步原创的开源项目
一、基本概念:
- Docker 不是虚拟机 (切记)
- Docker 里面的程序运行时不需要完整的操作系统!
- CoreOS,RHEL, Ubuntu, CentOS,等等等,它们都是一个操作系统!
二、步骤
- 使用 Busybox 的 Install 命令创建一个最小化的系统环境
- 删除不必要的各种系统文件,具体哪些是不必要的,那就得需要具体程序具体分析,楼主花了大量时间来分析每个程序,现在楼主几乎可以把这些APP的依赖项倒着背出来。
- 将这些文件打包成 rootfs.tar
- 使用 Dockerfile 的 ADD 指令用 rootfs.tar 生成 Image
三、详细操作
1.准备工作
#切换至 Docker 目录
cd Docker
#创建 redis2,mredis目录
mkdir redis2 mredis
2.使用 Busybox 的 Install 命令创建一个最小化的系统环境
cd redis2
vim Dockerfile
#文件内容如下
redis2/Dockerfile 文件内容:
FROM redis:2.8.13
USER root
RUN mkdir /rootfs
WORKDIR /rootfs
RUN mkdir bin etc dev dev/pts lib usr proc sys tmp
RUN mkdir -p usr/lib64 usr/bin usr/local/bin
RUN touch etc/resolv.conf
RUN cp /etc/nsswitch.conf etc/nsswitch.conf
RUN echo root:x:0:0:root:/:/bin/sh > etc/passwd
RUN echo root:x:0: > etc/group
RUN ln -s lib lib64
RUN ln -s bin sbin
#busybox install
ADD https://busybox.net/downloads/binaries/1.21.1/busybox-x86_64 /sbin/busybox
RUN chmod +x /sbin/busybox
RUN cp /sbin/busybox bin
RUN busybox --install -s bin
#复制 redis-server
RUN cp /usr/local/bin/redis-server usr/bin/redis-server
#复制所需依赖
RUN bash -c "cp /lib/x86_64-linux-gnu/lib{m,dl,pthread,c}.so.* lib64"
RUN cp /lib64/ld-linux-x86-64.so.2 lib64/
RUN tar cf /rootfs.tar .
创建 rootfs.tar
# -t 标签
docker builder -t mdemo/redis2 ./
# 开启容器 并且复制到本地
docker run -itd medmo/redis2
docker cp 容器ID:/rootfs.tar ./
docker stop 容器ID
3.构建极简 redis image
cd ../mredis
vim Dockerfile
mredis/Dockerfile 文件内容:
FROM scratch
MAINTAINER zhuzq <1228676735@qq.com>
ADD rootfs.tar /
WORKDIR /data
VOLUME /data
EXPOSE 6379
ENTRYPOINT ["/usr/bin/redis-server"]
CMD ["--port", "6379"]
运行
docker build -t microbox/redis ./
# 运行容器 --appendonly yes 数据持久化
docker run -itd -p 6379:6379 -v $PWD/data:/data microbox/redis --appendonly yes