非root用户使用podman容器

前提条件

podman如果要使用普通用户,shell不能是nologin。
必须要有ssh或者终端登录。


创建一个普通用户

# 创建普通权限新用户devops
[cesu-c8 root ~]# useradd devops

# 给devops用户设置密码
[cesu-c8 root ~]# echo devops|passwd --stdin devops 
Changing password for user devops.
passwd: all authentication tokens updated successfully.

# 使用devops用户ssh登录到主机
ssh devops@podmanhost

查看镜像

root下已经使用podman拉取了httpd镜像,在devops用户下是看不到root拉取到镜像的。

# 使用devops用户查看镜像,发现没有镜像
[cesu-c8 devops ~]$ podman images
REPOSITORY  TAG         IMAGE ID    CREATED     SIZE

查看podman的数据目录

# 查看当前用户的podman配置文件路径
[cesu-c8 devops ~]$ podman info|grep -E 'configFile|graphRoot|volumePath'
  configFile: /home/devops/.config/containers/storage.conf
  graphRoot: /home/devops/.local/share/containers/storage
  volumePath: /home/devops/.local/share/containers/storage/volumes

使用devops拉取httpd镜像

# 使用devops用户拉取httpd镜像
[cesu-c8 devops ~]$ podman pull httpd

# 查看devops用户拉取的镜像列表
[cesu-c8 devops ~]$ podman images
REPOSITORY               TAG         IMAGE ID      CREATED      SIZE
docker.io/library/httpd  latest      1132a4fc88fa  11 days ago  148 MB

# 查看httpd镜像的镜像id
[cesu-c8 devops ~]$ podman images -q
1132a4fc88fa

# 根据镜像id查看httpd镜像的存储目录
[cesu-c8 devops ~]$ locate -b /home/ 1132a4fc88fa
/home/devops/.local/share/containers/storage/overlay-images/1132a4fc88faaf5c19959f03535c1356d3004ced1978cb9c3f32e73d9c139532

启动一个容器

非root用户只能映射1024以上的端口,1024以下的端口只能root用户映射。

# 容器名httpdtest,映射到本地81端口,目录挂载到/web
[cesu-c8 devops ~]$ podman run --name httpdtest -dti -p 1081:80 -v ~/web:/usr/local/apache2/htdocs httpd
da3f671d340d4972c848e2de3b085e15f9f7da7b342e9c0fa586aefb21877183

# 给~/web目录下添加一个index.html文件
[cesu-c8 devops ~]$ echo "端口是通的">>~/web/index.html
[cesu-c8 devops ~]$ cat web/index.html 
端口是通的

