Docker 使用心得(1)

docker VS 虚拟机

docker 不仅仅是虚拟机,具体细节我也不清楚,但这并不影响对docker的理解。把docker理解为:可以独立运行的一个进程,就好了。

比如说,我只需要一个PHP-FPM来运行PHP,而我的WEB服务器可以是在我MAC本地,也可以是存在另外的地方,可以是nginx,也可以是apache等。而不像虚拟机,一整个环境都是搭建好的。虽然docker也可以搭建这样一个环境,但是官方还是强烈建议服务粒度要细,一个容器只做一件事情

一开始我也是范了这个错误,把docker当成vbox一样的虚拟机,装环境,然后做文件夹共享,然后开发。这样的话,docker的优势就没有体现出来。特别是在win7下,docker还是基于vbox的,那会儿还感觉,docker反而把事情搞得麻烦了,还不如直接vbox来的直接。

关于镜像

基于centos自行搭建

线上环境,我用centos6.9居多。然后编译环境(php7.2+php-fpm),结果弄出来的镜像1.45G,吓到我了。然后从网上找了一些docker镜像瘦身的方法。我简单列了一下,可看看最后的说明。

使用官方镜像

像php,nginx等常用环境,官方都提供dockerfile(各种版本的,如基于alpine的php-cli等等),总有一款适合你。后期有更新,也可以跟上官方的脚步。同时也可以基于官方的基础镜像,自己再进行修改和扩充。

原则:线上环境,在哪个系统下使用,就在哪个系统下编译

PHP的环境,我用上述自行搭建的方式,然后精简一下,确实是可以跑起来的。但是,nginx这样弄就出错了,缺少一个nginx.pm这个文件,ldd没有显示出来

所以在线上环境,请勿使用系统移植这种方式

想要镜像小,推荐使用alpine这个系统,原始才5M大小,然后可以自行编译环境

个人推荐使用官方的构建,虽然我也不习惯目录的存放位置等。但是,一旦修改,那么后续就得自己维护,无形中增加了成本。

基于官方alpine的php-fpm二次构建

官方dockerfile的github网址,请点击这里

官方提供的是最基本的,官方提供一些基本的扩展直接安装,如:pdo_mysql,pdo_gd等,也提供pecl安装。而我用的环境里面有phalcon,redis,所以需要自行编译。(说明:按官方的方法安装redis扩展,会安装不上,提示一个.h文件不存在,具体什么文件,我一下子也忘了)

具体过程请见文章后面的说明

Nginx + PHP-FPM

上面说了,一个容器就做一个服务。那么,Nginx和FPM,该如何通信呢?如果是在一台机器上,首选unix socket,都不在一台机器上,那么可以使用TCP方式。当然,docker有Volume这个概念,也可以实现unix socket。

  docker run --rm -d --name fpm -v /Docker/app/www:/app:ro alpine_php-fpm:v1

  docker run --rm -d --name app --link fpm -v /Docker/app/www:/app:ro -v /Docker/app/server/config/nginx.conf:/etc/nginx/conf.d/app.conf:ro -p 9091:80 nginx1.14

这里是使用TCP通信,app(nginx)通过--link,链接到fpm(php-fpm)。

请注意,fpm也需要将文档目录用-v挂载进来,否则访问php文件的时候,会提示:File Not Found

这里分享一个删除所有停止的容器的命令

  docker ps -a | grep "Exited" | awk '{print $1}' | xargs docker rm

多个docker容器管理


既然一个容器只干一件事情,那么跑一个php的网站,至少需要3个容器(php,nginx,mysql),那么该如何统一部署管理这些容器呢?

简单一点,docker-compose,将一个项目的所用到的镜像组合起来,然后使用docker-compose up启动即可

当然再复杂一些,就需要用上k8s这类的了,这也是我需要学习的一个东西

附件

docker 瘦身方法

  1. 将dockerfile里面的命令合并,减少docker文件的Layers,达到减少镜像容量的目的。

  2. 将程序运行所需要的库全部找出来,找个mini的linux系统(如:busybox),打包成tar,然后将tar文件做成镜像。

      #/usr/bin
      mkdir /mini
      cd /mini
      mkdir bin etc dev dev/pts lib usr proc sys tmp var
      mkdir -p usr/lib64 usr/bin usr/local/bin
      mkdir app data
      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

      echo www:x:1001:1001:root:/:/bin/sh >> etc/passwd
      echo www:x:1001: >> etc/group

      ln -s lib lib64
      ln -s bin sbin

      curl -o /sbin/busybox https://busybox.net/downloads/binaries/1.21.1/busybox-x86_64
      chmod +x /sbin/busybox

      cp /sbin/busybox bin
      busybox --install -s bin

      cd /mini && cp /lib64/ld* ./lib64 \ 
          && ldd /opt/php/bin/php | awk -F '=>' '{print $2}' | awk '{print $1}' | grep "usr" | xargs -i cp {} ./usr/lib64/ \
          && ldd /opt/php/bin/php | awk -F '=>' '{print $2}' | awk '{print $1}' | grep -v "usr" | grep "lib64" | xargs -i cp {} ./lib64/

      cp -R /opt/php /mini/opt/

