一时兴起,想用Podman+Nginx来创建一个内网的源站点,同时发现了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文件实现。
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 基于最小权限原则默认拦截了 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
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
原文:https://blog.51cto.com/huanghai/3215448