一时兴起,想用Podman+Nginx来创建一个内网的源站点,同时发现了Podman还可以创建系统服务来实现自启动,但最后感觉稳定性上还是有点问题,不过这个功能倒是感觉可以记录下的。
前期条件
- 系统Centos Stream 8
- 官方Nginx镜像
- 准备好源(比如我前期准备的centos/rocky镜像)
- 安装Podman
直接命令行运行
sudo podman run --name repo -p 8080:80 -v /vol/repo:/usr/share/nginx/html:ro -v ~/test/nginx.conf:/etc/nginx/nginx.conf docker.io/library/nginx:1.20.1-alpine
其中/vol/repo为仓库存放目录,~/test/nginx.conf为配合仓库浏览和下载需要的配置文件。
对于nginx.conf文件需要在源文件中增加如下
autoindex on;
audoindex_exact_size off; // 默认是on显示的是字节,off为KB,MB,GB...
audoindex_localtime on; // 默认是off使用的是UTC时间,on为当前机器时间
对于nginx.conf文件的获取可以使用如下命令拷贝到当前目录:
sudo podman cp repo:/etc/nginx/nginx.conf ./
对于容器的操作说明:
sudo podman ps -a // 查看当前所有容器
sudo podman stop repo // 停止容器repo
sudo podman rm repo // 删除容器repo
sudo podman restart repo // 重启容器repo,可能更新源后需要
另外,由于命令较长,可以写到脚本里面。
开通防火墙
通过自定义一个防火墙service的xml文件实现。
- 进入firewalld的service存放目录并拷贝一个http文件
cd /usr/lib/firewalld/services sudo cp http.xml container-repo.xml
- 编译文件中描述和端口
sudo vim container-repo.xml ... <port protocol="tcp" port="8080" /> ... //
- 添加服务并重载
sudo firewall-cmd --add-service=container-repo --permanent sudo firewall-cmd --reload
配置SELinux
原因: SELinux 基于最小权限原则默认拦截了 Nginx 的请求.
- 开启访问
sudo setsebool -P httpd_can_network_connect 1
- 分析现有日志并生成关联模块
sudo ausearch -c ‘nginx‘ --raw | audit2allow -M container-nginx-repo
执行完此命令可以看到在当前目录下会生成后缀为.pp和.te文件,如果该服务器上的服务未被访问过,此命令执行无效。
-
加载前一步生成的模块内容
sudo semodule -i container-nginx-repo.pp
配置系统服务实现自启动
- 创建容器
sudo podman create --name repo -p 8080:80 -v /vol/repo:/usr/share/nginx/html:ro -v ~/temp/nginx.conf:/etc/nginx/nginx.conf:ro docker.io/library/nginx:1.20.1-alpine
- 生成systemd unit文件
sudo podman generate systemd --files --restart-policy on-failure --name repo
生成的container-repo.service文件在当前目录,需要将其拷贝到系统目录
sudo cp container-repo.service /etc/systemd/system
- 载入服务
sudo systemctl daemon-reload
- 开启服务
sudo systemctl enable container-repo.service --now