首页 > 代码库 > 「四」创建一个带 apache 服务的镜像

「四」创建一个带 apache 服务的镜像

Apache 是世界使用排名第一的 Web 服务器软件。它可以运行在几乎所有广泛使用的计算机平台上,由于其跨平台和安全性被广泛使用,是最流行的 Web 服务器端软件。同时 Apache 音译为阿帕奇,是北美印第安人的一个部落,叫阿帕奇族,在美国的西南部。也是一个基金会的名称、一种武装直升机等等。

下面是使用 Dockerfile 来创建带 apache 服务的镜像的过程。

创建 apache 文件夹

首先,创建一个叫做 apache_ubuntu 的文件夹,用于存放我们的 Dockerfile 、脚本文件、以及其他文件。

FROM sshd:dockerfile
#设置继承自我们创建的 sshd 镜像
MAINTAINER waitfish from dockerpool.com(dwj_zz@163.com)
#下面是一些创建者的基本信息

#设置环境变量,所有操作都是非交互式的
ENV DEBIAN_FRONTEND noninteractive
#安装
RUN apt-get -yq install apache2&&    rm -rf /var/lib/apt/lists/*

RUN echo "Asia/Shanghai" > /etc/timezone &&         dpkg-reconfigure -f noninteractive tzdata
#注意这里要更改系统的时区设置,因为在 web 应用中经常会用到时区这个系统变量,默认的 ubuntu 会让你的应用程序发生不可思议的效果哦

# 添加我们的脚本,并设置权限,这会覆盖之前放在这个位置的脚本
ADD run.sh /run.sh
RUN chmod 755 /*.sh

# 添加一个示例的 web 站点,删掉默认安装在 apache 文件夹下面的文件,并将我们添加的示例用软链接链到 /var/www/html 目录下面
RUN mkdir -p /var/lock/apache2 &&mkdir -p /app && rm -fr /var/www/html && ln -s /app /var/www/html
COPY sample/ /app

# 设置一些apache 的环境变量,可以在启动的时候用 -e 改变
ENV APACHE_RUN_USER www-data
ENV APACHE_RUN_GROUP www-data
ENV APACHE_LOG_DIR /var/log/apache2
ENV APACHE_PID_FILE /var/run/apache2.pid
ENV APACHE_RUN_DIR /var/run/apache2
ENV APACHE_LOCK_DIR /var/lock/apache2
ENV APACHE_SERVERADMIN admin@localhost
ENV APACHE_SERVERNAME localhost
ENV APACHE_SERVERALIAS docker.localhost
ENV APACHE_DOCUMENTROOT /var/www

EXPOSE 80
WORKDIR /app
CMD ["/run.sh"]

这个 sample 站点的很简单,就一句话 Hello Docker!

$ cat sample/index.html
Hello Docker!

run.sh 的脚本也很简单

$ cat run.sh
#!/bin/bash
exec apache2 -D FOREGROUND

现在我们看一下目录下面的文件

$ tree .
.
|-- Dockerfile
|-- run.sh
`-- sample
    `-- index.html

1 directory, 3 files

创建 apache:ubuntu 镜像

$ sudo docker build -t apache:ubuntu .
Sending build context to Docker daemon 6.144 kB
Sending build context to Docker daemon
Step 0 : FROM sshd:dockerfile
 ---> 570c26a9de68
Step 1 : MAINTAINER waitfish from dockerpool.com(dwj_zz@163.com)
 ---> Using cache
 ---> 5c6b90057a1d
Step 2 : ENV DEBIAN_FRONTEND noninteractive
 ---> Using cache
 ---> e06feb0790d7
Step 3 : RUN apt-get -yq install apache2&&    rm -rf /var/lib/apt/lists/*
 ---> Using cache
 ---> 54e5665500b9
Step 4 : RUN echo "Asia/Shanghai" > /etc/timezone &&         dpkg-reconfigure -f noninteractive tzdata
 ---> Running in 8c1ad26742bc

Current default time zone: ‘Asia/Shanghai‘
Local time is now:      Mon Oct 27 20:19:19 CST 2014.
Universal Time is now:  Mon Oct 27 12:19:19 UTC 2014.

 ---> 04d64839c7b3
Removing intermediate container 8c1ad26742bc
Step 5 : ADD run.sh /run.sh
 ---> f995bd0d6f89
Removing intermediate container f372648d02d9
Step 6 : RUN chmod 755 /*.sh
 ---> Running in ae60847251c8
 ---> 2e0a58be0f9c
Removing intermediate container ae60847251c8
Step 7 : RUN mkdir -p /var/lock/apache2 &&mkdir -p /app && rm -fr /var/www/html && ln -s /app /var/www/html
 ---> Running in d5355f5e2992
 ---> 6e96f581ee0d
Removing intermediate container d5355f5e2992
Step 8 : COPY sample/ /app
 ---> c048a78c17fd
Removing intermediate container 2461604081e3
Step 9 : ENV APACHE_RUN_USER www-data
 ---> Running in c9c6c12d1982
 ---> 5cd772b48df2
Removing intermediate container c9c6c12d1982
Step 10 : ENV APACHE_RUN_GROUP www-data
 ---> Running in b179ff1391c8
 ---> 47d9b17eaec3
Removing intermediate container b179ff1391c8
Step 11 : ENV APACHE_LOG_DIR /var/log/apache2
 ---> Running in a3daf191e6b2
 ---> 8d56f68dbfc6
Removing intermediate container a3daf191e6b2
Step 12 : ENV APACHE_PID_FILE /var/run/apache2.pid
 ---> Running in 92401ab1dbee
 ---> 27f2ddba296e
Removing intermediate container 92401ab1dbee
Step 13 : ENV APACHE_RUN_DIR /var/run/apache2
 ---> Running in 76c6e7401eca
 ---> 6d0e7acaf398
Removing intermediate container 76c6e7401eca
Step 14 : ENV APACHE_LOCK_DIR /var/lock/apache2
 ---> Running in a9c46477ebe9
 ---> 1f352c6d2635
Removing intermediate container a9c46477ebe9
Step 15 : ENV APACHE_SERVERADMIN admin@localhost
 ---> Running in 3d0d8506856c
 ---> 679d9964bb34
Removing intermediate container 3d0d8506856c
Step 16 : ENV APACHE_SERVERNAME localhost
 ---> Running in 405884f45d23
 ---> 88f25f8e2609
Removing intermediate container 405884f45d23
Step 17 : ENV APACHE_SERVERALIAS docker.localhost
 ---> Running in 0528963fade4
 ---> 693cc00c91fe
Removing intermediate container 0528963fade4
Step 18 : ENV APACHE_DOCUMENTROOT /var/www
 ---> Running in 2c38a2ca6d14
 ---> d8649b79e085
Removing intermediate container 2c38a2ca6d14
Step 19 : EXPOSE 80
 ---> Running in cab9677d0756
 ---> 682d055d6f15
Removing intermediate container cab9677d0756
Step 20 : WORKDIR /app
 ---> Running in 641c59ded9da
 ---> 5b08d6572b75
Removing intermediate container 641c59ded9da
Step 21 : CMD /run.sh
 ---> Running in ee18331b3e69
 ---> 1d865e3032d7
Removing intermediate container ee18331b3e69
Successfully built 1d865e3032d
$ sudo docker images
#查看下目前我们创建的镜像
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
apache              ubuntu              1d865e3032d7        46 seconds ago      263.8 MB
sshd                dockerfile          570c26a9de68        9 hours ago         246.5 MB
sshd                ubuntu              7aef2cd95fd0        21 hours ago        255.2 MB
debian              latest              61f7f4f722fb        6 days ago          85.1 MB
busybox             latest              e72ac664f4f0        3 weeks ago         2.433 MB
ubuntu              14.04               ba5877dc9bec        3 months ago        192.7 MB
ubuntu              latest              ba5877dc9bec        3 months ago        192.7 MB

测试我们创建的镜像

$ sudo docker run -d -P apache:ubuntu
#使用 `-P` 参数映射所有开放的端口
64681e2ae943f18eae9f599dbc43b5f44d9090bdca3d8af641d7b371c124acfd
$ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                   PORTS                                          NAMES
64681e2ae943        apache:ubuntu       "/run.sh"           2 seconds ago       Up 1 seconds             0.0.0.0:49171->22/tcp, 0.0.0.0:49172->80/tcp   naughty_poincare
890c04ff8d76        sshd:dockerfile     "/run.sh"           9 hours ago         Exited (0) 3 hours ago   0.0.0.0:101->22/tcp                            high_albattani
3ad7182aa47f        sshd:ubuntu         "/run.sh"           21 hours ago        Exited (0) 3 hours ago   0.0.0.0:100->22/tcp                            focused_ptolemy
$ curl 127.0.0.1:49172
#用文本浏览器 curl 验证我们的刚才写的 sample 网页
Hello Docker!

Dockerfile 创建的镜像拥有继承的特性

不知道有没有细心的读者发现,我们在 apache 的Dockerfile 中只对外开放了 80 端口,在启动的命令行脚本里面也只启动了 apache 进程。

那么,为什么我们在 sudo docker ps -a的返回中,我们看到新建的这个容器映射了 2 个端口,相应的启动了 apache 和 sshd 2 个服务。

这特性提醒我们,不要在一个母镜像下面做过多竖向的继承,比如:基于sshd:ubuntu -->apache:ubuntu -->lamp:ubuntu-->....等等,这样在一个 docker 容器中开启的服务会越来越多,越来越臃肿。

如何使用我们创建的 apache 镜像?

启动一个容器

$ sudo docker run -i -d -p 80:80 -p 103:22 -e APACHE_SERVERNAME=test  -v `pwd`/www:/var/www:ro apache:ubuntu
$ curl 127.0.0.1

由于我们没有在当前目录的 www 文件夹放置程序,所以我们得到一个 404 的页面。

<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
<html><head>
<title>404 Not Found</title>
</head><body>
<h1>Not Found</h1>
<p>The requested URL / was not found on this server.</p>
<hr>
<address>Apache/2.4.7 (Ubuntu) Server at 127.0.0.1 Port 80</address>
</body></html>


更多内容,请关注 www.dockerpool.com


「四」创建一个带 apache 服务的镜像