php-fpm 安装 phalcon

我是将phalcon,igbinary,installer这三个文件下载下来(在镜像里面下,太慢,跟网络有关),通过COPY的方式到镜像里面。installer是指:php composer的installer

dockerfile如下:

    FROM alpine_php72_fpm:v1

    COPY ./alpine_php_ext.sh \
    ./v3.3.2.zip \
    ./igbinary-2.0.6.tgz \
    ./php.ini \
    ./installer \
    /opt/src/

    RUN chmod +x /opt/src/alpine_php_ext.sh \
        && /opt/src/alpine_php_ext.sh

    EXPOSE 9000
    ENTRYPOINT ["php-fpm"]

alpine_php_ext.sh如下:

    apk update \
    && apk add --no-cache --virtual .build-deps bash autoconf gcc libc-dev make re2c libpng libpng-dev \
    && srcDir="/opt/src" && phalconVer="3.3.2" && igbVersion="igbinary-2.0.6" && redisVersion="redis-4.0.2" && xdebugVersion="xdebug-2.6.0" \
    &&  if [ ! -d $srcDir ]; then
        mkdir $srcDir
    fi  \
    && cd $srcDir \
    \
    && unzip v${phalconVer}.zip \
    && cd ./cphalcon-${phalconVer}/build/php7/64bits/ \
    && phpize \
    && ./configure \
    && make && make install \
    && echo "phalcon installed" && sleep 3s \
    && cd $srcDir \
    \
    && tar xf ${igbVersion}.tgz \
    && cd ${igbVersion} \
    && phpize \
    && ./configure \
    && make && make install \
    && cd $srcDir \
    && wget -c "https://pecl.php.net/get/${redisVersion}.tgz" -t 3 -T 3 \
    && tar xf ${redisVersion}.tgz \
    && cd ${redisVersion} \
    && phpize \
    && ./configure --enable-redis-igbinary=yes --enable-redis-lzf=yes \
    && make && make install \
    && cd $srcDir \
    && wget "https://pecl.php.net/get/${xdebugVersion}.tgz" -t 3 -T 3 \
    && tar xf ${xdebugVersion}.tgz \
    && cd ${xdebugVersion} \
    && phpize \
    && ./configure \
    && make && make install \
    && cd $srcDir \
    \
    && php installer --install-dir=/usr/bin --filename=composer \
    && docker-php-ext-install pdo_mysql \
    && docker-php-ext-install gd \
    && docker-php-ext-enable phalcon xdebug \
    && echo "ext-enable" \
    && sed -i -e "s/;daemonize\s*=\s*yes/daemonize = no/g" /usr/local/etc/php-fpm.conf \
    && echo "sed" \
    && find /usr/local/bin /usr/local/sbin -type f -perm +0111 -exec strip --strip-all '{}' + || true \
    && echo "strip" \
    && docker-php-source delete \
    && echo "delete" \
    && runDeps="$( \
        scanelf --needed --nobanner --format '%n#p' --recursive /usr/local \
            | tr ',' '\n' \
            | sort -u \
            | awk 'system("[ -e /usr/local/lib/" $1 " ]") == 0 { next } { print "so:" $1 }' \
    )" \
    && apk add --no-cache --virtual .php-rundeps $runDeps \
    && apk del .build-deps \
    \
    && rm -rf /tmp/pear ~/.pearrc \
    && apk del bash autoconf gcc libc-dev make re2c libpng libpng-dev \
    && cp ${srcDir}/php.ini /usr/local/etc/php/ \
    && rm -rf /opt/*
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,837评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,551评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,417评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,448评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,524评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,554评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,569评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,316评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,766评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,077评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,240评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,912评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,560评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,176评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,425评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,114评论 2 366
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,114评论 2 352

推荐阅读更多精彩内容

  • docker基本概念 1. Image Definition 镜像 Image 就是一堆只读层 read-only...
    慢清尘阅读 8,739评论 1 21
  • runoob-docker教程 总结 查看ip 查看容器运行状态(cpu和内存这些) 进入容器内进行命令行操作 使...
    tianmac阅读 1,220评论 1 1
  • 听说都是思想者。拙见 世间哪有真理,其实都是拙见 这一期的拙见主题是心安之处。 创始人田延友说,每次的主题确定用了...
    memelily阅读 498评论 0 0
  • 听说全国已经开始大面积降温啦!!! 在过年的前夕, 春运来临之际! 劝君穿着棉裤走, 寒潮来袭不会抖~ 不然历尽千...
    韶关东菱阅读 152评论 0 0
  • 今天孩子学校开家长会。我在那里特别痛苦。我很认真的记录,恐怕老师说的东西,我记不全。可是怎么才能让他理解和做...
    小狮子的狼妈妈阅读 122评论 0 0