Docker底层服务之NameSpace、Cgroup、存储、网络

三、Docker底层服务

1.NameSpace

在server节点,查询rancher/server容器的进程号,建立命名空间/var/run/netns并与rancher/server容器进行连接,通过ip netns相关命令查询该容器的ip,将以上操作命令及检查结果填入命令行界面。

# docker inspect -f '{{.State.Pid}}' 5feca07aad20

# mkdir /var/lib/netns

# ln -s /proc/3473/ns/net /var/lib/netns/rancher-server (ln -s /proc/11649/ns/net /var/run/netns/11649)

# ip netns list

rancher-server

# ip netns exec rancher-server ip a

1: lo: mtu 65536 qdisc noqueue state UNKNOWN

    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

4: eth0: mtu 1500 qdisc noqueue state UP

    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff

    inet 172.17.0.2/16 scope global eth0

       valid_lft forever preferred_lft forever

    inet6 fe80::42:acff:fe11:2/64 scope link

       valid_lft forever preferred_lft forever

2.Cgroup

(1)cgroup操作

在registry节点查询当前cgroup的挂载情况,将以上操作命令及检查结果填入命令行界面。

[root@registry ~]# mount -t cgroup

cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)

cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)

cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)

cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)

cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)

cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)

cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)

cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)

cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)

(2)添加移动进程

在registry节点创建memory控制的cgroup,名称为:xiandian,创建完成后将当前进程移动到这个cgroup中,通过cat相关命令查询cgroup中的进程ID,将以上操作命令及检查结果填入命令行界面。

# mkdir /sys/fs/cgroup/memory/xiandian

# echo $$

5759

# sudo sh -c "echo $$ >> /sys/fs/cgroup/memory/xiandian/tasks"

# cat /proc/5759/cgroup

10:hugetlb:/

9:perf_event:/

8:blkio:/system.slice/sshd.service

7:net_cls:/

6:freezer:/

5:devices:/system.slice/sshd.service

4:memory:/xiandian

3:cpuacct,cpu:/system.slice/sshd.service

2:cpuset:/

1:name=systemd:/system.slice/sshd.service

(3)限制进程配额

在registry节点创建cpu控制的cgroup,名称为:xiandian。假设存在进程号为8888一直占用CPU使用率,并且达到100%,严重影响系统的正常运行。使用cgroup相关知识在创建的cgroup中将此进程操作CPU配额调整为30%。将以上操作命令及检查结果填入命令行界面。

# mkdir /sys/fs/cgroup/cpu/xiandian

# echo 30000 > /sys/fs/cgroup/cpu/xiandian/cpu.cfs_quota_us

# echo 8888 > /sys/fs/cgroup/cpu/xiandian/tasks

(4)cgroup查询

在仓库节点创建一个cgroup,名称为:xiandian,位置在cgroup目录下的子系统cpuset中,并向cpuset.cpus,cpuset.mems两个文件中分别写入数字123, 通过cat相关命令查询写入文件的内容, 将以上操作命令及检查结果填入命令行界面

# mkdir /sys/fs/cgroup/cpuset/xiandian

# cd /sys/fs/cgroup/cpuset/xiandian/

# echo 1-3 > cpuset.cpus

# cat cpuset.cpus

1-3

# echo 1-3 > cpuset.mems

# cat cpuset.mems

1-3

(5)cgroup指定创建

在registry节点使用ubuntu镜像创建一个名为1daoyun的容器,只能使用0,1这两个内核,镜像使用ubuntu/14.04.3,并通过查看Cgroup相关文件查看内核使用情况,将以上操作命令及检查结果填入命令行界面

# docker run -dit --name 1daoyun --cpuset-cpus="0,1" ubuntu:14.04.3 /bin/bash

Unable to find image 'ubuntu:14.04.3' locally

Trying to pull repository 192.168.200.106:5000/ubuntu ...

14.04.3: Pulling from 192.168.200.106:5000/ubuntu

8387d9ff0016: Pull complete

3b52deaaf0ed: Pull complete

4bd501fad6de: Pull complete

a3ed95caeb02: Pull complete

Digest: sha256:e69833eaf929c10b20fd413daed3c93188fe6ed4b617bce20799cf516270d217

Status: Downloaded newer image for 192.168.200.106:5000/ubuntu:14.04.3

41a71f67d8d01a6a64a65d1109770e772738e948d4afb278418b1198fd21da47

