镜像拉取到私有镜像仓库
由于docker.io无法再访问了,所以需要将需要的镜像拉取下来还比较麻烦。
配置镜像源
第一个想法是通过一些镜像代理来实现;
尝试如下镜像源:
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
"registry-mirrors": [
"https://dockerproxy.com",
"https://docker.mirrors.ustc.edu.cn",
"https://docker.nju.edu.cn"
]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
发现依旧不可用。
搜索了下,尝试了轩辕镜像免费版:
bash <(wget -qO- https://xuanyuan.cloud/docker.sh)
发现也不靠谱,限制太多:
- 一会超时
- 一会不可访问
- ....
直接放弃算球,无奈还是考虑把一离开镜像拉到本地处理
拉取镜像到私有haobor
- 先把当前dify 对应的dockerCompose.yaml文件中依赖的镜像有哪些列举出来
// dify 1.11.2 langgenius/dify-api:1.11.2 langgenius/dify-web:1.11.2 busybox:latest postgres:15-alpine redis:6-alpine langgenius/dify-sandbox:0.2.12 langgenius/dify-plugin-daemon:0.5.2-local ubuntu/squid:latest certbot/certbot nginx:latest semitechnologies/weaviate:1.27.0 oceanbase/oceanbase-ce:4.3.5-lts oceanbase/seekdb:latest langgenius/qdrant:v1.8.3 pgvector/pgvector:pg16 vastdata/vastbase-vector tensorchord/pgvecto-rs:pg16-v0.3.0 ghcr.io/chroma-core/chroma:0.5.20 milvusdb/milvus:v2.6.3 - 配置到个人的github imgpull 的项目,把这些镜像同步到私有harbor。

镜像同步完后,算是走完第一步了。
修改dockerCompose.yaml
由于dify 的 dockerCompose.yaml依旧引用的docker.io的镜像,需要把镜像地址增加上私有harbor的域名+项目路径。
部署dify服务
进入到docker 目录下,执行如下命令
cp .env.example .env,根据样例生成环境变量文件。
docker compose up -d,启动服务
服务启动后,就能访问dify了。
但是虚拟机上部署dify还不是很安全,dify 最近也暴露了一些漏洞问题。所以决定限定ip 访问 80 端口。
限定部分IP访问
firewalld 限定ip(没成功)
我的虚拟机是Anolis OS 8.x 的版本。
准备 firewalld去限定ip不能访问80端口,尝试路径如下:
# 检查 firewalld 状态
systemctl status firewalld
# 启动 firewalld 服务
systemctl start firewalld
# 设置开机自动启动,避免重启后服务关闭
systemctl enable firewalld
# 允许 192.168.1.100 访问80端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" source address="192.168.1.100" port port="80" protocol="tcp" accept"
# 拒绝所有其他 IP 访问80端口
firewall-cmd --permanent --add-rich-rule="rule family="ipv4" port port="80" protocol="tcp" reject"
# 重载防火墙配置
firewall-cmd --reload
# 查看已配置的规则,确认生效
firewall-cmd --list-rich-rules
不出意外,不能访问了,删除了rule也不能访问了。只能重启,查查资料,发现然我执行上述操作之外,还要
# 永久添加 http 服务规则
sudo firewall-cmd --permanent --add-service=http
# 重载配置
sudo firewall-cmd --reload
# 查看已放行的端口
sudo firewall-cmd --list-ports
# 或查看已放行的服务
sudo firewall-cmd --list-services
好吧,依旧不行,直接放弃了。
nftables 限定IP(成功了)
既然 firewall不可以,我准备尝试一下 iptables。
但是查资料才知道:
部分新系统(如 CentOS 8、Ubuntu 20.04+)默认用 nftables 替代 iptables,此时执行 iptables 命令其实是 nftables 的兼容模式。
尝试路径如下:
# 启动服务
sudo systemctl start nftables
# 开机自启
sudo systemctl enable nftables
# 检查状态(正常会显示 active (running))
sudo systemctl status nftables
# 查询 DOCKER-USER 的ip filter
sudo nft -a list chain ip filter DOCKER-USER
# 拒绝所有其他IP访问80端口
sudo nft insert rule ip filter DOCKER-USER tcp dport 80 drop
# 放行指定IP访问80端口(先拒绝再放行,顺序很重要)
sudo nft insert rule ip filter DOCKER-USER ip saddr 172.18.213.180 tcp dport 80 accept
# 查询 DOCKER-USER 的ip filter
sudo nft -a list chain ip filter DOCKER-USER
# 加错了,可以删除
sudo nft delete rule ip filter DOCKER-USER handle xxx
过程中遇到的坑:
- 容器映射的 80 端口流量不走
INPUT链,而是走FORWARD链 - Docker 官方推荐在
DOCKER-USER链添加自定义转发规则(它是 FORWARD 链的第一个跳转目标,优先级最高),这是限制容器端口的最佳方式 - 80端口,先拒绝再放行,顺序很重要;不然被覆盖不生效。
想持久化,按照下述操作:
# Ubuntu/Debian/CentOS 通用(配置文件路径:/etc/nftables.conf)
sudo nft list ruleset > /etc/nftables.conf
# 重启 nftables 服务
sudo systemctl restart nftables
# 重新查看规则,确认还在
sudo nft list ruleset
如果有一批IP可以通过如下操作执行:
-
准备 IP 列表文件
先创建一个文本文件(比如allow_ips.txt),每行写一个需要放行的 IP(支持单个 IP 或 CIDR 网段,如192.168.1.100、192.168.2.0/24):# 创建并编辑 IP 列表文件 sudo vim /root/allow_ips.txt文件内容示例(按需修改):
192.168.1.100 192.168.1.101 192.168.2.0/24 10.0.0.5 10.0.0.6/32 -
循环添加放行规则
执行以下脚本,批量读取 IP 列表并添加规则(规则会插入到DOCKER-USER链最前面,保证优先级):# 循环读取 IP 列表,逐个添加放行规则 while read -r ip; do # 跳过空行和注释行(以 # 开头) if [[ -z "$ip" || "$ip" =~ ^# ]]; then continue fi # 添加放行规则(insert 确保规则在最前面) sudo nft insert rule ip filter DOCKER-USER ip saddr "$ip" tcp dport 80 accept echo "已添加放行规则:$ip" done < /root/allow_ips.txt # 最后添加拒绝所有其他 IP 的规则(如果还没加) sudo nft insert rule ip filter DOCKER-USER tcp dport 80 drop -
验证批量添加的规则
sudo nft list chain ip filter DOCKER-USER