使用容器来运行简单的进程,然后退出。可以配置容连续运行特定服务,如数据库服务。如果持续运行服务,需要向容器添加更多的资源,如持久存储或对其他网络的访问权限。
当Web服务器或数据库服务器等容器需要为外部客户端提供服务时,需要客户端设置通信通道,以访问容器的内容。可以通过配置端口映射,以启用与容器的通信。通过端口映射,将容器主机上的端口球球转发到容器内的端口。
容器的环境变量
容器镜像允许在创建时传递环境变量以自定义容器。可以使用环境变量为容器设置相关参数,根据自己的环境进行定制,无需创建自己的自定义镜像。通常不会修改容器镜像,因为这会在镜像中添加层,使其更加难以维护。
当一个容器需要在创建时指定变量,直接创建容器时会启动失败
查看容器镜像,可以发现存在一个mariadb-105镜像
podman search registry.lab.example.com/
直接创建并运行容器,因为该镜像不在本地,podman会先下载镜像然后才创建容器
podman run -d --name db01 registry.lab.example.com/
查看容器db01的状态,可以看到状态为Exited
podman ps -a
查看容器的日志
podman logs db01
podman container logs db01
先删除刚刚创建的容器
podman rm -f db01
重新创建容器并传递环境变量
podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db1 -e MYSQL_ROOT_PASSWORD=redhat@123 registry.lab.example.com/rhel8/mariadb-105
在默认情况下,运行容器时,存储的所有内容都基于容器的镜像。容器镜像的寿命比较短,用户或应用写入的所有的新数据都会在移除容器后丢失。如果要持久保存数据,通过将容器中的主机系统内容与–volume(-v)选项搭配使用。在容器中使用此卷类型时,必须考虑文件系统级别的权限。
在Mariadb容器镜像中,mysql用户必须拥有/var/lib/mysql目录,等同于Mariadb数据库在主机上运行。挂载到容器中的目录必须具有mysql作为用户或组所有者。如果以root运行容器,则主机上的UID和GID与容器内的UID和GID匹配。意思是,如果要将主机中的目录挂载到容器中,尽量保证内外的属主和属组一致。在Mariadb数据库中,数据的存储目录为/var/lib/mysql。
1、容器存储的SELinux上下文
如果要在本机上存储容器数据, 则必须要给主机文件夹设置安全上下文(container_file_t),然后才能将该目录作为持久存储挂载到容器中。如果主机目录没有设置安全上下文,则容器无法访问该目录。通过在-v选项中附加Z
参数,可以自动设置SELinux上下文。
一共有两种参数,分别是:Z
和:z
:Z
:选项用于将指定的安全上下文设置为挂载点或文件的值。当使用:Z
时,Podman会更改挂载点或文件的安全上下文,以确保容器可以访问指定的主机文件系统路径,并具有正确的SELinux权限。会将文件或目录安全上下文更改为container_file_t:z
:这个选项用于将当前SELinux安全上下文传播给容器中的挂载点或文件。当使用:z
时,Podman会将主机上的安全上下文直接传播到容器中的挂载点或文件,以确保容器内的进程具有与宿主机相同的安全上下文。使用:Z
实际上是指定了:z
选项的默认值(container_file_t),将默认的SELinux安全上下文应用于挂载点或文件。
在大多数情况下,如果你只是想让容器能够访问主机上的目录或文件,并且不关心具体的安全上下文,那么使用:Z
是一个简单而安全的选择。如果你需要更精细地控制安全上下文,或者需要确保容器内的进程具有与主机具有相同的安全上下文,那么可以使用:z
选项。
2、用户命名空间的UID映射
podman unshare cat /proc/self/uid_map # 获取用户命名空间的UID映射
podman unshare cat /proc/self/gid_map # 获取用户命名空间的GID映射
可以看到,容器中的root用户(UID=GID=0)映射到主机计算机上的用户为(UID=GID=1000);容器中的UID=GID=1映射到主机计算机上为(UID=GID=100000)。
3、分配端口映射到容器
要提供对容器的网络访问权限,客户端必须连接到容器主机上的端口,这些端口将网络流量传递到容器中的端口。将容器主机上的网络端口映射到容器中的端口时,容器将接收发送到主机网络端口的网络流量。
4、容器中的网络配置
Podman4.0中支持两种容器网络后端,分别是Netavark和CNI。在RedHat9中,系统默认使用Netavark。
podman info --format {{.Host.NetworkBackend}}
创建容器网络
podman network create --gateway 192.168.10.254 --subnet 192.168.10.0/24 db_net
列出容器网络
podman network ls
查看容器网络的详细信息
podman network inspect podman
容器持久化存储的步骤
先删除当前存在的所有容器
podman rm -f -a
先在本机新建存储目录
如果想要容器可以访问主机的目录,则首先需要容器中的用户具备对主机目录的访问权限
mkdir /home/student/mysql_db
先临时创建一个Mariadb数据库容器
podman run -d --name db01 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db -e MYSQL_ROOT_PASSWORD=redhat@123 registry.lab.example.com/rhel8/mariadb-105
查看容器密码文件中的mysql用户的UID和GID,得出UID和GID都为27
podman exec -it db01 grep mysql /etc/passwd
查看容器中Mariadb服务的监听端口号
podman exec -it db01 ss -tlnp
给主机目录设置属组和属主
podman unshare chown 27:27 /home/student/mysql_db
创建Mariadb容器的参考语句可以借鉴容器介绍中的usage字段
skopeo inspect docker://registry.lab.example.com/rhel8/mariadb-105 | grep usage
新建容器,指定容器的挂载目录和映射端口,自动调整主机目录的SELinux安全上下文
podman run -d --name db02 -e MYSQL_USER=user -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db -e MYSQL_ROOT_PASSWORD=redhat@123 -v /home/student/mysql_db:/var/lib/mysql:Z -p 13306:3306 registry.lab.example.com/rhel8/mariadb-105
-v
:挂载目录/home/student/mysql_db
:主机的目录/var/lib/mysql
:容器中的目录:Z
:自动为主机目录添加安全上下文-p 13306:3306
:将主机的13306端口映射到容器中的3306端口查看主机挂载目录的安全上下文
ll -dZ /home/student/mysql_db
查看容器的端口映射关系
podman port -a
调整防火墙规则
sudo firewall-cmd --add-port=13306/tcp --permanent
sudo firewall-cmd --reload
sudo firewall-cmd --list-all
使用本地主机测试访问容器数据库服务
sudo dnf install mariadb -y # 安装Mariadb软件
mysql -u user -predhat -h 127.0.0.1 -P 13306
使用异地主机远程访问容器数据库服务
sudo dnf install -y mariadb
mysql -u user -predhat -h 172.25.250.10 -P 13306
将容器配置为systemd服务,并将容器服务配置为在系统启动时自动启动。如果希望可以无限期运行服务的容器,如Web服务器或数据库,特权用户通常将这些服务配置为在系统启动时运行,使用systemctl命令进行管理。作为普通用户,可以通过创建systemd单元来配置Rootless容器。通过此配置,可以通过systemctl命令将容器作为常规系统服务进行管理。基于systemd单元管理容器主要用于不需要扩展的基本和小型部署。如果存在的容器过多和服务更加复杂,则可以使用Kubernetes的企业编排平台。
systemd服务分类
首先需要在用户家目录下创建单元文件目录,然后进入目录
mkdir -p ~/.config/systemd/user/
cd ~/.config/systemd/user/
使用podman generate systemd生成单元文件
podman generate systemd -n ConName -f
使用普通用户来生成单元文件,如果用户从系统注销,systemd服务会在特定时间后停止容器。因为systemd服务单元是使用.user
选项创建的,在用户登录时启动服务,并在用户注销时停止服务。可以通过运行loginctl enable-linger命令来更改此默认行为并强制已启用的服务在服务器启动时启动,并在服务器关闭时停止。
创建一个redhat9容器
podman run -d --name redhat9_con registry.lab.example.com/ubi9-beta/ubi:latest
进入用户家目录,创建容器服务
cd ~/.config/systemd/user
podman generate systemd -n redhat9_con -f
更改默认行为,为所配置服务的用户注销后服务保留
loginctl enable-linger
loginctl show-user student # 验证命令是否配置成功
验证:注销当前student用户,再次使用student用户登陆,可以看到redhat9_con容器状态依旧是Up(我们没有将该容器你设置为开机自启)
如果只是临时某个容器,在容器使用完就自动删除,可以添加–rm选项
创建一个redhat9容器,查看完容器的版本号就删除容器
podman run --rm registry.lab.example.com/ubi9-beta/ubi cat /etc/redhat-release
案例说明
登录podman
podman login -u admin -p redhat321 registry.lab.example.com
验证:查看podman登录
podman login --get-login
创建容器网络
podman network create --subnet 192.168.10.0/24 --gateway 192.168.10.254 ConNet
验证:查看容器网络的详细信息
podman network inspect ConNet
主机上创建数据存储目录
mkdir /home/student/db_data
podman unshare chown 27:27 /home/student/db_data
验证:查看主机目录的权限
ll -d /home/student/db_data
查找创建容器模板
podman inspect registry.lab.example.com/rhel8/mariadb-105 | grep usage
创建数据库容器
podman run -di --name mariadb_con --network ConNet -e MYSQL_USER=mike -e MYSQL_PASSWORD=redhat -e MYSQL_DATABASE=db1 -p 13307:3306 -v /home/student/db_data:/var/lib/mysql:Z registry.lab.example.com/rhel8/mariadb-105
验证:-查看数据库容器状态
podman ps
验证:查看容器的网络信息
podman exec -it mariadb_con ip add show eth0
验证:查看容器的详细信息
podman inspect mariadb_con # 查看Netwokrs字段内容
先查看容器镜像仓库中的容器镜像
podman search registry.lab.example.com/
创建RedHat9容器
podman会先下载容器镜像,然后才会创建容器,这里我们只需要容器具有仓库文件的读权限,而不需要有写权限,所以无需修改SELinux安全上下文。
podman run -di --name redhat9_con --network ConNet -v /etc/yum.repos.d/:/etc/yum.repos.d/ registry.lab.example.com/ubi9-beta/ubi
验证:查看容器状态
podman ps
查找相关命令的来源包
dnf provides ping
dnf provides ip
容器安装相关包
podman exec -it redhat9_con dnf install -y iputils iproute
验证:查看容器的网络信息
podman exec -it redhat9_con ip add show eth0
podman exec -it redhat9_con ping 192.168.10.1 -c3
验证:测试DNS解析
podman exec -it redhat9_con ping mariadb_con -c3
主机上调整防火墙策略
sudo firewall-cmd --add-port=13307/tcp --permanent
sudo firewall-cmd --reload
验证:查看当前防火墙策略
sudo firewall-cmd --list-ports
先在redhat9_con容器中安装Mariadb服务
podman exec -it redhat9_con dnf install -y mariadb
在redhat9_con容器中访问mariadb_con容器中的mariadb服务
podman exec -it redhat9_con /bin/bash # 开启伪终端
mysql -u mike -predhat -h 192.168.10.1
创建容器网络
podman network create --subnet 192.168.20.0/24 --gateway 192.168.20.254 ConNet2
验证:查看容器网络的详细信息
podman network inspect ConNet2
为Mariadb容器添加网络
podman network connect ConNet2 mariadb_con
验证:查看容器的网络信息
podman inspect mariadb_con
先将本地所有的容器删除
podman rm -f -a
登录podman
podman login registry.lab.example.com
验证:查看登录
podman login --get-login
创建主机的本地挂载目录
mkdir -p /home/student/appdev-adm/nginx_web
在挂载目录中添加索引页
echo nginx_web_page > /home/student/appdev-adm/nginx_web/index.html
查看容器镜像仓库
podman search
创建nginx容器并运行
需要在-v选项中指定:Z
,为挂载目录添加SELinux安全上下文,否则SELinux 会阻止容器访问挂载的主机目录
podman run -d --name nginx_con -v /home/student/appdev-adm/nginx_web/:/usr/share/nginx/html:Z -p 8080:80 registry.lab.example.com/library/nginx
验证:查看容器状态
podman ps
验证:本地访问nginx_con容器中的nginx服务
curl localhost:8080
**新建用户systemd单元文件存储目录 **
mkdir -p ~/.config/systemd/user
cd ~/.config/systemd/user
创建容器单元文件
podman generate systemd -n nginx_con -f
验证:查看当前目录下生成的单元文件
验证:将容器暂停,然后通过systemctl启动
podman stop nginx_con
systemctl --user start container.nginx_con.service # --user:用户级别启动