Docker底层服务之NameSpace、Cgroup、存储、网络
三、Docker底层服务1.NameSpace在server节点,查询rancher/server容器的进程号,建立命名空间/var/run/netns并与rancher/server容器进行连接,通过ip netns相关命令查询该容器的ip,将以上操作命令及检查结果填入命令行界面。#docker inspect -f '{{.State.Pid}}' 5feca07aad20# mkdi...
三、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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST,UP,LOWER_UP> 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<BROADCAST,MULTICAST> 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: <LOOPBACK,UP,LOWER_UP> 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: <BROADCAST,MULTICAST> 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 |
更多推荐
所有评论(0)