# 查看容器
[cesu-c8 devops ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED        STATUS            PORTS                 NAMES
da3f671d340d  docker.io/library/httpd:latest  httpd-foreground  4 seconds ago  Up 4 seconds ago  0.0.0.0:1081->80/tcp  httpdtest

# 查看httpd服务是否正常
[cesu-c8 devops ~]$ curl localhost:1081
端口是通的

非根用户容器开机自启


创建普通用户的systemd目录

# 创建~/.config/systemd/user目录来存放service文件
mkdir ~/.config/systemd/user -p

给容器创建自启动service文件

# 给容器创建service文件
podman generate systemd -n --new -f httpdtest

将容器自启动service文件移动到用户的systemd目录

# 将service文件移动到普通用户的systemd目录~/.config/systemd/user/
[cesu-c8 devops ~]$ mv container-httpdtest.service ~/.config/systemd/user/

修复容器自启动service文件的SELinux安全上下文

系统如果开启了SELinux,需要修复下SELinux安全上下文

# 如果开启了SELinux,需要修复service文件的SELinux安全上下文
[cesu-c8 devops ~]$ restorecon -RvF ~/.config/systemd/user/container-httpdtest.service 

查看用户的systemd权限


查看当前用户是否拥有执行systemd的权限
# 查看当前用户是否拥有执行systemd的权限
[cesu-c8 devops ~]$ loginctl
SESSION  UID USER   SEAT TTY     
      9    0 root

查看哪些用户可以执行systemd
# 查看哪些用户可以执行systemd
[cesu-c8 devops ~]$ loginctl list-users 
 UID USER  
   0 root  
1001 devops
2 users listed.   

查看当前用户的systemd配置信息
# 查看当前用户的systemd配置信息
[cesu-c8 devops ~]$ loginctl show-user
EnableWallMessages=no
NAutoVTs=6
KillUserProcesses=no
RebootToFirmwareSetup=no
IdleHint=no
IdleSinceHint=0
IdleSinceHintMonotonic=0
DelayInhibited=sleep
InhibitDelayMaxUSec=5s
HandlePowerKey=poweroff
HandleSuspendKey=suspend
HandleHibernateKey=hibernate
HandleLidSwitch=suspend
HandleLidSwitchDocked=ignore
HoldoffTimeoutUSec=30s
IdleAction=ignore
IdleActionUSec=30min
PreparingForShutdown=no
PreparingForSleep=no
Docked=yes
RemoveIPC=no
RuntimeDirectorySize=79671296
InhibitorsMax=8192
NCurrentInhibitors=1
SessionsMax=8192
NCurrentSessions=2

开启当前用户的systemd权限

如果用户没有systemd权限,需要执行这个命令开启systemd权限,
否则做的systemd操作是不会生效的

loginctl enable-linger

查看用户的systemd的权限
[cesu-c8 devops ~]$ loginctl user-status devops 
devops (1001)
           Since: Tue 2021-11-02 19:58:07 CST; 1h 37min ago
           State: active
        Sessions: *7

以普通用户执行systemd开机自启容器

# 普通用户执行systemd重新加载systemd配置
systemctl --user daemon-reload

# 普通用户设置service文件开机自启
[cesu-c8 devops ~]$ systemctl --user enable --now container-httpdtest.service

# 查看容器自启动服务状态
[cesu-c8 devops ~]$ systemctl --user status container-httpdtest.service
container-httpdtest.service - Podman container-httpdtest.service
   Loaded: loaded (/home/devops/.config/systemd/user/container-httpdtest.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2021-11-02 21:47:44 CST; 2s ago
     Docs: man:podman-generate-systemd(1)
  Process: 4418 ExecStart=/usr/bin/podman run --conmon-pidfile /run/user/1001/container-httpdtest.pid --cidfile /run/user/1001/container-httpdtest.ctr-id --cgroups=no-conmon --replace --name h>
  Process: 4416 ExecStartPre=/bin/rm -f /run/user/1001/container-httpdtest.pid /run/user/1001/container-httpdtest.ctr-id (code=exited, status=0/SUCCESS)
 Main PID: 4471 (conmon)

重启

# 切换到root下执行reboot

查看容器是否自动运行

# 查看systemd的服务状态
[cesu-c8 devops ~]$ systemctl --user status container-httpdtest.service 
● container-httpdtest.service - Podman container-httpdtest.service
   Loaded: loaded (/home/devops/.config/systemd/user/container-httpdtest.service; enabled; vendor preset: enabled)
   Active: active (running) since Tue 2021-11-02 21:55:10 CST; 7s ago
     Docs: man:podman-generate-systemd(1)

# 查看容器状态是否在运行
[cesu-c8 devops ~]$ podman ps
CONTAINER ID  IMAGE                           COMMAND           CREATED         STATUS             PORTS                 NAMES
3f1d855dd9dc  docker.io/library/httpd:latest  httpd-foreground  22 seconds ago  Up 23 seconds ago  0.0.0.0:1081->80/tcp  httpdtest

# 验证服务服务是否可以访问
[cesu-c8 devops ~]$ curl localhost:1081
端口是通的
  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

识途老码

赞赏是第一生产力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值