本地构建web开发环境
生成一个镜像一般有两种方式:
- 以一个镜像为基础,修改他的容器,最终将修改后的容器提交,成为新的镜像;
- 撰写Dockerfile,通过docker build,一步生成最终想要的镜像。
不论是哪种方式生成的镜像,都可以最终被上传到镜像托管服务,并在任何一处能够运行docker的环境下拉取,并运行起来。
一步步自己修改
首先把centos的源拉下来(使用了daocloud的镜像):
docker pull daocloud.io/library/centos:6
然后就可以把centos跑起来啦:
docker run -i -t -p 80 centos /bin/bash
跑起来的同时指定了容器的映射端口80。跑起来之后,在你面前的就是一个centos,你可以像操作任意一台linux的机器一样,在里面装软件,传文件进去,编译、checkout代码等等一系列的事情。
查看container的id:
docker ps
最终创建一个自己的镜像:
docker commit -m "web-dev" -a "meijing0114" 86963dfef869 meijing0114/centos-web-dev
接下来要着重说一说利用Dockerfile的这种方式,因为它一劳永逸。
撰写Dockerfile
首先链接docker:
$ docker-machine ssh development
随后创建一个目录:
$ mkdir mydocker
进入目录并打开Dockerfile:
$ cd mydocker$ vim ./Dockerfile
本文主要把Dockerfile分成了几个部分,第一部分是一些基础的设置,第二部分涉及到php相关的环境,第三部分涉及到nginx相关的环境,第四部分则是预留之后的扩展,现在放了一些端口暴露的配置。#
标识注释。
dockerfile的第一部分
先来看第一部分的内容:
# 以daocloud提供的centos6为基准,daocloud是国内一家提供镜像托管等服务的公司
FROM daocloud.io/library/centos:6
# 声明维护者
MAINTAINER meijing0114 <525937005@qq.com>
# 设置两个环境变量
ENV src-dir /data/sourcesENV run-dir /data/env/runtime
# 安装必须的软件包
RUN yum install -y \
git \
svn \
vim \
wget \
gcc \
gcc-c++ \
m4 \
openssl \
openssl-devel \
zlib \
pcre \
pcre-devel \
&& yum clean all
# 创建必须的文件夹:
RUN mkdir /data \
&& mkdir /data/admin \
&& mkdir /data/env \
&& mkdir /data/env/runtime \
&& mkdir /data/sources \
&& mkdir /data/logs \
&& chmod 666 /data/logs
FROM命令说明了本镜像是基于哪个镜像的;
ENV命令设置环境变量,为了之后的命令进行替换;
RUN命令一般有两种形式:
-
RUN <command>
: 等价于在shell中执行命令 -
RUN ["executable", "param1", "param2"]
:可以用来指定执行的shell, 适用于没有shell的情况RUN命令的结果会在base image上一层层的进行叠加,""可以用来一次执行多个命令,同时由于docker会有cache,所以多使用""的方式把命令写在一起,能够避免docker错误的cache住诸如“apt-update”这类命令。
如果你想要指定执行的shell,也可以通过如下的方式:
RUN ["/bin/bash", "-c", "echo hello"]
需要注意的是RUN命令和CMD以及ENTRYPOINT命令的差异,后面的两个命令是在容器启动了之后进行运行的。
第二部分
这部分是针对php的一些操作,主要是php附属的libmcrypt等必备库的解压、编译和安装。然后还有基本php的配置文件的创建、修改。
############################### 下载(拷贝)php的依赖包编译安装
# 拷贝libmcrypt的包并编译
ADD libmcrypt-2.5.8.tar.gz $src-dirWORKDIR $src-dir/libmcrypt-2.5.8RUN ./configure --prefix=/data/env/runtime/libmcrypt-2.5.8 \&& make \&& make install \&& make clean # php本身ADD ./php-5.5.30.tar.gz $src-dirWORKDIR $src-dir/php-5.5.30RUN ./configure --prefix=/data/env/runtime/php-5.5.30 --with-config-file-path=/data/env/runtime/php-5.5.30/etc --enable-opcache --enable-fpm --with-mysql=mysqlnd --with-pdo-mysql=mysqlnd --with-mysqli=mysqlnd --enable-xml --enable-pcntl --with-gettext=shared --enable-sysvmsg --enable-sysvshm --enable-sysvsem --enable-sockets --enable-mbstring --enable-soap --enable-bcmath --enable-zip --enable-libxml --with-curl --with-gmp --with-mcrypt=/data/env/runtime/libmcrypt-2.5.8 --with-openssl --with-zlib= \
&& make \
&& make install \
&& make clean
# 更改php配置文件(拷贝一个过来)
COPY ./etc/php.ini /data/env/runtime/php-5.5.30/etc/
# php-fpm配置文件拷贝
COPY ./etc/php-fpm.conf /data/env/runtime/php-5.5.30/etc/
# 拷贝php扩展
COPY ./ext/swoole.so /data/env/runtime/php-5.5.30/lib/php/extensions/no-debug-non-zts-20121212/
这里值得一提的是ADD命令,相比于COPY命令,ADD命令能做的更多。它可以接受第一个url的参数,同时如果输入的文件是可识别的压缩格式的话,它同时还会把相应的文件解压。而COPY则是一个简单的复制。
第三部分
这部分包括了nginx的附属库和nginx本身的编译安装:
############################################## 下载(拷贝)nginx的依赖包并编译安装
# nginx 本身的编译,增加了debug
ADD ./nginx-1.10.1.tar.gz $src-dir RUN /data/sources/nginx-1.10.1/configure --prefix=/data/env/runtime/nginx-1.10.1 --with-http_sub_module --with-http_realip_module --with-debug --with-http_ssl_module \
&& make \
&& make install \
&& make clean# nginx基本配置文件
第四部分
# 软链,环境变量,aliasRUN echo -e "export PATH=/data/env/runtime/php-5.5.30/bin/:$PATH\n" >> /etc/profile \
"export PATH=/data/env/runtime/nginx/sbin:/data/website/qidian.com/framework/tsf/tsf2.0/bin:$PATH\n" >> /etc/profile \
"export QD_TSF_ENV=dev" >> /etc/profile \
RUN ln -s /data/env/runtime/nginx-1.10.1 /usr/local/nginx
RUN ln -s /data/env/runtime/php-5.5.30 /usr/local/php
# 暴露出80端口访问
EXPOSE 80 \443
# 清理文件
RUN rm -r /data/sources
# 启动Nginx
COPY ./admin/start.sh /data/admin/start.sh
RUN chmod 755 /data/admin/start.sh
# 指定工作目录WORKDIR
/data/adminCMD ["./start.sh"]
创建、提交和分布镜像
在build之前,需要将所有必须的源码压缩包、配置文件、脚本等都拷入这个目录中,如libmcrypt等:Dockerfile当前目录下执行:
docker build -t centos-web-dev .
完成本地镜像构建之后,接下来可以分享到dockerhub和阿里云hub。
查看已经构建的本地镜像id:
docker images
经过一些清理之后,image的大小被压到700MB,应该还可以再小一些。
docker-hub
为了跟docker hub里面的对应上,必须重命名一下本地的REPOSITORY
docker tag cf34378f61c3 meijing/centos-web-dev:latest
接下来登陆docker hub:
docker login --username=yourhubusername --email=youremail@company.com
然后docker push meijing/centos-web-dev
阿里云hub
将镜像提交到阿里镜像进行托管:
sudo docker login --username=525937005@qq.com registry.aliyuncs.com
$ sudo docker tag [ImageId] registry.aliyuncs.com/meijing0114/centos-web-dev
$ sudo docker push registry.aliyuncs.com/meijing0114/centos-web-dev
为了避免镜像太大,开发代码就进行另外的托管了。
只需要执行如下命令,就可以随时随地使用镜像了:
docker run -i -t -P centos-web-dev /bin/bash
进入镜像,然后将nginx启动起来。注意这里使用-P将两个端口80和443,都暴露了出来,如图所示:
再查看一下docker-machine的ip:docker-machine ip development
那么在浏览器输入192.168.99.100:32769
以直接看到nginx的页面了:
最终,我们搭建了一个能够运行php,nginx以及我们web框架
的的web开发环境。最终生成的Dockerfile可以在github:https://github.com/meijing0114/dockerfiles-web 看到。