1. 安装 Docker
在开始使用 Docker 安装 Apache 之前,你需要确保 Docker 已经安装在你的系统上。不同操作系统的安装方法不同,下面以常见的 Ubuntu 系统为例:
收起
bash
# 更新系统软件包列表
sudo apt update
# 安装 Docker 依赖包
sudo apt install apt-transport-https ca-certificates curl software-properties-common
# 添加 Docker 的官方 GPG 密钥
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
# 添加 Docker 软件源
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 更新软件包列表以包含 Docker 软件源
sudo apt update
# 安装 Docker Engine
sudo apt install docker-ce docker-ce-cli containerd.io
# 验证 Docker 是否安装成功
sudo docker run hello-world
2. 拉取 Apache 镜像
你可以从 Docker Hub 上拉取官方的 Apache 镜像,执行以下命令:
收起
bash
sudo docker pull httpd:latest
3. 运行 Apache 容器并进行端口和文件夹映射
你可以使用 docker run
命令来启动一个新的 Apache 容器,同时完成端口和文件夹的映射。
端口映射
Apache 默认使用 80 端口提供服务,我们可以将容器内的 80 端口映射到宿主机的某个端口(例如 8080),这样就可以通过宿主机的 8080 端口访问 Apache 服务。
文件夹映射
将宿主机的某个文件夹(例如 /home/user/website
)映射到容器内的 Apache 文档根目录 /usr/local/apache2/htdocs
,这样就可以方便地在宿主机上修改网站文件。
运行以下命令启动容器:
收起
bash
sudo docker run -d \
-p 8080:80 \
-v /home/user/website:/usr/local/apache2/htdocs \
--name my-apache-server \
httpd:latest
参数解释:
-d
:表示在后台以守护进程模式运行容器。-p 8080:80
:将宿主机的 8080 端口映射到容器内的 80 端口。-v /home/user/website:/usr/local/apache2/htdocs
:将宿主机的/home/user/website
文件夹映射到容器内的/usr/local/apache2/htdocs
文件夹。--name my-apache-server
:为容器指定一个名称,方便后续管理。httpd:latest
:指定要使用的 Docker 镜像。
4. 验证配置
检查容器是否运行:
收起
bash
sudo docker ps
如果看到 my-apache-server
容器正在运行,则表示容器启动成功。
访问 Apache 服务:
在浏览器中输入http://localhost:8080
(如果你是在远程服务器上安装的 Apache,将localhost
替换为服务器的 IP 地址),如果能看到 Apache 的默认页面,则说明端口映射配置成功。验证文件夹映射:
在宿主机的/home/user/website
文件夹中创建一个index.html
文件,例如:
收起
bash
echo "<h1>Hello, Docker Apache!</h1>" > /home/user/website/index.html
刷新浏览器页面,应该能看到新创建的页面内容,这表明文件夹映射配置成功。
5. 其他操作
停止容器:
收起
bash
sudo docker stop my-apache-server
启动已停止的容器:
收起
bash
sudo docker start my-apache-server
删除容器:
收起
bash
sudo docker rm my-apache-server
分享
在 Apache 配置文件中如何设置访问权限?
在 Apache 配置文件中设置访问权限主要是通过 <Directory>
、<Location>
和 <Files>
等指令块来控制对特定目录、URL 路径和文件的访问。以下详细介绍不同场景下的设置方法:
基于目录设置访问权限(<Directory>
指令)
<Directory>
指令用于控制对特定目录及其子目录的访问。你可以在 Apache 主配置文件(如 /etc/apache2/apache2.conf
或 /etc/httpd/conf/httpd.conf
)或者虚拟主机配置文件中添加相关配置。
示例 1:允许所有访问
收起
apache
<Directory "/var/www/html">
Options Indexes FollowSymLinks
AllowOverride None
Require all granted
</Directory>
Options Indexes FollowSymLinks
:Indexes
表示如果该目录下没有index.html
等默认首页文件,Apache 将显示目录列表;FollowSymLinks
允许 Apache 跟随符号链接。AllowOverride None
:禁止使用.htaccess
文件覆盖此目录的配置。Require all granted
:允许所有客户端访问该目录。
示例 2:仅允许特定 IP 地址访问
收起
apache
<Directory "/var/www/private">
Options -Indexes
AllowOverride None
Require ip 192.168.1.0/24
</Directory>
Options -Indexes
:禁用目录列表功能。Require ip 192.168.1.0/24
:只允许 IP 地址在192.168.1.0 - 192.168.1.255
范围内的客户端访问该目录。
示例 3:拒绝所有访问
收起
apache
<Directory "/var/www/secret">
Options -Indexes
AllowOverride None
Require all denied
</Directory>
Require all denied
表示拒绝所有客户端访问该目录。
基于 URL 路径设置访问权限(<Location>
指令)
<Location>
指令用于控制对特定 URL 路径的访问,而不考虑文件在文件系统中的实际位置。
示例:限制对 /admin
路径的访问
收起
apache
<Location "/admin">
Require ip 10.0.0.0/8
</Location>
此配置只允许 IP 地址在 10.0.0.0 - 10.255.255.255
范围内的客户端访问以 /admin
开头的 URL 路径。
基于文件设置访问权限(<Files>
指令)
<Files>
指令用于控制对特定文件的访问。
示例:限制对 .htpasswd
文件的访问
收起
apache
<Files ".htpasswd">
Require all denied
</Files>
该配置拒绝所有客户端访问 .htpasswd
文件,以保护用户密码信息。
使用 .htaccess
文件设置访问权限
如果在 <Directory>
指令中设置了 AllowOverride All
,则可以在目录下创建 .htaccess
文件来覆盖 Apache 主配置文件中的部分设置。
示例:使用 .htaccess
文件实现基本认证
创建一个包含用户名和加密密码的
.htpasswd
文件:
收起
bash
htpasswd -c /var/www/html/.htpasswd username
按照提示输入密码。
在
/var/www/html
目录下创建.htaccess
文件,并添加以下内容:
收起
apache
AuthType Basic
AuthName "Restricted Area"
AuthUserFile /var/www/html/.htpasswd
Require valid-user
此配置将对 /var/www/html
目录下的所有文件和子目录启用基本认证,只有在 .htpasswd
文件中存在的用户才能访问。
配置生效
在修改完 Apache 配置文件或 .htaccess
文件后,需要重启 Apache 服务使配置生效:
在 Ubuntu/Debian 系统上:
收起
bash
sudo systemctl restart apache2
在 CentOS/RHEL 系统上:
收起
bash
sudo systemctl restart httpd