Podman+Nginx创建带自启动的源站点

一时兴起,想用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文件实现。

  1. 进入firewalld的service存放目录并拷贝一个http文件
    cd /usr/lib/firewalld/services
    sudo cp http.xml container-repo.xml
  2. 编译文件中描述和端口
    sudo vim container-repo.xml
    ...
    <port protocol="tcp" port="8080" />
    ...
    // 
  3. 添加服务并重载
    sudo firewall-cmd --add-service=container-repo --permanent
    sudo firewall-cmd --reload

    配置SELinux

    原因: SELinux 基于最小权限原则默认拦截了 Nginx 的请求.

  4. 开启访问
    sudo setsebool -P httpd_can_network_connect 1
  5. 分析现有日志并生成关联模块
    sudo ausearch -c ‘nginx‘ --raw | audit2allow -M container-nginx-repo

    执行完此命令可以看到在当前目录下会生成后缀为.pp和.te文件,如果该服务器上的服务未被访问过,此命令执行无效。

  6. 加载前一步生成的模块内容

    sudo semodule -i container-nginx-repo.pp

    配置系统服务实现自启动

  7. 创建容器
    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
  8. 生成systemd unit文件
    sudo podman generate systemd --files --restart-policy on-failure --name repo

    生成的container-repo.service文件在当前目录,需要将其拷贝到系统目录

    sudo cp container-repo.service /etc/systemd/system
  9. 载入服务
    sudo systemctl daemon-reload
  10. 开启服务
    sudo systemctl enable container-repo.service --now
上一篇:JDK KRE


下一篇:Go 从控制台获取用户信息