主機虛擬化是隔離最完全的,可是因爲多隔了一個虛擬的操做系統,性能會慢一些。html
隔離沒有主機虛擬化強,可是因爲沒有多餘的虛擬的操做系統,全部的docker都運行在一個內核之上,性能會好。node
無論什麼樣的虛擬化如下信息都須要是各自獨立的:linux
縮寫 | 說明 |
---|---|
uts | 主機名和域名 |
mount | 掛載點(文件系統) |
IPC | 信號量,消息隊列和共享內存 |
PID | 進程ID |
network | 網卡,tcp套接字,網絡設備,端口等 |
user | 用戶和用戶組 |
要想實現以上功能nginx
必須使用linux內核提供namespace功能,經過系統調用(clone(),setns()等)。c++
主機虛擬化:在建立系統的時候,就能夠指定使用幾個cpu,多大的內存等外設。web
容器虛擬化:經過linux內核提供的control groups(Cgroups)功能,來控制各個容器,使用多少cpu,內存等。redis
Cgroups能夠控制如下設備:docker
縮寫 | 說明 |
---|---|
blkio | 塊設備IO |
cpu | CPU |
cpuacct | CPU資源使用報告 |
cpuset | 多處理器平臺上的CPU集合 |
devices | 設備訪問 |
freezer | 掛起或恢復任務 |
memory | 內存用量和報告 |
perf_event | 對cgroup中的任務進行統一性能測試 |
net_cls | cgroup中的任務建立的數據報文的類別識別符 |
容器級虛擬化確定比主機級虛擬化的隔離能力低。shell
理由:容器級虛擬化,是在同一個內核之上的;主機級虛擬化自己就是在不一樣的內核上。json
那些系統調用是須要寫程序的,不是誰都能用的好。因此要有一個便於使用的現成的工具就行了。
這些現成的工具備個名字:LXC(LinuX Container),這些工具包含下面的命令(這些命令須要額外安裝:sudo apt install lava-lxc-mocker,sudo apt install lxc-utils):
當用上面的命令建立好生成環境後,如何遷移,壞了如何恢復,如何建立成百上千的生成環境,仍是個棘手的問題。
docker把整個環境打包成一個鏡像文件,之後再使用的時候,直接把鏡像文件拿過來就可使用。好比你想使用一個ubuntu環境,那就能夠找到一個安裝了ubuntu的docker鏡像文件。好比你想使用nginx環境,那就能夠找到一個安裝了nginx的docker鏡像文件。
從運維角度看:假如某個安裝了nginx的docker環境出現問題了,運維人員要去調查,首先運維人員要先進入到這個docker環境,調查也須要工具(好比ps,top等),這些工具若是docker裏沒有安裝的話,還須要額外安裝,對運維人員來講很麻煩。若是一個軟件系統由不少docker組成,那麼每一個docker裏都要安裝調試工具。
從開發角度看:任何語言,只要在一個環境上開發,而後打成docker,就能夠在任意支持docker的操做系統環境上運行了,這是極大的便利。真正達到了一次開發處處部署,運行。
從軟件部署角度看:因爲每一個docker裏基本就一個core進程,要把這些進程編排到一塊兒,也不容易。
從系統角度看:假設你的軟件使用的操做系統是ubuntu,web服務器是nginx,緩存是redis。那麼你就須要一個ubuntu的docker,nginx的docker,redis的docker。想象一下nginx的docker和redis的docker裏其實也是有操做系統的,再加上ubuntu操做系統,就有了3個操做系統,產生了浪費。因此docker必須解決這個問題。採用【分層構建,聯合掛載】。
也就是說讓nginx的docker和redis的docker裏不包含操做系統,讓nginx的docker和redis的docker使用的操做系統是ubuntu的docker裏的ubuntu操做系統。
從編排角度看:一個軟件系統裏包括不少別的子系統,每一個子系統裏有若干的進程,每一個進程基本都是一個docker,這些子系統有執行的前後順序,和依賴關係,如何組織好這一大堆的docker是個難點。全部就出現了一堆的docker編排工具,最厲害的就是Kubernetes (這個單詞來自於希臘語,含義是舵手或領航員。K8S是它的縮寫,用「8」字替代了「ubernete」這8個字符。)。K8S的創造者,是衆人皆知的行業巨頭——Google。 K8S並非一件全新的發明。它的前身,是Google本身搗鼓了十多年的Borg系統。 Google爲了代表之後本身獨自作大,創建了CNCF組織,ibm,aws等也加入其中,讓K8S健康發展
還有下面的編排工具:
docker是C/S架構的,server端是個守護進程,經過unix socket和client通訊,因此server端和client端必須在同一臺物理機器上。client和server通訊的應用層協議是https。docker先從registry下載鏡像(imags)文件,而後加載鏡像文件到container裏。而後client端就能夠操做了。
1,docker deamon:server端守護進程。
2,docker clinet:客戶端。
3,docker registries:docker倉庫,目前就是docker hub。國內訪問docker hub很慢。可使用阿里的加速,可是必須註冊成爲阿里的開發者,阿里纔會提供加速連接。你們要想一個問題,每一個鏡像都有版本,好比nginx有不少版本,如何特定到具體版本呢,docker經過,倉庫名:版本號來肯定惟一一個鏡像。好比想要nginx1.15的docker鏡像,那麼就使用【nginx:1.15】。因此能夠看出來,倉庫名就是應用程序的名字。
對docker object均可以進行增刪改查操做,經過restful方式
1,備份
$ mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup
2,編輯/etc/yum.repos.d/CentOS-Base.repo
參考清華的內容
3,以後運行yum makecache生成緩存
$ sudo yum makecach
1,去清華鏡像下載docker-ce.repo
文件。並保存在目錄:/etc/yum.repos.d/
下
2,修改docker-ce.repo
文件,把【download.docker.com】替換成【mirrors.tuna.tsinghua.edu.cn/docker-ce】
3,執行yum repolist
,若是以下,發現有docker-ce。
Loaded plugins: fastestmirror, langpacks Loading mirror speeds from cached hostfile repo id repo name status base/7/x86_64 CentOS-7 - Base 10,097 docker-ce-stable/x86_64 Docker CE Stable - x86_64 56 extras/7/x86_64 CentOS-7 - Extras 305 updates/7/x86_64 CentOS-7 - Updates 738 repolist: 11,196
4, 執行docker安裝命令:sudo yum install docker-ce
注意:這裏的名字是【docker-ce】,不是【docker】
5,因爲默認的docker倉庫在國外,訪問速度慢,因此配置一個國內的docker加速器。
建立文件: /etc/docker/daemon.json
把下面內容加進去。
//docker cn的加速鏡像 { "registry-mirrors": ["https://registry.docker-cn.com"] }
國內的docker 鏡像:
6,啓動/從新啓動docker 守護(daemon)進程
# systemctl start docker.service # systemctl restart docker.service
7,docker 老版本命令再也不推薦使用
新版本把命令作了大的分類,以下:
Management Commands: builder Manage builds config Manage Docker configs container Manage containers context Manage contexts engine Manage the docker engine image Manage images network Manage networks node Manage Swarm nodes plugin Manage plugins secret Manage Docker secrets service Manage services stack Manage Docker stacks swarm Manage Swarm system Manage Docker trust Manage trust on Docker images volume Manage volumes
老版本使用create命令時,用docker create
,新版本也可使用這個命令。新版本把命令都歸類了,因此建立容器的話,用docker container create
也是和老版本的docker create
的功能是同樣的,推薦仍是使用新版本的命令。如今是爲了兼容老版本,因此老版本的命令還保留着。
9,檢查docker是否安裝成功:docker version
或者docker info
# docker info
結果以下:說明docker安裝成功了!
Client: Debug Mode: false Server: Containers: 0 Running: 0 Paused: 0 Stopped: 0 Images: 0 Server Version: 19.03.2 Storage Driver: overlay2 Backing Filesystem: xfs Supports d_type: true Native Overlay Diff: true Logging Driver: json-file Cgroup Driver: cgroupfs Plugins: Volume: local Network: bridge host ipvlan macvlan null overlay Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog Swarm: inactive Runtimes: runc Default Runtime: runc Init Binary: docker-init containerd version: 894b81a4b802e4eb2a91d1ce216b8817763c29fb runc version: 425e105d5a03fabd737a126ad93d62a9eeede87f init version: fec3683 Security Options: seccomp Profile: default Kernel Version: 3.10.0-957.el7.x86_64 Operating System: CentOS Linux 7 (Core) OSType: linux Architecture: x86_64 CPUs: 1 Total Memory: 3.701GiB Name: localhost.localdomain ID: D7NH:N5X6:KM6Y:Q6L4:TEUV:BWSG:X3YH:LLMZ:UEC3:T2ID:A6RB:2XSF Docker Root Dir: /var/lib/docker Debug Mode: false Registry: https://index.docker.io/v1/ Labels: Experimental: false Insecure Registries: 127.0.0.0/8 Registry Mirrors: https://registry.docker-cn.com/ Live Restore Enabled: false
Storage Driver: overlay2
上面說的【採用分層構建,聯合掛載】要能過被使用的話,必須是【overlay2】
Registry Mirrors:https://registry.docker-cn.com/
說明上面設置的加速器生效了。