openEuler容器使用

版本:openEuler-24.03-LTS-SP3

一、容器:isula

yum install iSulad

安装CNI

# 创建目录
mkdir -p /opt/cni/bin /etc/cni/net.d
# 下载 CNI 插件
wget https://github.com/containernetworking/plugins/releases/download/v1.9.1/cni-plugins-linux-amd64-v1.9.1.tgz
# 解压到 /opt/cni/bin
tar -zxvf cni-plugins-linux-amd64-v1.9.1.tgz -C /opt/cni/bin/
# 查看是否有 bridge、host-local 等
ls /opt/cni/bin

配置 iSulad 启用 CNI

vim /etc/isulad/daemon.json

确保包含以下关键项(network-plugin 必须设为 cni):

{
  "network-plugin": "cni",
  "cni-bin-dir": "/opt/cni/bin",
  "cni-conf-dir": "/etc/cni/net.d",

  // 其他原有配置保留
  "log-level": "info",
  "storage-driver": "overlay2"
}
  • network-plugin: "cni" —— 开启 CNI 网络(默认是空,只有 lo)openEuler社区
  • cni-bin-dir —— CNI 插件二进制目录openEuler社区
  • cni-conf-dir —— CNI 网络配置文件目录openEuler社区

编写一个 CNI 网络配置(bridge 示例)

/etc/cni/net.d/ 下创建 10-bridge.conf

vim /etc/cni/net.d/10-bridge.conf

内容:

{
  "cniVersion": "1.0.0",
  "name": "bridge-net",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.244.0.0/16",
    "routes": [
      { "dst": "0.0.0.0/0" }
    ]
  }
}

iSulad 会字典序读取 net.d 下第一个 .conf/.conflist 作为默认网络

也可以isula创建

#自动生成 CNI 配置文件放到 /etc/cni/net.d/,并创建对应的网桥
#-d, --driver:网络驱动,仅支持 bridge(默认)
isula network create -d bridge my-net
#--subnet CIDR:容器网段(必填,推荐),如 10.244.0.0/16
#--gateway IP:网关,必须配合 --subnet;不写则用网段第一个 IP。
isula network create --subnet 10.244.0.0/16 --gateway 10.244.0.1 my-net
#--internal:内网隔离,容器不能访问外网
isula network create --internal --subnet 192.168.50.0/24 internal-net
#双网卡内网+外网都能互通,再接入internal-net网卡,这个是docker命令
#docker network connect internal-net nginx
#把 nginx 从 internal-net网卡 断开,这个是docker命令
#docker network disconnect -f internal-net nginx
#彻底删除一个网络(网桥 + CNI 配置全部删掉,容器需要全部断开)
isula network rm my-net

重启 iSulad 生效

systemctl restart isulad
systemctl enable isulad

# 检查是否正常启动
systemctl status isulad

验证 CNI 是否生效

创建网络

# 先确保有 default 桥网络(没有就创建一次)
isula network create -d bridge default

运行一个容器

# 运行并端口映射(必须加 --network default)
isula run -d --name nginx --restart=always --network default -p 80:80 nginx:latest
#查看容器ip
isula inspect nginx | grep IPAddress

nginx容器访问文件夹权限问题

安装semanage

dnf install policycoreutils-python-utils

配置权限

# 1. 添加永久 SELinux 规则(/data/www 及其所有子文件)
semanage fcontext -a -t svirt_sandbox_file_t "/data/www(/.*)?"

# 2. 立刻应用到现有文件(递归)
restorecon -Rv /data/www

# 权限
chmod -R 755 /data/www

检查容器端口映射情况

isula port nginx

禁止 --expose 自动映射

#容器-p 指定容器内部IP
-p 10.17.0.3:9100:9100 

举例:

isula run -d \
-p 80:80 \
-p 19180:19180 \
-p 443:443 \
-v /data/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /data/nginx/conf.d:/etc/nginx/conf.d \
-v /data/nginx/html:/usr/share/nginx/html \
-v /data/nginx/logs:/var/log/nginx \
-v /data/nginx/ssl:/etc/nginx/ssl \
-v /etc/localtime:/etc/localtime:ro \
-v /data/www:/data/www \
-e TZ=Asia/Shanghai \
--restart=always \
--network=proxy \
--ip 10.17.0.2 \
--name nginx \
nginx:1.31.1


isula run -d \
-p 10.17.0.3:9100:9100 \
--restart=always \
--name node-exporter \
--hostname GZ-IT-Proxy \
--network=proxy \
--ip 10.17.0.3 \
--pid host \
-v /etc/localtime:/etc/localtime:ro \
-v /:/host:ro,rslave \
prom/node-exporter:v1.11.1 \
--path.rootfs=/host

二、容器:nerdctl

dnf install containerd -y
# 最新版
wget https://github.com/containerd/nerdctl/releases/download/v2.3.1/nerdctl-2.3.1-linux-amd64.tar.gz
#解压
tar -xzf nerdctl-2.3.1-linux-amd64.tar.gz
# 移动到全局bin
mv nerdctl /usr/local/bin/
#启动容器
systemctl start containerd
systemctl enable containerd
#验证nerdctl
nerdctl -v

为nerdctl配置国内镜像加速

vim /etc/containerd/config.toml

写入下面内容

[plugins."io.containerd.grpc.v1.cri".registry]
  [plugins."io.containerd.grpc.v1.cri".registry.mirrors]
    [plugins."io.containerd.grpc.v1.cri".registry.mirrors."docker.io"]
      endpoint = [
        "https://docker.1ms.run",
        "https://docker.m.daocloud.io",
        "https://registry-1.docker.io"
      ]

创建目录和文件

mkdir -p /etc/containerd/certs.d/docker.io
vim /etc/containerd/certs.d/docker.io/hosts.toml

写入加速器地址:

server = "https://docker.io"

[host."https://xxxxx.mirror.swr.myhuaweicloud.com"]
  capabilities = ["pull", "resolve"]

重启容器

systemctl restart containerd

配置 CNI

nerdctl 默认需要 CNI 网络,否则容器无法联网:

# 1. 创建 CNI 目录
mkdir -p /etc/cni/net.d

# 2. 写入默认网络配置(bridge)
cat <<EOF | sudo tee /etc/cni/net.d/10-bridge.conf
{
  "cniVersion": "0.4.0",
  "name": "bridge",
  "type": "bridge",
  "bridge": "cni0",
  "isGateway": true,
  "ipMasq": true,
  "ipam": {
    "type": "host-local",
    "subnet": "10.4.0.0/24",
    "routes": [{"dst": "0.0.0.0/0"}]
  }
}
EOF

编排

nerdctl compose up -d
nerdctl compose down

三、防火墙

# 开发端口
firewall-cmd --add-port=9100/tcp --permanent
firewall-cmd --reload
#移除端口
firewall-cmd --zone=public --remove-port=9100/tcp --permanent 
firewall-cmd --reload 
#防火墙IP加黑名单
firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="45.200.148.199" reject'