docker nginx-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
ldd /usr/local/nginx/sbin/nginx

會列出一大堆依賴庫,並且這些庫在不同的路徑。由於用到busybox,那就將這些庫復制到工作目錄的根目錄的lib即可。即/rootfs/lib/中,用這個工具找出來的是不完整的、還有c++運行庫等等。

我整理出來的完整依賴庫是:

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

 
       


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM