通过Dockerfile来构建优化容器

回顾上一篇的操作上一篇:docker实践

上一篇文章中我们使用了daocloud.io/centos这个基础镜像,在基础镜像上面通过/bin/bash的交互模式启动容器,然后在上面做了一系列的操作,来部署我们的开发环境必备的软件nginx+php5.3+phpbrew+php7.1,部署完成后,我们使用了docker commit命令提交了这个镜像,用来作为以后快速部署测试,开发,生产环境的统一镜像,保证了系统的一致性。

但是这样部署是有很大的问题的:

1.构建的镜像特别的大
2.别人拿到这个镜像,无法了解构建流程

先说第一个问题

简单的说其实docker有点类似于git,git是管理代码,docker是管理容器,git的每一次提交都会把这一次我门做的所有的操作记录下来,以便于回滚和查询。docker也是类似,当我们提交的时候,这次提交的每一个命令都回生成一个layer(层),用于记录这个命令前后的文件变化。事实上造成docker镜像过大,主要原因就是layer多,也就是我们的命令执行过多,那么解决办法也就是要简化我们的命令数。

再说第二个问题

我们需要一个文件来记录,这个镜像装了哪些东西,启动了什么服务,做了什么修改,并且可以正确的构建出容器。比如php的composer ,javascript的npm,java的maven ,当写好构建项目所有的依赖,和操作,一键执行就可以构建我们想要的项目。

引出本文主角Dockerfile!

废话不多说,我们直接上代码,代码中涉及到的命令很好理解,大家也可以自行查询.dockerfile 命令介绍
# 表明我们需要的基础镜像
FROM daocloud.io/centos:6
# 作者
MAINTAINER Ice Dragon <517icedragon@gmail.com>
# 这里为了尽可能少的命令个数,我们把所有命令拼接起来
#install nginx/php-5.3/phpbrew/php-7.1 +default +mysql +pdo +fpm +curl +memcached
RUN yum install -y gcc \
    libxml2-devel \
    libxslt-devel \
    bzip2-devel \
    m4 \
    autoconf \
    libcurl-devel \
    libmemcached-devel \
    cyrus-sasl-devel \
    epel-release \
    libmcrypt \
    libmcrypt-devel \
    mcrypt \
    mhash \
    readline-devel \
    openssl* \
    wget \
    gcc+ \
    gcc-c++ \
    libtool && ln -s /usr/lib64/libssl.so /usr/lib/ && \
    rpm -ivh http://nginx.org/packages/centos/6/noarch/RPMS/nginx-release-centos-6-0.el6.ngx.noarch.rpm \
    && yum install -y nginx && yum install -y php && \
    curl -L -O https://github.com/phpbrew/phpbrew/raw/master/phpbrew && \
    chmod +x phpbrew && \
    mv phpbrew /usr/bin/phpbrew && \
    cd ~ && phpbrew init && \
    echo "[[ -e ~/.phpbrew/bashrc ]] && source ~/.phpbrew/bashrc" >> ~/.bashrc && \
    source ~/.phpbrew/bashrc && \
    wget http://www.atomicorp.com/installers/atomic && \
    sh ./atomic && \
    yum  install -y  php-mcrypt  libmcrypt  libmcrypt-devel supervisor openssh-server && \
    phpbrew install php-7.1.0 as php-7.1 +default +mysql +pdo +fpm +curl && \
    phpbrew switch php-7.1 && \
    wget https://launchpad.net/libmemcached/1.0/1.0.18/+download/libmemcached-1.0.18.tar.gz && \
    tar -zxvf libmemcached-1.0.18.tar.gz && \
    cd libmemcached-1.0.18 && \
    ./configure && \
    make && \
    make install && \
    phpbrew ext install https://github.com/php-memcached-dev/php-memcached php7 -- --disable-memcached-sasl && \
    # 配置php短标签和fpm监听端口
    # Update the php-fpm config file, php.ini enable <? ?> tags and quieten logging.
    sed -i "s/listen = \/root\/\.phpbrew\/php\/php-7\.1\/var\/run\/php-fpm\.sock/listen = 127\.0\.0\.1:9000/" /root/.phpbrew/php/php-7.1/etc/php-fpm.d/www.conf && \
    sed -i "s/short_open_tag = Off/short_open_tag = On/" /root/.phpbrew/php/php-7.1/etc/php.ini && \
    mkdir -p /etc/nginx/vhosts && rm -f /etc/nginx/nginx.conf && \
    # 配置ssh这样可以用ssh key 登录到容器
    # Config ssh login container
    sed -i "s/#RSAAuthentication yes/RSAAuthentication yes/" /etc/ssh/sshd_config && \
    sed -i "s/#PubkeyAuthentication yes/PubkeyAuthentication yes/" /etc/ssh/sshd_config && \
    ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key -P '' && \
    ssh-keygen -t rsa -f /etc/ssh/ssh_host_rsa_key -P '' && \
    ## Public keys dir
    mkdir -p ~/.ssh/id_rsa.pub/

