前言
其实这篇是从 [无敌小白版] 阿里云服务器 + Docker Compose - Halo Sakura 个人博客搭建 ,里面的一部分整合出来的,但是因为每次都要去这一篇博客然后分开来看有点麻烦,于是乎直接新建了一篇专门讲这个。(并不是在水!嘿嘿嘿)
正文
1. Docker Compose 环境搭建
对于安装,我们将会对Halo文档,直接进行一个进攻,我们这里会使Docker Compose 进行部署,是时候,跟上一些时代的脚步了。
我们优先搭建环境:
1.1 Docker Engine 前置要求
优先搭建Docker Engine,Install Docker Engine on Ubuntu
首先我们注意,防火墙的事情,原文如下:
If you use
ufwor firewalld to manage firewall settings, be aware that when you expose container ports using Docker, these ports bypass your firewall rules. For more information, refer to Docker and ufw.Docker is only compatible with
iptables-nftandiptables-legacy. Firewall rules created withnftare not supported on a system with Docker installed. Make sure that any firewall rulesets you use are created withiptablesorip6tables, and that you add them to theDOCKER-USERchain, see Packet filtering and firewalls.
大意就是,如果以后要放端口,要iptables 和 iptables,也记得加DOCKER-USER。
然后就是,先把旧版本的conflicting packages给卸载了,一些Linux的版本可能会提供一些unofficial 的 Docker packages,我们需要把这些都给删除了:
docker.iodocker-composedocker-compose-v2docker-docpodman-dockerMoreover, Docker Engine depends on containerd and runc. Docker Engine bundles these dependencies as one bundle:
containerd.io. If you have installed the containerd or runc previously, uninstall them to avoid conflicts with the versions bundled with Docker Engine.
需要用以下的命令把 conflicting packages给去掉:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; doneapt-get might report that you have none of these packages installed.apt-get可能报告你没有安装这些packages,很正常,因为我们全新的Ubuntu没有这些packages)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker.io
E: Couldn't find any package by glob 'docker.io'
E: Couldn't find any package by regex 'docker.io'
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-doc
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-compose
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package docker-compose-v2
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package podman-docker
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package containerd
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
E: Unable to locate package runc我们没有任何这些packages,很perfect!
Images, containers, volumes, and networks stored in /var/lib/docker/ aren't automatically removed when you uninstall Docker. If you want to start with a clean installation, and prefer to clean up any existing data, read the uninstall Docker Engine section.(我们这里应该不存在,我相信我们这个阿里云提供的Ubuntu 24.04 是Clean 中之 Clean!)
1.2 安装 Docker Engine
我们有多种方式安装Docker Engine,这里我们选用通过apt 来进行安装,设置Docker's apt 的 repository:
# Add Docker's official GPG key:
sudo apt-get update
sudo apt-get install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt-get update安装Docker packages,直接安装,最新版:
sudo apt-get install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin验证,安装是否成功:
sudo docker run hello-world出现下面,就证明我们已经成功安装Docker Engine了:
Hello from Docker!
This message shows that your installation appears to be working correctly.1.3 安装 Docker Compose
我们参考:Install the Docker Compose plugin,我们已经在2.2 安装了Docker repository的apt。我们更新最新版本的 Docker Compose。对于Ubuntu来说:
sudo apt-get update
sudo apt-get install docker-compose-plugin检查一下Docker Compose是否成功安装:
docker compose version2. 反向代理(Nginx Proxy Manager)
我们参考与 Nginx Proxy Manager 配合使用的Halo部署。
来自官网对于 Nginx Proxy Manager的介绍:
顾名思义,Nginx Proxy Manager 就是一个 Nginx 的代理管理器,它最大的特点是简单方便。
即使是没有 Nginx 基础的小伙伴,也能轻松地用它来完成反向代理的操作,而且因为自带面板,操作极其简单,非常适合配合 docker 搭建的应用使用。
Nginx Proxy Manager 后台还可以一键申请 SSL 证书,并且会自动续期,方便省心。
下面我们就来介绍如何用 Nginx Proxy Manger 来配合 Halo,实现反向代理和 HTTPS 访问。
创建一个文件夹来存放 NPM 的 docker-compose.yml 文件:
mkdir -p ~/data/docker_data/nginxproxymanager # 创建一个 npm 的文件夹
cd ~/data/docker_data/nginxproxymanager # 进入该文件夹
vim docker-compose.yml以下我们要创建的docker-compose.yml:
version: '3'
services:
app:
image: 'jc21/nginx-proxy-manager:latest'
restart: unless-stopped
ports:
- '80:80' # 不建议修改端口
- '81:81' # 可以把冒号左边的 81 端口修改成你服务器上没有被占用的端口
- '443:443' # 不建议修改端口
volumes:
- ./data:/data # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 data 目录,用于存放数据,如果不存在的话,会自动创建
- ./letsencrypt:/etc/letsencrypt # 点号表示当前文件夹,冒号左边的意思是在当前文件夹下创建一个 letsencrypt 目录,用于存放证书,如果不存在的话,会自动创建注意:安装了 NPM 之后,就不需要再安装 Nginx 了,否则会端口冲突(不建议修改 NPM 的 80、443 端口)。如果你的服务器安装了宝塔面板,也可以和 NPM 一起使用,只要你到软件后台把宝塔安装的 Nginx 关闭或者卸载即可。
启动 NPM:
docker compose up -d # 如果你用的是 docker-compose-plugin 的话,用这条命令;d 表示后台运行不出意外,此时你使用 http://127.0.0.1:81 就可以访问 NPM 的网页端了。(注意把 127.0.0.1 替换成你实际服务器的 IP)(同时注意:记得在阿里云防火墙端口)
默认登录的用户名admin@example.com 密码changeme
第一次登录会提示更改用户名和密码,建议修改一个复杂一点的密码。
至此,我们已经完成了 Nginx Proxy Manager 的搭建,之后就可以用它给我们的 Halo 或者其他 Web 应用做反向代理了。
成功登录!

我们这里点击Proxy Hosts:

点击增加:

我们配置一下Proxy:

我们只要用到其中的几个功能即可,这边稍微解释一下:
Domain Names:填我们 Halo 网站的域名,首先记得做好 DNS 解析,把域名绑定到我们的服务器的 IP 上Scheme:默认 http 即可,除非你有自签名证书(我们后续设置)Forward Hostname/IP:填入服务器的 IP,或者 Docker 容器内部的 IP(如果NPM在docker内的话,不能直接用127.0.0.1(我们现在的情况),ip addr show docker0查询即可,我们这里的172.17.0.1)Forward Port:填入 Halo 映射出的端口,这边默认是8090Cache Assets:缓存,可以选择打开Block Common Exploits:阻止常见的漏洞,可以选择打开Websockets Support:WS 支持,可以选择打开Access List:这个是 NPM 自带的一个限制访问功能,这边我们不管,后续可以自行研究。
成功!

发现Proxy 自带SSL申请,我们直接一个申请:

这样我们就拥有3个月的Let's Encrypt。
之后如果要更新的话 可以参考 《[无敌小白版] 上传Let's Encrypt 来代替原版的 SSL证书》
更新一下,经过几个月的测试,我发现NPM(Nginx Proxy Manager)是会自动更新SSL的,所以不用担心自己后面来续的问题,他会自己用acme之类的程序~!
总结
直接用docker + NPM 给网站上SSL哦!