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:::root:/:/bin/sh > etc/passwd
echo root:x:: > etc/group #创建php程序运行的用户
echo www:x:::root:/:/bin/sh >> etc/passwd
echo www:x:: >> 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
ldd /usr/local/nginx/sbin/nginx

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

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

ldd /usr/local/sbin/php-fpm
linux-vdso.so. (0x00007fff2cf62000)
libcrypt.so. => /lib/x86_64-linux-gnu/libcrypt.so. (0x00007fd1cc915000)
libresolv.so. => /lib/x86_64-linux-gnu/libresolv.so. (0x00007fd1cc6fe000)
libedit.so. => /usr/lib/x86_64-linux-gnu/libedit.so. (0x00007fd1cc4c5000)
libtinfo.so. => /lib/x86_64-linux-gnu/libtinfo.so. (0x00007fd1cc29b000)
librt.so. => /lib/x86_64-linux-gnu/librt.so. (0x00007fd1cc093000)
libz.so. => /lib/x86_64-linux-gnu/libz.so. (0x00007fd1cbe78000)
libm.so. => /lib/x86_64-linux-gnu/libm.so. (0x00007fd1cbb77000)
libdl.so. => /lib/x86_64-linux-gnu/libdl.so. (0x00007fd1cb973000)
libnsl.so. => /lib/x86_64-linux-gnu/libnsl.so. (0x00007fd1cb75b000)
libxml2.so. => /usr/lib/x86_64-linux-gnu/libxml2.so. (0x00007fd1cb3f4000)
libssl.so.1.0. => /usr/lib/x86_64-linux-gnu/libssl.so.1.0. (0x00007fd1cb193000)
libcrypto.so.1.0. => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0. (0x00007fd1cad96000)
libcurl.so. => /usr/lib/x86_64-linux-gnu/libcurl.so. (0x00007fd1cab22000)
libc.so. => /lib/x86_64-linux-gnu/libc.so. (0x00007fd1ca777000)
libbsd.so. => /lib/x86_64-linux-gnu/libbsd.so. (0x00007fd1ca567000)
libpthread.so. => /lib/x86_64-linux-gnu/libpthread.so. (0x00007fd1ca34a000)
/lib64/ld-linux-x86-.so. (0x00007fd1cd911000)
liblzma.so. => /lib/x86_64-linux-gnu/liblzma.so. (0x00007fd1ca127000)
libidn.so. => /usr/lib/x86_64-linux-gnu/libidn.so. (0x00007fd1c9ef3000)
librtmp.so. => /usr/lib/x86_64-linux-gnu/librtmp.so. (0x00007fd1c9cd6000)
libssh2.so. => /usr/lib/x86_64-linux-gnu/libssh2.so. (0x00007fd1c9aad000)
libgssapi_krb5.so. => /usr/lib/x86_64-linux-gnu/libgssapi_krb5.so. (0x00007fd1c9862000)
libkrb5.so. => /usr/lib/x86_64-linux-gnu/libkrb5.so. (0x00007fd1c958e000)
libk5crypto.so. => /usr/lib/x86_64-linux-gnu/libk5crypto.so. (0x00007fd1c935d000)
libcom_err.so. => /lib/x86_64-linux-gnu/libcom_err.so. (0x00007fd1c9159000)
liblber-2.4.so. => /usr/lib/x86_64-linux-gnu/liblber-2.4.so. (0x00007fd1c8f4a000)
libldap_r-2.4.so. => /usr/lib/x86_64-linux-gnu/libldap_r-2.4.so. (0x00007fd1c8cf8000)
libgnutls-deb0.so. => /usr/lib/x86_64-linux-gnu/libgnutls-deb0.so. (0x00007fd1c89d9000)
libhogweed.so. => /usr/lib/x86_64-linux-gnu/libhogweed.so. (0x00007fd1c87aa000)
libnettle.so. => /usr/lib/x86_64-linux-gnu/libnettle.so. (0x00007fd1c8578000)
libgmp.so. => /usr/lib/x86_64-linux-gnu/libgmp.so. (0x00007fd1c82f5000)
libgcrypt.so. => /lib/x86_64-linux-gnu/libgcrypt.so. (0x00007fd1c8014000)
libkrb5support.so. => /usr/lib/x86_64-linux-gnu/libkrb5support.so. (0x00007fd1c7e08000)
libkeyutils.so. => /lib/x86_64-linux-gnu/libkeyutils.so. (0x00007fd1c7c04000)
libsasl2.so. => /usr/lib/x86_64-linux-gnu/libsasl2.so. (0x00007fd1c79e8000)
libp11-kit.so. => /usr/lib/x86_64-linux-gnu/libp11-kit.so. (0x00007fd1c77a2000)
libtasn1.so. => /usr/lib/x86_64-linux-gnu/libtasn1.so. (0x00007fd1c758e000)
libgpg-error.so. => /lib/x86_64-linux-gnu/libgpg-error.so. (0x00007fd1c737c000)
libffi.so. => /usr/lib/x86_64-linux-gnu/libffi.so. (0x00007fd1c7173000)
ldd /usr/local/nginx/sbin/nginx
linux-vdso.so. (0x00007fff3d5dd000)
libdl.so. => /lib/x86_64-linux-gnu/libdl.so. (0x00007f7f01b3f000)
libpthread.so. => /lib/x86_64-linux-gnu/libpthread.so. (0x00007f7f01922000)
libcrypt.so. => /lib/x86_64-linux-gnu/libcrypt.so. (0x00007f7f016eb000)
libpcre.so. => /lib/x86_64-linux-gnu/libpcre.so. (0x00007f7f0147d000)
libssl.so.1.0. => /usr/lib/x86_64-linux-gnu/libssl.so.1.0. (0x00007f7f0121c000)
libcrypto.so.1.0. => /usr/lib/x86_64-linux-gnu/libcrypto.so.1.0. (0x00007f7f00e1f000)
libz.so. => /lib/x86_64-linux-gnu/libz.so. (0x00007f7f00c04000)
libxml2.so. => /usr/lib/x86_64-linux-gnu/libxml2.so. (0x00007f7f0089d000)
libxslt.so. => /usr/lib/x86_64-linux-gnu/libxslt.so. (0x00007f7f0065d000)
libexslt.so. => /usr/lib/x86_64-linux-gnu/libexslt.so. (0x00007f7f00447000)
libperl.so.5.20 => /usr/lib/x86_64-linux-gnu/libperl.so.5.20 (0x00007f7f00086000)
libm.so. => /lib/x86_64-linux-gnu/libm.so. (0x00007f7effd85000)
libc.so. => /lib/x86_64-linux-gnu/libc.so. (0x00007f7eff9da000)
/lib64/ld-linux-x86-.so. (0x00007f7f01d43000)
liblzma.so. => /lib/x86_64-linux-gnu/liblzma.so. (0x00007f7eff7b7000)
libgcrypt.so. => /lib/x86_64-linux-gnu/libgcrypt.so. (0x00007f7eff4d6000)
libgpg-error.so. => /lib/x86_64-linux-gnu/libgpg-error.so. (0x00007f7eff2c4000)

