Docker 设置特权级运行的容器

1 背景知识

有的时候我们需要容器具备更多的权限,比如操作内核模块,控制 swap 交换分区,挂载 USB 磁盘,修改 MAC 地址等。本实验中我们给予容器这些权限,仅仅通过一个简单的 --privileged=true 的参数。

2 关闭超级权限

1、创建 kcp_centos01,一个不具备特权参数的容器

docker run -ti -h node111 --name kcm_centos01 --network host  centos:7.2.1511 /bin/bash

2、安装 iproute 软件包。

yum install iproute -y

3、查看容器的 IP 地址和 MAC 地址信息。

ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:0c:29:73:e1:51 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.111/24 brd 192.168.40.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe73:e151/64 scope link
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 500
    link/ether 52:54:00:62:ff:61 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:96:f5:99:ff brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:96ff:fef5:99ff/64 scope link
       valid_lft forever preferred_lft forever

4、修改 mac 地址。

ip link set eno16777736 address 00:01:02:03:04:05
RTNETLINK answers: Operation not permitted
Note

这里命令会修改失败。

3 开启超级权限

1、创建 kcp_centos01,一个不具备特权参数的容器

docker run -ti --privileged=true -h node112 --name kcm_centos02 --network host  centos:7.2.1511 /bin/bash

2、安装 iproute 软件包。

yum install iproute -y

3、查看容器的 IP 地址和 MAC 地址信息。

ip a

4、修改 mac 地址。

ip link set eno16777736 address 00:01:02:03:04:05

5、查看修改后的结果。

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eno16777736: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
    link/ether 00:01:02:03:04:05 brd ff:ff:ff:ff:ff:ff
    inet 192.168.40.111/24 brd 192.168.40.255 scope global eno16777736
       valid_lft forever preferred_lft forever
    inet6 fe80::20c:29ff:fe73:e151/64 scope link
       valid_lft forever preferred_lft forever
3: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 00:00:00:00:00:00 brd ff:ff:ff:ff:ff:ff
    inet 192.168.122.1/24 brd 192.168.122.255 scope global virbr0
       valid_lft forever preferred_lft forever
4: virbr0-nic: <BROADCAST,MULTICAST> mtu 1500 qdisc pfifo_fast state DOWN group default qlen 500
    link/ether 52:54:00:62:ff:61 brd ff:ff:ff:ff:ff:ff
5: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:96:f5:99:ff brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:96ff:fef5:99ff/64 scope link
       valid_lft forever preferred_lft forever
Note

这里修改宿主机的MAC 地址将会成功。

4 查看容器详细信息

docker inspect kcm_centos01 | grep Privileged
docker inspect kcm_centos02 | grep Privileged