# 第二节 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
- 第一章 Docker核心技术(一)
- 第一章 Docker核心技术(二)
- 第一章 Docker核心技术(三)
- 第一章 Docker核心技术(四)
- 第二章 Docker 入门
- 第三章 使用docker镜像
- 第四章 实战应用使用Docker构建LNMP环境 (一)
- 第四章 实战应用使用Docker构建LNMP环境 (二)
- 第四章 实战应用使用Docker构建LNMP环境 (三)
- 第五章 构建企业级Harbor-Registry
- 第六章 构建Docker应用发布系统(一)
- 第六章 构建Docker应用发布系统(二)
- 第六章 构建Docker应用发布系统(三)
- 第六章 构建Docker应用发布系统(四)