复制相应的.so包到rootfs目录下

3、复制php程序

#复制PHP程序
cp -R /usr/local/php /rootfs/usr/local/php
cp -R /usr/local/nginx /rootfs/usr/local/nginx
cp -R /usr/local/etc /rootfs/usr/local

4、打包tar文件

tar cf /rootfs.tar .

5、创建DockerFile

#将rootfs.tar 复制出来,其实这个已经是一个基于busybox+nginx+php创建的小型系统了
docker cp ngx01:/rootfs.tar .
FROM scratch
ADD rootfs.tar /
WORKDIR /usr/local/nginx/ptweb
RUN apt-key adv --recv-keys --keyserver keyserver.ubuntu.com 3B4FE6ACC0B21F32 \
&& apt-get update \
&& apt-get install supervisor -y \
&& apt-get install cron -y \
&& /bin/ln -svf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& echo 'Asia/Shanghai' >/etc/timezone \
&& ln -svf /usr/local/nginx/sbin/nginx /usr/sbin/nginx \
&& apt-get autoclean -y \
&& apt-get clean -y \
&& apt-get autoremove -y
EXPOSE
ENTRYPOINT ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisord.conf"]

然后build系统

docker build -t ngx-php-supervisor:v01 .

或者使用已经封装过的rootfs.tar:https://github.com/lvelvis/docker-debian-artifacts/releases/download/v1.1/rootfs.tar.xz

												

