参考:http://www.chawenti.com/articles/26311.html
折腾了一天,参考《Docker 的 Image 太大,怎么变小?》做了一次

本人用lnmp1.2一键安装的环境抽出精简版的php环境。

步骤:
1、 在安装好php环境的容器,参考上面贴出的链接那篇文章的部分,做好基础工作:

#创建工作目录
mkdir /rootfs

#进入工作目录
cd /rootfs

#创建基础目录
mkdir -p bin etc lib proc sys tmp dev/pts usr/lib64 usr/bin usr/local/bin

#创建一个空的DNS服务用的文件
touch etc/resolv.conf

#复制名称解析文件
cp /etc/nsswitch.conf etc/nsswitch.conf

#创建用户和用户组文件
echo root:x:0:0:root:/:/bin/sh > etc/passwd
echo root:x:0: > etc/group

#创建php程序运行的用户
echo www:x:1001:1001:root:/:/bin/sh >> etc/passwd
echo www:x:1001: >> etc/group

#依赖库软链接
ln -s lib lib64

#工具软链接
ln -s bin sbin

#下载busybox,若网速慢可以用迅雷下载,然后复制到/sbin/busybox
curl -o /sbin/busybox http://busybox.net/downloads/binaries/1.21.1/busybox-x86_64

#加权限
chmod +x /sbin/busybox

#安装busybox
cp /sbin/busybox bin
busybox --install -s bin

2、找依赖,假设我的php安装在/usr/local/php中,用交互模式进入容器

运行命令查看依赖:

ldd /usr/local/php/sbin/php-fpm

会列出一大堆依赖库,并且这些库在不同的路径。由于用到busybox,那就将这些库复制到工作目录的根目录的lib即可。即/rootfs/lib/中,用这个工具找出来的是不完整的、还有c++运行库等等。

我整理出来的完整依赖库是:

ld-linux-x86-64.so.2
libbz2.so.1
libc.so.6
libcom_err.so.2
libcrypt.so.1
libcrypto.so.10
libcurl.so.4
libdl.so.2
libfreebl3.so
libfreetype.so.6
libgcc_s.so.1
libgssapi_krb5.so.2
libiconv.so.2
libidn.so.11
libjpeg.so.62
libk5crypto.so.3
libkeyutils.so.1
libkrb5.so.3
libkrb5support.so.0
liblber-2.4.so.2
libldap-2.4.so.2
liblzma.so.5
libm.so.6
libmcrypt.so.4
libnsl.so.1
libnspr4.so
libnss_files.so.2
libnss3.so
libnssutil3.so
libpcre.so.1
libplc4.so
libplds4.so
libpng15.so.15
libpthread.so.0
libresolv.so.2
librt.so.1
libsasl2.so.3
libselinux.so.1
libsmime3.so
libssh2.so.1
libssl.so.10
libssl3.so
libstdc++.so.6
libxml2.so.2
libz.so.1

当然根据你php安装的扩展而定,但是有些决不能缺少,
复制到rootfs/lib/

3、复制php程序

#复制PHP程序
cp -R /usr/local/php /rootfs/usr/local/php
#复制启动脚本
cp /etc/init.d/php-fpm /rootfs/php-fpm

将 /usr/local/php/php-fpm.conf 改为以下配置,守护进程方式运行改为no,不然 到时候只能用交互模式 docker run -it 那种。

[global]
pid = /usr/local/php/var/run/php-fpm.pid
error_log = /usr/local/php/var/log/php-fpm.log
log_level = notice
daemonize = no  #这里重要

[www]
listen = 0.0.0.0:9000  #这里也重要
listen.backlog = -1
#listen.allowed_clients = any
listen.owner = www
listen.group = www
listen.mode = 0666
user = www
group = www
pm = dynamic
pm.max_children = 10
pm.start_servers = 2
pm.min_spare_servers = 1
pm.max_spare_servers = 6
request_terminate_timeout = 100
request_slowlog_timeout = 0
slowlog = var/log/slow.log

4、打包tar文件
tar cf /rootfs.tar .

5、按ctrl+p+q使php容器后台运行,找个地方创建工作目录,并且写DockerFile。

#将rootfs.tar 复制出来,其实这个已经是一个基于busybox+php创建的小型系统了
docker cp technofiend/php:/rootfs.tar .

写DockerFile

FROM scratch
MAINTAINER Technofiend <2281551151@qq.com>
ADD rootfs.tar /
WORKDIR /home
EXPOSE 9000
ENTRYPOINT ["/php-fpm", "start"]

然后build系统

docker build -t technofiend/miniphp .

这里写图片描述
再看看体积,瘦了很多。比还没用过的centos系统还要少。
要是导出来再压缩的话,就只有50M左右,真是快速部署必不可少的玩意啊!

注意:体积少的镜像虽然可以减少了网络传输的时间,达到快速部署的目的,但体积少的容器某些功能例如busybox提供的,可能没有完整版的性能好。所以,还是看实际用途吧!
别忘了,要定期进行安全升级,不然很可能就会有安全隐患。

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