# 第二節 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應用發布系統(四)