ThinkSSL🔒 一键申购 5分钟快速签发 30天无理由退款 购买更放心 广告
# 第二节 Docker - Namespace资源隔离 Docker这么火,喜欢技术的朋友可能也会想,如果要自己实现一个资源隔离的容器,应该从哪些方面下手呢?也许你第一反应可能就是chroot命令,这条命令给用户最直观的感觉就是使用后根目录/的挂载点切换了,即文件系统被隔离了。然后,为了在分布式的环境下进行通信和定位,容器必然需要一个独立的IP、端口、路由等等,自然就想到了网络的隔离。同时,你的容器还需要一个独立的主机名以便在网络中标识自己。想到网络,顺其自然就想到通信,也就想到了进程间通信的隔离。可能你也想到了权限的问题,对用户和用户组的隔离就实现了用户权限的隔离。最后,运行在容器中的应用需要有自己的PID,自然也需要与宿主机中的PID进行隔离。 由此,我们基本上完成了一个容器所需要做的六项隔离,Linux内核中就提供了这六种namespace隔离的系统调用,如下表所示。 Namespace |系统调用参数 | 隔离内容 ---|---|--- UTS |CLONE_NEWUTS|主机名与域名 IPC| CLONE_NEWIPC | 信号量、消息队列和共享内存 PID |CLONE_NEWPID|进程编号 Network|CLONE_NEWNET|网络设备、网络栈、端口等等 Mount|CLONE_NEWNS|挂载点(文件系统) User|CLONE_NEWUSER|用户和用户组 实际上,Linux内核实现namespace的主要目的就是为了实现轻量级虚拟化(容器)服务。在同一个namespace下的进程可以感知彼此的变化,而对外界的进程一无所知。这样就可以让容器中的进程产生错觉,仿佛自己置身于一个独立的系统环境中,以此达到独立和隔离的目的。 需要说明的是,本文所讨论的namespace实现针对的均是Linux内核3.8及其以后的版本。 # docker 生产部署安装 ### Remove unofficial Docker packages $ sudo yum -y remove docker docker-common container-selinux $ sudo yum -y remove docker-selinux ### Install using the repository sudo yum install -y yum-utils ### Use the following command to set up the stable repository: $ sudo yum-config-manager \ --add-repo \ https://docs.docker.com/engine/installation/linux/repo_files/centos/docker.repo ### Install Docker sudo yum makecache fast # Configuring Docker > > 使用OverlayFS来作为默认的存储系统,首先要升级到CentOS7.2(或者使用linux内核3.18版本以上),有一个XFS的Bug在7.2系统被修复了。 ### 升级kernel-4.10 相对于手动档编译安装,CentOS 还可以通过使用 elrepo 源的方式直接安装最新稳定版 kernel,脚本如下 ### import key rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org ### install elrepo repo rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm ### install kernel yum --enablerepo=elrepo-kernel install kernel-ml-devel kernel-ml -y ### modify grub grub2-set-default 0 ### reboot reboot ### 将OverlayFS加到module目录下 echo "overlay" > /etc/modules-load.d/overlay.conf ### reboot 系统,执行lsmod看时候看到overlay lsmod | grep over overlay 42451 0 ### 或者使用modprobe命令加载模块 modprobe overlay ### 配置Docker Daemon用OverlayFS启动 ### Create the /etc/systemd/system/docker.service.d directory. sudo mkdir /etc/systemd/system/docker.service.d ### Create a /etc/systemd/system/docker.service.d/docker.conf file vi /etc/systemd/system/docker.service.d/docker.conf [Service] ExecStart= ExecStart=/usr/bin/dockerd --graph=/data/docker --registry-mirror=https://xu0kv3y6.mirror.aliyuncs.com -D -H tcp://0.0.0.0:4243 --host=unix:///var/run/docker.sock --storage-driver=overlay --insecure-registry=harbor-demo.ttlinux.com.cn ### 启动参数说明 - --graph=/data/docker 镜像存储路径 - --registry-mirror=https://xu0kv3y6.mirror.aliyuncs.com 添加阿里云镜像地址 - --insecure-registry=harbor.ttlinux.com.cn 私有仓库地址 - -D 后台运行模式 - -H tcp://0.0.0.0:4243 TCP 监听地址 - --storage-driver=overlay 使用overlay存储驱动 ### Flush changes. sudo systemctl daemon-reload ### Restart the docker daemon. sudo systemctl restart docker