docker 簡單介紹與安裝

主機虛擬化(vmware,visual box等)

  • type-Ⅰ
  • type=Ⅱ

主機虛擬化是隔離最完全的,可是因爲多隔了一個虛擬的操做系統,性能會慢一些。html

容器虛擬化(docker等)

隔離沒有主機虛擬化強,可是因爲沒有多餘的虛擬的操做系統,全部的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

linux內核都提供了上述的隔離能力所用到的系統調用了,那還有docker什麼事呢?

那些系統調用是須要寫程序的,不是誰都能用的好。因此要有一個便於使用的現成的工具就行了。

這些現成的工具備個名字:LXC(LinuX Container),這些工具包含下面的命令(這些命令須要額外安裝:sudo apt install lava-lxc-mocker,sudo apt install lxc-utils):

  • lxc-create:假如在red hat上安裝一個utuntu。lxc-create提供了不少模板,對應不一樣的linux發行版,而後根據模板去遠程倉庫裏找相應的包,下載到本地後,進行安裝。

當用上面的命令建立好生成環境後,如何遷移,壞了如何恢復,如何建立成百上千的生成環境,仍是個棘手的問題。

docker就是解決上面問題的。它就是LXC的二次封裝。注意它不是容器技術,容器技術是linux內核的。它只是把容器技術簡化,容易使用而已。

docker把整個環境打包成一個鏡像文件,之後再使用的時候,直接把鏡像文件拿過來就可使用。好比你想使用一個ubuntu環境,那就能夠找到一個安裝了ubuntu的docker鏡像文件。好比你想使用nginx環境,那就能夠找到一個安裝了nginx的docker鏡像文件。

  • lxc的主要用途是隔離了一個系統
  • docker主要用途是隔離一個用戶進程,好比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健康發展

    還有下面的編排工具:

    • nmp
    • machine+swarm+compose
    • mesos+marathon

docker結構圖:

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 objects

對docker object均可以進行增刪改查操做,經過restful方式

  • imags:鏡像文件。注意:它是隻讀的,很重要。好比nginx鏡像,你能夠隨意使用它,可是不能改裏面的東西。由於有多是多個別的進程使用它,若是不是隻讀的,別其中一個進程修改了內容,那就影響了其餘的進程,也就失去了隔離的意義。
  • contains:加載鏡像,運行後,產生的進程。
  • imags/和contains的關係:images就是一個存放在硬盤上的可執行程序(好比是/bin/ls);contains則是運行/bin/ls的進程,能夠運行屢次,運行完,進程就結束消失了,可是/bin/ls仍是存在。因此它倆的關係就是,程序和進程的關係。
  • network:網絡
  • volumes:contains運行時,使用的存儲介質(卷)
  • plugin:插件。

centos7的yum源替換成清華大學的源

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

在centos7下安裝docker

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 鏡像:

  • docker cn
  • 阿里雲加速器
  • 中國科技大學

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/

    說明上面設置的加速器生效了。

c/c++ 學習互助QQ羣:877684253

本人微信:xiaoshitou5854

相關文章
相關標籤/搜索