RHEL8 安装PhotoPrism

摘要:本文记录在RHEL8中安装PhotoPrism所需解决方案。写作时间2022年1月2日。

最近发现了一个图片共享管理软件PhotoPrism,可以自动识别图片的EXIF信息以及位置信息,并能自动人脸识别归类,因此想尝试使用它进行图片管理。PhotoPrism采用Docker image的方式发布,这样能减少各种因为不同Linux发行版而可能出现的各种奇怪系统兼容性问题。首先尝试在Ubuntu上安装docker,docker-compose以及PhotoPrism,很容易安装成功并运行。但是换到RHEL8上,就开始出现各种问题。主要包括如下几步:

  • 安装Docker和Docker-Compose
  • 安装PhotoPrism
  • 配置防火墙(非必要)

安装Docker和Docker-Compose

Docker不在RHEL8的官方repo里,所以需要首先添加它的repo:

sudo dnf config-manager --add-repo=https://download.docker.com/linux/centos/docker-ce.repo

Docker的程序名字是docker-ce,(Community Edition, 社区版),可以先查询一下版本信息:

sudo dnf info docker-ce

上述命令执行后会返回本地已安装版本信息(若已经安装)和远端Repo上的版本信息。额外补充一点,如下命令会显示repo里该程序的所有可用版本:

sudo dnf list docker-ce --showduplicates | sort -r

...
Installed Packages
docker-ce.x86_64               3:20.10.9-3.el8                 docker-ce-stable 
docker-ce.x86_64               3:20.10.8-3.el8                 docker-ce-stable 
...
docker-ce.x86_64               3:19.03.14-3.el8                docker-ce-stable 
docker-ce.x86_64               3:19.03.13-3.el8                docker-ce-stable 
Available Packages

# 手动指定安装某个版本则可以执行如下命令:
sudo dnf install docker-ce-3:19.03.13-3.el8 #执行最老的一个版本

这里我们使用默认的最新版本就可以了。

sudo dnf install docker-ce

安装完毕后docker会创建一个名为docker的用户组,当前用户并不属于这个组,因此执行docker命令需要采用sudo方式。解决办法就是将当前用户添加到docker用户组,这样以后执行各种docker命令就不需要加sudo了:

sudo usermod -aG docker $USER
# 修改完毕后退出当前用户并重新登陆进入使修改生效

然后将docker作为服务进行注册和启动,这样保证每次机器重启后docker都会自动开始运行:

sudo systemctl enable --now docker
# 检查服务状态
sudo systemctl is-active docker
sudo systemctl is-enabled docker
# 也可以用如下
sudo systemctl status docker
# 输出如下:
docker.service - Docker Application Container Engine
   Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
   Active: active (running) since Sun 2022-01-02 16:08:40 MST; 6h ago
     Docs: https://docs.docker.com
 Main PID: 3064671 (dockerd)

然后是安装docker-compose, 这个有两种安装方法,一种是从它的官方github repo直接下载可执行文件并复制到本地,修改为可执行属性即可;另一种是它也提供了python package,可以使用pip3 直接安装,当然版本受pypi更新限制。查了一下,截止到2022年1月,最新版是v2.2.2, 而pypi仓库里最新版是1.29.2, 落后半年左右。

# 方法1:
curl -L "https://github.com/docker/compose/releases/download/v2.2.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

chmod +x /usr/local/bin/docker-compose

# 方法2:
pip3 install docker-compose --user

这里我们采用第一种方法来安装最新版本。可以执行如下命令来检查docker和docker-compose版本:

docker version # 显示详细信息,包括各模块版本号
docker --version # 只显示简单信息
docker-compose version

安装PhotoPrism

这个没什么特别的,参照官方文档,创建一个文件夹,cd到此文件夹下,然后下载官方示例的docker-compose.yml 文件,然后在此文件夹下,执行如下命令即可:

docker-compose up -d

其他注意点

Docker版本问题

安装前搜索了几个相关的RHEL8 安装PhotoPrism的文章,比如,参考1参考2,都提到了说RHEL8不支持最新的docker版本里所需要的那个containerd.io的依赖库,因此需要用各种手段安装一个旧的docker和containerd.io版本,我照着做了,也确实做成了,可我现在用默认的最新版docker也一样,估计是现在RHEL 响应用户需求把这些所需依赖放进来了,所以现在呢就不需要折腾旧版本的了,只是可以记着如下几个命令和要点:

# 查询repo里可用版本
sudo dnf list docker-ce --showduplicates | sort -r
docker-ce.x86_64            3:19.03.2-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.1-3.el7                     docker-ce-stable
docker-ce.x86_64            3:19.03.0-3.el7                     docker-ce-stable

# 手动指定安装某个版本,就是名字加版本,中间用破折号-连接即可:
sudo dnf install docker-ce-3:19.03.0-3.el7  

# 也可以使用--nobest 参数来让dnf自动寻找可以安装的某个版本
sudo dnf install --nobest docker-ce

同时呢,文章里也指出了为什么RHEL8不默认支持最新docker,

