参考文章:[Docker 技术入门与实战]
Apache 简介
Apache 是一个高稳定性的,商业级别的开源 Web 服务器,是目前世界上使用排名第一的 Web 服务器软件。由于其良好的跨平台和安全性,Apache 被广泛应用在多种平台和操作系统上。
使用 Docker Hub 镜像
Docker Hub 官方提供的 Apache 镜像,并不带 PHP 环境。如果我们需要 PHP 环境支持,可以选择 PHP 镜像,并请使用含 -apache
标签的镜像,如 7.0.7-apache
。如果仅需要使用 Apache 运行静态 HTML 文件,则使用默认官方镜像即可。
- 编写 Dockerfile 文件,内容如下:
1 | FROM httpd:2.4 |
- 创建项目目录
public-html
,并在此目录下创建index.html
文件。
1 |
|
- 构建自定义镜像:
1 | $ docker build -t apache2-image . |
通过本地的 80 端口即可访问静态页面。也可以不创建自定义镜像,直接通过映射目录的方式运行 Apache 容器:
1 | $ docker run -it --rm --name my-apache-app -p 8080:80 -v "$PWD":/usr/local/apache2/htdocs/ httpd:2.4 |
使用自定义镜像
- 首先,创建一个
apache_ubuntu
工作目录,在其中创建Dockerfile
文件,run.sh
文件和sample
目录:
1 | mkdir apache_ubuntu && cd apache_ubuntu/ |
- 下面是 Dockerfile 的内容和各个部分的说明:
1 | # 设置基础镜像,继承用户创建的 sshd 镜像 |
以下是 sample 站点的内容输出。在 sample
目录下创建 index.html
文件,内容为:
1 |
|
run.sh
脚本的内容也很简单,只是启动 apache
服务:
1 | $ cat run.sh |
此时,apache_ubuntu
目录下面的文件结构为:
1 | $ tree . |
下面, 开始创建 apache:ubuntu
镜像
1 | $ docker build -t apache:ubuntu . |
此时镜像已经创建成功了,用户可以使用 docker images
指令查看本地新增的 apache:ubuntu
镜像:
1 | $ docker images |
接下来,使用 docker run
指令测试镜像。用户可以使用 -P
参数映射需要开放的端口(22
和 80
端口):
1 | $ docker run -d -P apache:ubuntu |
现在在本地主机上用 curl
抓取网页来验证刚才创建的 sample
站点:
1 | $ curl 127.0.0.1:32768 |
下面,用户看看 Dockerfile 创建的镜像拥有继承的特性。不知道有没有细心的读者发现,Apache 镜像的 Dockerfile 中只用 EXPOSE
定义了对外开放的 80 端口,而在 docker ps
命令的返回中,却看到了新启动的容器映射了 2 个端口:22 和 80.
但实际上,当尝试使用 SSH 登录到容器时,会发现无法登录。这是因为在 run.sh
脚本中并未启动 SSH 服务。这说明在使用 Dockerfile 创建镜像时,会继承父镜像的开放端口,但却不会继承启动命令。因此,需要在 run.sh
脚本中添加启动 sshd
的服务启动命令:
1 | $ cat run.sh |
再次创建镜像:
1 | docker build -t apache:ubuntu . |
这次创建的镜像,将默认同时启动 SSH 和 Apache
服务。
下面,看看如何映射本地目录。用户可以通过映射本地目录的方式,来指定容器内 Apache 服务响应的内容,例如,映射本地主机上当前目录下的 www
目录到容器内的 /var/www
目录:
1 | docker run -i -d -p 80:80 -p 103:22 -e APACHE_SERVERNAME=test -v "$(pwd)"/www:/var/www/html:ro apache:ubuntu |
在当前目录内创建 www
目录,并放上自定义的页面 index.html
, 内容为:
1 |
|
在本地主机上可访问测试容器提供的 Web 服务,查看获取内容为新配置的 index.html
页面信息。
Apache 相关资源
Apache 的相关资源如下:
- Apache 官网:
https://httpd.apache.org/
- Apache 官方仓库:
https://github.com/apache/httpd