docker php环境容器大瘦身
参考: 折腾了一天,参考《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
然后build系统
docker build -t technofiend/miniphp .
再看看体积,瘦了很多。比还没用过的centos系统还要少。 要是导出来再压缩的话,就只有50M左右,真是快速部署必不可少的玩意啊!
注意:体积少的镜像虽然可以减少了网络传输的时间,达到快速部署的目的,但体积少的容器某些功能例如busybox提供的,可能没有完整版的性能好。所以,还是看实际用途吧! 别忘了,要定期进行安全升级,不然很可能就会有安全隐患。