Red Hat Enterprise Linux 8 does not support Docker: on this distribution it has been replaced by Red Hat own tools like buildah and podman, which are compatible with Docker but don’t need a server/client architecture to run. Using native tools, where possible, is always the recommended way to go, but for a reason or another you may still want to install the original Docker. In this tutorial, we saw how it is possible to install Docker CE on Rhel8, by using the official Docker repository for CentOS7, which is a 100% compatible clone.

它自身带的PodMan和docker非常类似,有时间可以研究一下它了。

Docker之间网络访问问题

PhotoPrism的docker-compose配置文件里指定了两个docker container,一个用来运行mariadb数据库,另一个用来执行PhotoPrism网页服务器,它需要访问这个mariadb数据库container,在运行旧版本的docker和docker-compose时,我就遇到了这个问题,因为RHEL8里的防火墙影响,阻断了PhotoPrism网页服务器容器对数据库容器的访问,因此需要配置防火墙如下:

# Check what interface docker is using, e.g. 'docker0'
ip link show

# Check available firewalld zones, e.g. 'public'
sudo firewall-cmd --get-active-zones

# Check what zone the docker interface it bound to, most likely 'no zone' yet
sudo firewall-cmd --get-zone-of-interface=docker0

# 这里旧版本docker里我机器上显示的是no zone,而最新版本docker安装后,则显示docker,所以最新版本估计不再需要进行防火墙配置了。

# So add the 'docker0' interface to the 'public' zone. Changes will be visible only after firewalld reload
sudo nmcli connection modify docker0 connection.zone public

# Masquerading allows for docker ingress and egress (this is the juicy bit)
sudo firewall-cmd --zone=public --add-masquerade --permanent
# Optional open required incomming ports (wasn't required in my tests)
# sudo firewall-cmd --zone=public --add-port=443/tcp
# Reload firewalld
sudo firewall-cmd --reload
# Reload dockerd
sudo systemctl restart docker

# 如果想撤销上述防火墙配制,比如我重新安装了最新版docker,启动时报错说docker0 zone 冲突,那么我就要撤掉上述配置:

则执行如下命令:
sudo firewall-cmd --permanent --zone=public --remove-interface=docker0
sudo firewall-cmd --permanent --zone=public --remove-masquerade
sudo firewall-cmd --reload
sudo systemctl restart docker

# 上面第一个命令执行后,返回消息如下:
The interface is under control of NetworkManager and already bound to the default zone.

The interface is under control of NetworkManager, setting zone to default.

success
#用sudo firewll-cmd --list-all看一下,docker0还在里面,后来干脆删了算了:
sudo nmcli connection delete docker0
稍后再重新安装docker就可以了。

Terminal session log

这个其实挺有用的,就是把你在Terminal里的操作都给你记录下来,然后可以回放给别人看,就像看别人实机操作一样。参考这篇文章:Learn how to Record and Replay Linux Terminal Sessions Activity

# Record

script --timing=timing-$(date +%Y%m%d-%H%M%S).txt session-$(date +%Y%m%d-%H%M%S)-log.txt
# This will generate two files with current time on the logs, one with timing info, one with message info.
# -a will append to exist text file


# Playback 还可以加参数来加快速度, -d 5就是5x

scriptreplay --timing=timing-xx.txt -d 5 session-xx-log.txt
# This will generate two files, one with timing info, one with message info.
# -d num will speed up the playback by num times.

排错检查

journalctl -u docker shows more logs

dnf 命令的一些用法

官方文档在这里:https://docs.fedoraproject.org/en-US/quick-docs/dnf/

To search the repositories for a package type:
# sudo dnf search packagename

To install the package:
# dnf install packagename

To remove a package:
# dnf remove packagename

Other common DNF commands include:

autoremove - removes packages installed as dependencies that are no longer required by currently installed programs.

check-update - checks for updates, but does not download or install the packages.

downgrade - reverts to the previous version of a package.

info - provides basic information about the package including name, version, release, and description.

reinstall - reinstalls the currently installed package.

upgrade - checks the repositories for newer packages and updates them.

exclude - exclude a package from the transaction.

远程登录进入docker 容器的方法

参考这篇文章:https://phoenixnap.com/kb/how-to-ssh-into-docker-container,两种方法:

To get access and run commands in that Docker container, type the following:

sudo docker exec –it nginx-test /bin/bash

Now, you are logged in to the nginx-test container. Therefore, any commands you enter will perform in that container. The –i option specifies interactive, and the –t enables a terminal typing interface.

或者:

sudo docker attach container_Name

Once the command is executed, you will be working in the container. Any commands you run will affect the virtual Docker environment.

关于docker 容器的一些命令

# 容器操作
docker ps #显示当前活跃容器
docker ps --all #显示当前活跃容器以及停止运行容器
docker rm containerId or name # 删除某个容器

#镜像操作
docker images # 列出所有镜像
docker rmi imageId # 使用镜像id来删除某个镜像
docker rmi repo:TAG #另一种删除方式

关于docker-compose的一些命令:

参考这里:https://docs.photoprism.app/getting-started/docker-compose/