# 这里我们可以使用ENV 来配置一些变量给容器内的程序使用
# Manually set up the nginx log dir,php.ini and php-fpm config file environment variables
ENV NGINX_LOG_DIR /var/log/nginx
ENV PHPINI_FILE_PAHT /root/.phpbrew/php/php-7.1/etc
ENV PHPFPM_FILE_PATH /root/.phpbrew/php/php-7.1/etc/php-fpm.d

# 这里表示我们的容器对外可以提供的端口,只是一种说明,并不能真正达到端口映射的功能,需要端口映射的话,要在启动的时候加 `-p 80:80` 类似这样进行映射 
# Expose nginx ssh
EXPOSE 80
EXPOSE 22

# 把一些我们写好的配置文件,添加到容器中
# Update the default nginx site with the config we created.
ADD config/nginx.conf /etc/nginx/nginx.conf
ADD config/upstream.conf.enabled /etc/nginx/conf.d/upstream.conf.enabled
ADD config/vhosts/* /etc/nginx/vhosts/
# Update the enable public keys
ADD config/id_rsa/*.pub.enabled /root/.ssh/id_rsa.pub/

# 这里配置我们的启动后执行的命令 `RUN`是在构建容器时执行 `CMD` 是在启动容器时执行。这里有个事情要注意,当执行启动容器的时候,容器会在执行`CMD`命令后立刻终止掉容器,所以要想让容器一直运行的话,必须启动一个不会挂起或终止的进程,这里我使用`/usr/sbin/sshd -D`这个命令,也可以用类似`tail -F /var/log/nginx/error.log`这样的命令
# start-up nginx and fpm and ssh
CMD service nginx start && \
    phpbrew init && \
    [[ -e ~/.phpbrew/bashrc ]] && \
    source ~/.phpbrew/bashrc && \
    phpbrew use php-7.1 && \
    phpbrew fpm start && \
    cat ~/.ssh/id_rsa.pub/*.pub.enabled > ~/.ssh/authorized_keys && \
    chmod 600 ~/.ssh/authorized_keys && \
    /usr/sbin/sshd -D

最后我非常感谢daocloud.io提供的云端免费测试功能,在云端可以快速构建,祝daocloud.io越做越好,同时可以为广大开发者提供更好的服务。
这是本项目的github地址, 更多详情请看README.md,欢迎大家fork && issue GitHub lizilong007/docker-partner

看一下使用dockerfile后镜像大小对比(dockerfile中安装的软件比我们上一篇安装的还要多)

$ docker images
REPOSITORY                     TAG                 IMAGE ID            CREATED             SIZE
daocloud.io/lizilong/partner   latest              f5bda9732147        12 hours ago        1.492 GB
daocloud.io/centos             v3                  98ef1bdd1555        43 hours ago        2.167 GB
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,530评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 86,403评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,120评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,770评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,758评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,649评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,021评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,675评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,931评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,659评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,751评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,410评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,004评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,969评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,042评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,493评论 2 343

推荐阅读更多精彩内容