# cat /sys/fs/cgroup/cpuset/system.slice/docker-41a71f67d8d01a6a64a65d1109770e772738e948d4afb278418b1198fd21da47.scope/cpuset.cpus

0-1

3.存储

(1)挂载主机目录

在registry节点创建/opt/xiandian目录,创建完成后启动名为xiandian-dir,镜像为ubuntu:14.04.3的容器,并指定此目录为容器启动的数据卷,创建完成后通过inspect命令指定查看数据卷和查看容器挂载的情况。将以上操作命令及检查结果填入命令行界面。

# mkdir /opt/xiandian

# docker run -d -it  -P --name xiandian-dir -v /opt/xiandian 192.168.200.12:5000/ubuntu:14.04.3  /bin/bash

# docker inspect -f {{.Config.Volumes}}   xiandian-dir  

map[/opt/xiandian:{}]

# docker inspect -f {{.Mounts}}   xiandian-dir             

[{eaa3ec0d276dbf01b29ae98138fc6440853b991e5dd0107599eecb473ecf6729 /var/lib/docker/volumes/eaa3ec0d276dbf01b29ae98138fc6440853b991e5dd0107599eecb473ecf6729/_data /opt/xiandian local  true }]

(2)挂载主机只读目录

在registry节点创建/opt/xiandian目录,创建完成后启动名为xiandian-dir,镜像为ubuntu:14.04.3的容器,并指定此目录为容器启动的数据卷挂载目录为/opt,设置该数据卷为只读模式,创建完成后通过inspect命令指定查看HostConfig内的Binds情况。将以上操作命令及检查结果填入命令行界面。

#  docker run -d -it  -P --name xiandian-dir -v /opt/xiandian:/opt:ro 192.168.200.12:5000/ubuntu:14.04.3  /bin/bash

# docker inspect -f '{{.HostConfig.Binds}}' 6e4a623cc618

[/opt/xiandian:/opt:ro]

(3)挂载主机文件

在registry节点启动名为xiandian-file,镜像为ubuntu:14.04.3的容器,并指定rancher平台安装脚本“install.sh”为容器启动的数据卷,挂载到容器的/opt目录下,创建完成后通过inspect命令指定查看容器挂载的情况。将以上操作命令及检查结果填入命令行界面。

# mkdir /opt/xiandian

# docker run -d -it  -P --name xiandian-file -v  /opt/install.sh:/opt/install.sh 192.168.200.12:5000/ubuntu:14.04.3  /bin/bash

#  docker inspect -f {{.Mounts}}   xiandian-file

[{ /opt/install.sh /opt/install.sh   true rslave}]

(4)数据备份和恢复

使用一条命令将上题创建的数据卷容器进行数据备份,要求创建一个新的ubuntu:14.04.3容器并引用上题的数据卷,同时创建一个数据卷映射,将本地文件系统的当前工作目录映射到容器的/backup的目录,最后通过tar命令将容器的数据卷打包到/backup数据卷中,将备份的数据卷保存到本地,名称为backup.tar, 将以上操作命令及检查结果填入命令行界面。

# docker run --volumes-from 69bdcf9f3627   -v $(pwd):/backup ubuntu:14.04.3 tar cvf /backup/backup.tar /opt/xiandian

(5)容器连接

在registry节点使用docker相关命令使用mysql:latest镜像创建名为mysqldb的容器,使用镜像nginx:latest创建名为nginxweb容器,容器连接mysqldb容器内数据库,操作完成后使用inspect查看有关链接内容的字段,将以上操作命令及检查结果填入命令行界面。

# docker run -d -it  --name mysqldb  -P  mysql:latest  /bin/bash

# docker run -d -it  --name nginxweb  -P --link mysqldb:db  nginx:latest  /bin/bash

# docker inspect --format {{.HostConfig.Links}} 49cb289d6e73

[/mysqldb:/nginxweb/db]

4.网络

(1)查询网桥

在registry节点通过bridge命令(如果不存在则安装该命令)查看网桥列表,将以上操作命令及检查结果填入命令行界面。

# brctl  show

bridge name     bridge id               STP enabled     interfaces

docker0      8000.02421af76ad0       no               veth35b7a00

                                                            veth643076f

                                                            vethde11f52

(2)定制网桥

registry节点创建xd_br网桥,设立网络的网络地址和掩码为192.168.2.1/24,创建完成后启动该网桥,完成后查看xd_br网卡和网桥详细信息,将以上操作命令及检查结果填入命令行界面。

# brctl  addbr xd_br

# ip addr add  192.168.2.1/24 dev xd_b