docker nginx-php容器镜像瘦身优化的更多相关文章

  1. Docker容器镜像瘦身的三个小窍门(转)

    [转自:http://dockone.io/article/8174] 在构建Docker容器时,我们应尽可能减小镜像的大小.使用共享层的镜像尺寸越小,其传输和部署速度越快. 不过在每个RUN语句都会 ...

  2. Docker系列之镜像瘦身(五)

    前言 本节我们来讲讲在我们在构建镜像过程中不出问题,同时使得最后所构建的镜像文件大小尽可能最小,温馨提示:文中大图均可点击放大查看详细信息. 缓存(cache) Docker的优势之一在于提供了缓存, ...

  3. docker镜像瘦身思路

    docker镜像瘦身思路 一.简介 docker镜像太大,带来了以下几个问题: 存储开销 这块影响其实不算很大,因为对服务器磁盘来说,15GB的存储空间并不算大,除非用户服务器的磁盘空间很紧张 部署时 ...

  4. 包建强的培训课程(6):Android App瘦身优化

    v\:* {behavior:url(#default#VML);} o\:* {behavior:url(#default#VML);} w\:* {behavior:url(#default#VM ...

  5. 三个技巧帮助Docker镜像瘦身

    在构建Docker容器时,应该尽量想办法获得体积更小的镜像,因为传输和部署体积较小的镜像速度更快. 但RUN语句总是会创建一个新层,而且在生成镜像之前还需要使用很多中间文件,在这种情况下,该如何获得体 ...

  6. 使用 Docker 部署 Node 应用 - 镜像文件尺寸的优化

    前面 使用 Docker 部署 Node 应用 一文中完成了镜像的创建和运行,不过生成的镜像还有些粗糙,需要进一步优化. 镜像的优化 通过 docker images 看到简单的一个 node 服务端 ...

  7. 我可以减肥失败,但我的 Docker 镜像一定要瘦身成功!

    作者|徐伟 来源|尔达 Erda 公众号 ​ 简介 容器镜像类似于虚拟机镜像,封装了程序的运行环境,保证了运行环境的一致性,使得我们可以一次创建任意场景部署运行.镜像构建的方式有两种,一种是通过 do ...

  8. Android性能优化系列之apk瘦身

    Android性能优化系列之布局优化 Android性能优化系列之内存优化 为什么APK要瘦身.APK越大,在下载安装过程中.他们耗费的流量会越多,安装等待时间也会越长:对于产品本身,意味着下载转化率 ...

  9. Docker之Alpine制作镜像且上传至阿里云

    目的: Alpine制作jdk镜像 Alpine制作jre镜像(瘦身) Docker镜像上传至阿里云 Alpine制作jdk镜像 alpine Linux简介 Alpine Linux是一个轻型Lin ...

随机推荐

  1. dataGridView1_RowEnter事件与dataGridView1.CurrentRow一起使用错误问题

    在使用DataGridView想在选项行发生改变时获得当前行的,于是使用了RowEnter 但是获得数据却不对,总是获得前一个被选中的行,比如第一次选中谭经理,再选中王海霞,数据得到却是谭经理的 从事 ...

  2. php xdebug的配置、调试、跟踪、调优、分析

    xdebug 的 profiler 是一个强大的工具,它能分析 PHP 代码,探测瓶颈,或者通常意义上来说查看哪部分代码运行缓慢以及可以使用速度提升.Xdebug 2 分析器输出一种兼容 cacheg ...

  3. Jupyter Notebook 打开方法

    直接在文件资源管理器的地址栏中输入Jupyter notebook ,即可打开当前目录下的Jupyter.比之前右键打开power shell更方便

  4. 前端通过js获取微信公众号用户的唯一标识符openId

    微信公众号程序开发的时候,获取用户信息的时候,需要用到用户的openId,openId是微信用户的唯一标识符,这个操作可以后台实现也可以前端实现,之前项目里是通过后台来获取的,好像用到了一些三方的包, ...

  5. Bootstrap初始化过程源码分析--netty客户端的启动

    Bootstrap初始化过程 netty的客户端引导类是Bootstrap,我们看一下spark的rpc中客户端部分对Bootstrap的初始化过程 TransportClientFactory.cr ...

  6. IOS—— strong weak retain assign 学习

    转自:http://wenzongliang.iteye.com/blog/1746604 简单讲strong等同retain weak比assign多了一个功能,当对象消失后自动把指针变成nil,好 ...

  7. Java集合目录

    java集合学习(1):集合框架 java集合学习(2):Map和HashMap Java集合学习(4):HashTable Java集合学习(5):LinkedHashMap Java集合学习(6) ...

  8. 常用SQL语句分享

    前言:  日常工作或学习过程中,我们可能会经常用到某些SQL,建议大家多多整理记录下这些常用的SQL,这样后续用到会方便很多.笔者在工作及学习过程中也整理了下个人常用的SQL,现在分享给你!可能有些S ...

  9. snowflake时间回退问题思考

    算法比较简单,每个id-generator负责生成的ID由3部分组成,41位时间戳可以表示到毫秒,10bit worker-id内部可自行划分,比如3位表示IDC,7位表示机器.最后12位是在一毫秒的 ...

  10. elastic date时区问题解决办法

    之前介绍filter date插件时就谈到时区问题,但是没有说明白.最近在使用range查询时间范围内的数据时出现了数据量不一致的情况.特地了解了下ELK Stack中关于时区的问题. 问题: 使用k ...