docker入门-构建web环境(中)

 

生成一个镜像一般有两种方式:以一个镜像为基础,修改他的容器,最终将修改后的容器提交,成为新的镜像;撰写Doc...



生成一个镜像一般有两种方式:

  • 以一个镜像为基础,修改他的容器,最终将修改后的容器提交,成为新的镜像;
  • 撰写Dockerfile,通过docker build,一步生成最终想要的镜像。
不论是哪种方式生成的镜像,都可以最终被上传到镜像托管服务,并在任何一处能够运行docker的环境下拉取,并运行起来。

一步步自己修改

首先把centos的源拉下来(使用了daocloud的镜像,daocloud是一家初创关于docker的公司,主要是dockerhub太慢了。从别的阿里云拉取也都可以):
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

# 设置两个环境变量
ENV src-dir /data/sources
ENV 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 
    : 等价于在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-dir
WORKDIR $src-dir/libmcrypt-2.5.8
RUN ./configure --prefix=/data/env/runtime/libmcrypt-2.5.8
&& make
&& make install
&& make clean

# php本身
ADD ./php-5.5.30.tar.gz $src-dir
WORKDIR $src-dir/php-5.5.30
RUN ./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基本配置文件

第四部分

# 软链,环境变量,alias
RUN echo -e
"export PATH=/data/env/runtime/php-5.5.30/bin/:$
PATH

"
>> /etc/profile
"export PATH=/data/env/runtime/nginx/sbin:
/data/website/qidian.com/framework/tsf/tsf2.0/bin:$PATH
"

>> /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/admin
CMD ["./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
看到。


    关注 小白学web


微信扫一扫关注公众号

0 个评论

要回复文章请先登录注册