Ip link set xd_b up

# brctl  show

bridge name     bridge id               STP enabled     interfaces

docker0         8000.02421af76ad0       no               veth35b7a00

                                                            veth643076f

                                                            vethde11f52

xd_br           8000.000000000000        no

# ifconfig xd_br

xd_br: flags=4098  mtu 1500

        inet 192.168.2.1  netmask 255.255.255.0  broadcast 0.0.0.0

        ether 7e:cb:e4:ca:78:54  txqueuelen 0  (Ethernet)

        RX packets 0  bytes 0 (0.0 B)

        RX errors 0  dropped 0  overruns 0  frame 0

        TX packets 0  bytes 0 (0.0 B)

        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

(3)docker网络

在registry节点利用ubuntu:14.04.3镜像运行一个无网络环境的容器,进入容器后使用ifconfig查看网络信息,将以上操作命令及检查结果填入命令行界面。

# docker run -it -d  --net=none ubuntu:14.04.3 /bin/bash

# docker exec -it 83f831907439 /bin/bash

root@83f831907439:/# ifconfig

lo        Link encap:Local Loopback 

          inet addr:127.0.0.1  Mask:255.0.0.0

          inet6 addr: ::1/128 Scope:Host

          UP LOOPBACK RUNNING  MTU:65536  Metric:1

          RX packets:0 errors:0 dropped:0 overruns:0 frame:0

          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:0

          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)

在registry节点利用ubuntu:14.04.3镜像启动ubuntu容器,创建完成后为该容器创建独立的网络命名空间并创建虚拟网络接口设备A,为A创建一个映射端设备B;将设备A接入到创建的网桥xd_br中,完成后启动设备A,将B设备放入刚刚创建好的网络空间中;完成后查询宿主机的网桥信息和该容器的网络信息,将以上操作命令及检查结果填入命令行界面。

# docker inspect --format '{{.State.Pid}}' 1319914566c4

# mkdir -p /var/run/netns

# ln -s /proc/4730/ns/net /var/run/netns/4730

# ip link add A type veth peer name B

# brctl  addif xd_br A

# ip link set A up

# ip link set B netns 4730

# ip netns exec 7841 ip a

1: lo: mtu 65536 qdisc noqueue state UNKNOWN

    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

316: B: mtu 1500 qdisc noop state DOWN qlen 1000

    link/ether 66:02:89:6d:42:5e brd ff:ff:ff:ff:ff:ff

# brctl  show

bridge name     bridge id               STP enabled     interfaces

br-830cec4ae8fc         8000.0242f1e942e2       no

docker0         8000.02421af76ad0       no              veth6e9372e

                                                        veth7a36e10

                                                        veth9ab1aae

                                                        vetha1913ed

                                                        vethce676b5

                                                        vethd659bfa

xd_br           8000.ee4e4274f4a3       no              A

在ubuntu容器中将将设备B重命名为通用的网络设备名eth0,并分配MAC地址为1A:2B:3C:4D:5E:6F;根据xd_br网桥的地址将该网段的最后一位分配给该网络设备,设置路由地址到xd_br;完成后查询该容器的eth0网卡和路由信息,将以上操作命令及检查结果填入命令行界面。

# ip netns exec 4730 ip link set dev B name eth0

# ip netns exec 4730 ip link set eth0 address 1A:2B:3C:4D:5E:6F

# ip netns exec 4730 ip link set eth0 up

# ip netns exec 4730 ip addr add 192.168.2.254/24 dev eth0

# ip netns exec 4730 ip route add default via 192.168.2.1

# docker exec 1319914566c4 ifconfig eth0

eth0      Link encap:Ethernet  HWaddr 1a:2b:3c:4d:5e:6f 

          inet addr:192.168.2.254  Bcast:0.0.0.0  Mask:255.255.255.0

          inet6 addr: fe80::182b:3cff:fe4d:5e6f/64 Scope:Link

          UP BROADCAST RUNNING MULTICAST  MTU:1500  Metric:1

          RX packets:8 errors:0 dropped:0 overruns:0 frame:0

          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0

          collisions:0 txqueuelen:1000

          RX bytes:648 (648.0 B)  TX bytes:648 (648.0 B)

# docker exec 1319914566c4 ip route

default via 192.168.2.1 dev eth0

192.168.2.0/24 dev eth0  proto kernel  scope link  src 192.168.2.254

你可能感兴趣的:(Docker底层服务之NameSpace、Cgroup、存储、网络)