天天看点

【系列2】使用Dockerfile创建带Apache服务的Centos Docker镜像

      这里将展示使用Dockerfile来创建带Apache服务的Docker镜像的具体过程。

  (1) Apache

 这里将展示使用Dockerfile来创建带Apache服务的Docker镜像的具体过程。

 准备工作:

 首先,创建一个apache_centos工作目录,在其中

[root@docker1 ~]# mkdir apache_centos && cd apache_centos

[root@docker1 apache_centos]# touch Dockerfile run.sh

[root@docker1 apache_centos]# mkdir sample

-------------------------------------------------------------------------------------------------------------------------------

下面是Dockerfile的内容和各个部分的说明:

[root@docker1 apache_centos]# cat Dockerfile 

FROM docker.io/centos:latest

#设置继承来自我们创建的centos:latest镜像

MAINTAINER waitfish from dockerpool.com

#创建者的基本信息

#设置环境变量,所有操作都是非交互式的

ENV DEBIAN_FRONTEND noninteractive

RUN echo "Asia/Shanghai" > /etc/timezone #&& \

        # dpkg-reconfigure -f noninteractive tzdata      #这也是设置时区的

#注意这里要更改系统的时区设置,因为在Web应用中经常会用到时区这个系统变量,默认的centos会让你的应用此程序发生不可思议的效果哦

#安装wget

RUN yum update

RUN yum install -y wget

WORKDIR /usr/local/src

#下载并解压源码包

RUN wget http://mirrors.shuosc.org/apache//httpd/httpd-2.2.34.tar.gz

RUN tar -xf httpd-2.2.34.tar.gz

WORKDIR httpd-2.2.34

#编译安装apache

RUN yum install -y gcc make apr-devel apr apr-util apr-util-devel pcre-devel

RUN ./configure --prefix=/usr/local/apache2 --enable-mods-shared=most --enable-so

RUN make

RUN make install

#修改apache配置文件

RUN sed -i 's/#ServerName www.example.com:80/ServerName localhost:80/g' /usr/local/apache2/conf/httpd.conf

#启动apache服务

RUN /usr/local/apache2/bin/httpd

#复制服务启动脚本并设置权限

ADD run.sh /usr/local/sbin/run.sh

RUN chmod 755 /usr/local/sbin/run.sh

#添加一个示例的Web站点,删除默认安装在apache文件夹下面的文件,并将我们添加的实例用软链接到/var/www/html目录下面

RUN mkdir -p /app && rm -fr /usr/local/apache2/html && ln -s /app /usr/local/apache2/html

COPY sample/ /app

#开放80端口

EXPOSE 80

WORKDIR /app

CMD ["/usr/local/sbin/run.sh"]

--------------------------------------------------------------------------------------------------------------------------------------

这个sample站点的内容很简单,就输出一句话Hello Docker! 在sample目录下创建index.html文件,内容为:

[root@docker1 apache_centos]# cd sample/

[root@docker1 sample]# vim index.html

<!DOCTYPE html>

<html>

<body>

<p>Hello, Docker!</p>

</body>

</html>

run.sh脚本内容也很简单,只是启动Apache服务:

[root@docker1 apache_centos]# vim run.sh 

#!/bin/bash

/usr/sbin/sshd &

/usr/local/apache2/bin/httpd -D FOREGROUND

此时,apache_centos目录下面的文件结构为:

[root@docker1 apache_centos]# tree

.

├── Dockerfile

├── run.sh

└── sample

   └── index.html

1 directory, 3 files

创建apache:centos镜像

使用docker build命令创建apache:centos镜像,注意命令最后的"."。

[root@docker1 apache_centos]# docker build -t apache:centos .

......

Successfully built ......  表示创建镜像成功

此时镜像已经创建成功了。下面,查看本地已有的镜像列表,可见新增的apache:centos镜像:

[root@docker1 apache_centos]# docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE

apache               centos              fe364d4ee9ec        5 minutes ago       419.1 MB

[root@docker1 apache_centos]# docker run -d -P apache:centos

0fadd02039d6b16ae308faada8497f3ab9d72de73d5dd36a655e188eee9f1859

[root@docker1 apache_centos]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                          NAMES

0fadd02039d6        apache:centos       "/usr/local/sbin/run."   4 seconds ago       Up 3 seconds        0.0.0.0:32769->22/tcp, 0.0.0.0:32768->80/tcp   happy_jones

[root@docker1 apache_centos]# curl 127.0.0.1:32768

<html><body><h1>It works!</h1></body></html>

Docker创建的镜像具有继承性

[root@docker1 apache_centos]# docker port 0fadd02039d6 

22/tcp -> 0.0.0.0:32769

80/tcp -> 0.0.0.0:32768

默认会同时启动SSH和Apache服务。

映射本地目录

[root@docker1 apache_centos]# docker run -i -d -p 100:80 -p 103:22 -e APACHE_SERVERNAME=test -v `pwd`/www:/var/www:ro apache:centos

f452f8f192bfda6fa5830ee67cac03694279a10e10c20e6d1c162aa863735a63

[root@docker1 www]# docker ps

CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                                      NAMES

f452f8f192bf        apache:centos       "/usr/local/sbin/run."   37 minutes ago      Up 37 minutes       0.0.0.0:103->22/tcp, 0.0.0.0:100->80/tcp   amazing_mcnulty

[root@docker1 www]# docker rm f452f8f192bf 

Error response from daemon: You cannot remove a running container f452f8f192bfda6fa5830ee67cac03694279a10e10c20e6d1c162aa863735a63. Stop the container before attempting removal or use -f

[root@docker1 www]# docker stop f452f8f192bf 

f452f8f192bf

[root@docker1 apache_centos]# ls    #会自动在当前目录创建www目录,放上自定义的页面index.html,内容为:

Dockerfile  httpd  run.sh  sample  www

以上错误:apache的页面目录为/usr/local/apache2/html

[root@docker1 www]# docker run -i -d -p 100:80 -p 103:22 -e APACHE_SERVERNAME=test -v `pwd`/www:/usr/local/apache2/html:ro apache:centos

ab27e092fef8513ffe89c3f81498fe1b097e48d82dcdb3292059e8475a97d37e

…………………………………………………………………………………………………………………………………………

本文转自 Mr_sheng 51CTO博客,原文链接:http://blog.51cto.com/sf1314/1980710