1. 程式人生 > >linux學習51-容器基礎之Docker

linux學習51-容器基礎之Docker

容器基礎Docker

開源基金會lsf和alf

1. 容器簡介

  • 什麼是容器 · 統稱來說,容器是一種工具,指的是可以裝下其它物品的工具。 · linux容器是與系統其它部分隔開的一系列程序,從另一個映象執行,並由該映象提供程序所需的全部檔案

  • 特點 · 將應用程式封裝成一個包標準化的單元用於實現開發運輸和部署 · 容器提供的映象包含了應用的所有依賴項,因而在從開發測試再到生產的整個過程中,它都具有可移植性和一致性

  • linux中容器所依賴的6中名稱空間 需要依賴於6種名稱空間來支援才能完成實現使用者空間隔離技術

    Name pace Constant Isolates
    IPC CLONE_NEWIPC System V IPC,POSIX message queues程序間通訊機制
    Network CLONE_NEWNET Network devices(網路裝置),stacks(網路協議棧),ports(介面),etc.
    Mount CLONE_newns Mount points(掛載點)
    PID CLONE_NEWPID Process IDs(程序ID樹)
    User CLONE_NEWUSER User and group IDs(使用者和組的ID)
    UTS CLONE_NEWUTS Hostname and NIS domain name(主機名NIS域 )
  • 容器多程序資源分配Cgroup

    1. 分配機制 Cgroup將程序分成多個組,將有限的資源按量配額到不同的組中,避免資源被某個使用者空間的某個或某些程序完全佔用,達到公平分配資源的效果

    2. 分配方法

      1. 靜態分配 將資源按數量固定分配
      2. 動態分配 固定分配資源,但是可以將空閒的資源調配給其他使用者空間,當需要使用時有權呼叫回來
    3. Control Groups(groups)管理的資源

      名稱 描述
      blkio 塊裝置IO
      cpu CPU
      cpuacct CPU資源使用報告
      cpuset 多處理器平臺上的CPU集合
      devices 裝置訪問
      freezer 掛載或恢復任務
      memory 記憶體用來及報告
      perf_event 對cgroup中的任務進行統一效能測試
      net_cls cgroup中的任務建立的資料報文的類別識別符號
  • 使用者空間部署技術LXC

    1. 作用 ▪ 將應用軟體系統打包成一個軟體容器(Container),內含應用軟體本身的程式碼,以及所需要的作業系統核心和庫。 ▪ 通過統一的名字空間和共用API來分配不同軟體容器的可用硬體資源,創造出應用程式的獨立沙箱執行環境,使得Linux使用者可以容易的建立和管理系統或應用容器 ▪ 通過安裝的方式幫使用者生成每一個使用者空間(容器)的系統環境

    2. 缺點 遷移、使用、隔離做的不理想

    3. LXC控制程序所使用的核心功能

      1. Kernel namespaces(ipc,uts,mount,pid,network and user): 核心名稱空間,核心輸出給使用者空間的基礎特性的隔離
      2. Apparmor and SELinux profiles: 安全策略,一般不啟用
      3. Seccomp policies: 安全策略,一般不啟用
      4. Chroots(change root directory) 建立一個完全隔離的環境,方便使用者在完全隔離的環境下的開發執行
      5. Kernel capabilities: 將核心級很多特權許可權,分別用一個名稱或者一組機制,分別用於分配和提供,很少用
      6. CGroups (control groups): 控制組,用於將CPU、Memroy、BLKIO等有限的資源分配給不同的使用者空間
    4. lxc簡單應用

      1. 需要安裝包 主程式包:lxc 輔助程式:lxc-templates(類似指令碼,利用線上centos的映象去下載各種rpm包,在本地chroot的環境中安裝生成一個可被切換成目標的檔案系統)
      2. 命令 lxc-checkconfig,lxc-ls,lxc-create(建立使用者空間,會呼叫lxc-templates), lxc-start,lxc-console,lxc-stop,lxc-info ,lxc-clone(克隆),lxc-snapshot ,lxc-destroy

2. Docker簡介

  • 什麼是Docker docker最初的實現就是基於LXC,由dotCloud公司在LXC基礎上引入了映象技術,使容器的遷移變得容易,所以docker就像名稱那樣(碼頭裝運共),將容器從一個碼頭移動到另一個碼頭完成裝卸的一套元件,並不是容器技術(容器特性是linux核心提供的),是一種讓容器技術更加易用的技術。

  • Docker和傳統虛擬化的區別

    1. 傳統虛擬化 傳統虛擬機器技術是虛擬出一套硬體後,在其上執行一個完整作業系統,在該系統上再執行所需應用程序 在這裡插入圖片描述
    2. 容器
      1. 應用程序直接運行於宿主的核心,容器內沒有自己的核心,而且也沒有進行硬體虛擬
      2. docker基於C/S結構,將做好的映象檔案模板放到公共的共享服務上,在本地裝上docker引擎(也叫守護程序)dockerd,用來接收客戶端(docker)指令從公共伺服器上拉取模板到本地,建立並執行容器 在這裡插入圖片描述
  • 容器的優缺點

    1. 優點
      1. 調了系統資源利用率 不需要進行硬體虛擬以及執行完整作業系統等額外開銷,提高了系統資源利用率
      2. 更快速的啟動時間 直接執行在宿主機的核心上,無需啟動完整的作業系統
      3. 一致的執行環境 Docker 的映象提供了除核心外完整的執行時環境,確保了應用執行環境一致性
      4. 持續交付和部署 使用 Docker 可以通過定製應用映象來實現持續整合、持續交付、部署
      5. 更輕鬆的遷移 由於 Docker 確保了執行環境的一致性,使得應用的遷移更加容易,不用擔心執行環境的變化導致應用無法正常執行的情況
      6. 更輕鬆的維護和擴充套件 Docker 使用的分層儲存以及映象的技術,使得應用重複部分的複用更為容易,也使得應用的維護更新更加簡單,基於基礎映象進一步擴充套件映象也變得非常簡單
      7. 實現業務宕機的自愈功能 基於安全考慮,預設Docker Client和 Docker daemor執行在同一臺主機上
      8. 快速部署
    2. 缺點 各應用之間的隔離不如虛擬機器
  • docker的組成

    1. Docker 客戶端(Client) 客戶端使用docker 命令或其他工具呼叫docker API。
    2. Docker 服務端(Server) Docker守護程序,執行docker容器。
    3. Docker 映象(Images) 映象可以理解為建立例項使用的模板。
    4. Docker 容器(Container) 容器是從映象生成對外提供服務的一個或一組服務。
    5. Docker 倉庫(Registry) 映象倉庫伺服器,為從多倉庫映象提供索引和認證使用者,實現對應儲存功能名稱空間分配的認證服務
    6. Docker 主機(Host) 一個物理機或虛擬機器,用於執行Docker服務程序和容器,此主機上執行著Docker daemor守護程序
  • Docker objects 每個物件都可以被增刪改查

    1. images:映象
    2. containers:執行時的表現,即容器
    3. networks:網路
    4. volumes:儲存卷
    5. plugins:外掛
    6. other objects

3 Docker基本概念

3.1 Docker Registry(倉庫)

映象構建完成後,可以很容易的在當前宿主機上執行,但是,如果需要在其它伺服器上使用這個映象,我們就需要一個集中的儲存、分發映象的服務,Docker Registry 就是這樣的服務

  • Registry作用 docker的映象倉庫伺服器(Registry),通過某個套接字接收映象的解鎖和下載請求,映象檔案放在Registry後端,Registry可以認為是一個索引,用來解鎖映象是否存在並且定位,另外提供使用者身份驗證功能
  • 映象存放 Registry後端的儲存空間上,可以存多個倉庫,每個倉庫通常只放一種映象的不同版本,對倉庫中的每一個映象使用一個標籤(tag)來標記,所以如果需要下載一個映象需要先指定倉庫在指定標籤以:分隔(例如httpd:v2.4.32),如果不給出標籤,將以 latest 作為預設標籤
  • Docker Registry 公開服務
    1. 國外Docker Hub的公開服務
      1. Google 的 Google Container Registry(長城防火牆外)
      2. CoreOS 的 Quay.io(正常訪問)
    2. 國內類似Docker Hub的公開服務
  • 倉庫分類 按官方和自建倉庫分
    1. 頂層倉庫(官方,引用時,映象為原名如httpd)
    2. 自建倉庫 例如註冊賬號叫moli,在賬號下自建httpd倉庫,引用時需要加字首moli/httpd

3. 2 images(映象)

  • 作用 Docker 映象是一個特殊的檔案系統,除了提供容器執行時所需的程式、庫、資源、配置等檔案外,還包含了一些為執行時準備的一些配置引數(如匿名卷、環境變數、使用者等)。映象不包含任何動態資料,其內容在構建之後也不會被改變
  • 分層儲存 為了能啟動容器(Containers),需要在本地擁有映象檔案(images),映象檔案儲存在本地特殊的儲存位置,此儲存位置必須支援一種特殊的檔案系統分層掛載或稱為聯合掛載技術(因為映象是分層構建的)
  • 目前支援分層存放的檔案系統有:
    1. aufs:高階聯合檔案系統
    2. overlayfs2:高階疊加檔案系統
    3. dm:devicemapper,穩定性和效能不佳

3. 3 Containers(容器)

  • 描述 容器的實質是程序,但與直接在宿主執行的程序不同,容器程序運行於屬於自己的獨立的 名稱空間。因此容器可以擁有自己的 root 檔案系統、自己的網路配置、自己的程序空間,甚至自己的使用者 ID 空間。容器內的程序是執行在一個隔離的環境裡,使用起來,就好像是在一個獨立於宿主的系統下操作一樣
  • 容器儲存層 啟動的每個容器,它的讀寫操作都不會影響底層的映象檔案(映象檔案是隻讀的),所有的讀寫操作都會在容器的內部聯合掛載的一個專用層實現,此層就是容器的儲存層 容器儲存層的生存週期和容器一樣,容器消亡時,容器儲存層也隨之消亡。因此,任何保存於容器儲存層的資訊都會隨容器刪除而丟失
  • 特點
    1. 不像kvm啟動每個虛擬機器都需要一個映象檔案,docker啟動容器時可以基於一個映象啟動多個容器
    2. 每個容器只能執行一個程序及其子程序(如果是2個程序,有一個為超管程序init),這樣做的好處在於,只需要配置單個服務需要的環境,執行多個容器服務相同也不會衝突,簡化容器管理

4. 安裝Docker

  • 系統要求 Docker CE 支援 64 位版本 CentOS 7,並且要求核心版本不低於 3.10。 CentOS 7 滿足最低核心的要求,但由於核心版本比較低,部分功能(如 overlay2 儲存層驅動)無法使用,並且部分功能可能不太穩定

  • 程式分類

    1. 商業版:docker–>docker-ee
    2. 社群版:moby -->docker-ce
  • 安裝

    1. 社群版,在官方獲取rpm包下載到本地系統,執行yum安裝
      [[email protected] ~]$yum install docker-ce
      
    2. 報錯解決方案 錯誤資訊
      Error: Package: docker-ce-18.06.1.ce-3.el7.x86_64 (docker-ce-stable)
             Requires: container-selinux >= 2.9
      
      解決方案,先安裝如下包
      [[email protected] ~]$yum install -y http://mirror.centos.org/centos/7/extras/x86_64/Packages/container-selinux-2.66-1.el7.noarch.rpm
      
    3. 安裝成功後info產看詳細資訊,出現如下報錯 錯誤提示,會影響建立容器
      [[email protected] ~]$docker info
      WARNING: bridge-nf-call-iptables is disabled
      WARNING: bridge-nf-call-ip6tables is disabled
      
      解決方案,將以下檔案值修改為1
      1. '可以命令列零時賦值修改'
      [[email protected] ~]$cat /proc/sys/net/bridge/bridge-nf-call-iptables
      [[email protected] ~]$cat /proc/sys/net/bridge/bridge-nf-call-ip6tables
      2. '永久修改,儲存至配置檔案'
      [[email protected] ~]$vim /etc/sysctl.d/docker.conf
      net.bridge.bridge-nf-call-iptables = 1
      net.bridge.bridge-nf-call-ip6tables = 1
      3. '重新載入生效'
      [[email protected] ~]$sysctl -p  /etc/sysctl.d/docker.conf
      
  • 映象加速器

    1. 國內加速服務
      1. 中國科技大學提供的docker加速器
    2. 以阿里云為例 在/etc下建立docker目錄
      [[email protected] ~]$mkdir /etc/docker
      
      編輯生成daemon.json檔案,加阿里加速連線複製到檔案內
      [[email protected] ~]$vim /etc/docker/daemon.json
      {
        "registry-mirrors": ["https://h480ply5.mirror.aliyuncs.com"]
      }
      
    3. 檢視是否生效,info中找到Registry Mirrors
      [[email protected] ~]$docker info
      Registry Mirrors:
      https://h480ply5.mirror.aliyuncs.com/
      
  • 啟動docker服務 相關檔案:/usr/lib/systemd/system/docker.service

    1. '通知systemd過載配置檔案'
    [[email protected] ~]$systemctl daemon-reload
    2. '啟動服務'
    [[email protected] ~]$systemctl start docker
    

    服務啟動後,會將iptables的filter表的FORWARD鏈修改為預設drop,如果有需要可以修改回accept

    '修改docker服務檔案,需要重新載入systemctl和啟動服務'
    [[email protected] ~]$vim /usr/lib/systemd/system/docker.service
    [Service]         <==在service塊下,增加如下行
    ExecStartPost=/usr/sbin/iptables  -P  FORWARD ACCEPT   
    
  • 檢視docker版本

    [[email protected] ~]$docker version
    
  • 檢視docker資訊

    [[email protected] ~]$docker info
    Containers: 0    			<==容器個數
     Running: 0    			    <==執行中的個數
     Paused: 0    				<==暫停態個數
     Stopped: 0    				<==停止態個數
    Images: 0    				<==當前有多少個映象
    Server Version: 18.06.1-ce  <==伺服器版本
    Storage Driver: overlay2    <==儲存後端驅動,重要資訊
     Backing Filesystem: xfs    <==建立在本地系統xfs上
     Supports d_type: true
     Native Overlay Diff: true
    Logging Driver: json-file    <==日誌驅動
    Cgroup Driver: cgroupfs      <==控制組的驅動
    Plugins:    				 <==啟用的外掛
     Volume: local    			 <==儲存卷外掛
     Network: bridge(橋接式) host(宿主機) macvlan null(沒有) overlay(疊加網路)         <==網路外掛
     Log: awslogs fluentd gcplogs gelf journald json-file logentries splunk syslog<==日誌外掛
    Swarm: inactive              <==docker內部的容器編排工具 
    Runtimes: runc    			 <==執行時環境
    。。。省略
    Insecure Registries:     	 <==非安全倉庫
     127.0.0.0/8
    Registry Mirrors:   		 <==加速器,上面配置生效的
     https://h480ply5.mirror.aliyuncs.com/  
    Live Restore Enabled: false
    

5. Docker管理命令

在新版中docker命令進行二三級子命令分組,仍然支援直接執行(例如docker rmi和docker image rm效果相同),常用命令圖示,圓形表示docker執行狀態,長方形表示執行的操作 在這裡插入圖片描述 異常終止狀態OOM:非計劃內終止,容器所在的宿主機被耗盡,當核心察覺記憶體有被耗盡的危險時會執行結束最耗記憶體程序的操作 container process exited:遇到BUG或者其他問題崩潰

6. 管理容器

  • 容器管理命令

    1. 檢視管理容器子命令
      [[email protected] ~]$docker container
      
    2. 格式 docker container COMMAND
    3. 常用子命令
      1. pause:暫停

      2. unpause:恢復暫停

      3. create:建立一個新容器

      4. start:啟動一個或多個已停止的容器

      5. run:在新容器中執行命令

      6. attach:附加到正在執行的容器上

      7. restart:重新啟動容器

      8. stop:停止一個或多個正在執行的容器,相當於kill訊號15

      9. kill:殺掉一個或多個容器,相當於kill訊號9

      10. rm:容器刪除時,其相關資料也會刪除

      11. exec:在正在執行的容器中執行命令

        1. 語法格式 docker container exec [OPTIONS] CONTAINER COMMAND [ARG…]
        2. 引數描述 CONTAINER:在哪個容器內部 COMMAND:執行什麼命令
        3. 選項 -i :互動式執行,保持STDIN開放狀態,由於沒有分配偽終端,介面沒有我們熟悉的 Linux 命令提示符,但命令執行結果仍然可以返回 -t:附加終端
        4. 示例 檢視容器網路地址,支援以前版本寫法,可以省略container,執行後就退出
          [[email protected] ~]$docker exec web1 ifconfig
          
          如果想要進入容器多執行幾個命令 ,需要其內部執行shell命令,需要附著在控制檯上
          [[email protected] ~]$docker exec -it  web1 /bin/bash 
          bash-4.4#    <==進入互動介面
          bash-4.4# pwd
          /usr/local/apache2     <==httpd登入互動式介面預設路徑
          bash-4.4# cd conf
          bash-4.4# ls
          extra       httpd.conf  magic       mime.types  original   <==配置檔案所在,可以修改
          
  • 建立容器

    1. 當利用 docker run 來建立容器時,Docker 在後臺執行的標準操作包括:
      1. 檢查本地是否存在指定的映象,不存在就從公有倉庫下載
      2. 利用映象建立並啟動一個容器
      3. 分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層
      4. 從宿主主機配置的網橋介面中橋接一個虛擬介面到容器中去
      5. 從地址池配置一個 ip 地址給容器
      6. 執行使用者指定的應用程式
      7. 執行完畢後容器被終止
    2. 建立容器 -i :開啟互動式介面(不開啟互動式給予容器終端,一啟動就會停止), -n: 命名 -t :附加終端,一定要保證容器內的程序執行在前臺,只要容器內的唯一程序離開了控制檯,此容器就掛掉了
      1. '啟動容器'
      [[email protected] ~]$docker container run  --name a1 -it alpine:3.8
      2. '啟動後如果輸入exit(退出容器後,程序就會關掉,使用命令檢視,處於Exited狀態'
      [[email protected] ~]$docker  container ls -a
      CONTAINER ID        IMAGE               COMMAND             CREATED              STATUS                      PORTS               NAMES
      622f2a8614fb        alpine:3.8          "/bin/sh"           About a minute ago   Exited (0) 10 seconds ago                       a1
      
    3. run的其他選項 後臺執行,會釋放終端-d,輸出結果可以通過docker container logs檢視
      [[email protected] ~]$docker container run --name web1 -d httpd:2.4.37-alpine
      
      啟動容器時,加–rm選項,會在退出後自動刪除,而不是處於Exited狀態
      [[email protected] ~]$docker container run --name a1 -it --rm alpine
      
    4. 容器httpd前臺執行命令
      1. '拖一個httpd映象'
      [[email protected] ~]$docker pull httpd:2.4.37-alpine
      2. '檢視此映象詳細資訊,找到CMD,可以通過自行修改映象中預設執行的應用程式,方法就是在docker run時後面加上自定義的命令'
      [[email protected] ~]$docker image inspect httpd:2.4.37-alpine
      "Cmd": [
                      "/bin/sh",
                      "-c",
                      "#(nop) ",
                      "CMD [\"httpd-foreground\"]"   <==-foreground預設啟動為前臺		
      
  • 終止容器

    1. 使用命令docker container stop
    2. 加容器互動介面中通過exit或者Ctrl+d退出終端,容器也會終止,使容器處於Exited狀態
  • 啟動已終止的容器

    1. 恢復退出狀態的容器,可以跟NAMES(a1)也可以跟CONTAINER ID,因為其shell一直處於執行狀態,它有終端,只不過沒有開啟
      [[email protected] ~]$docker container start  a1
      
    2. 啟動後,需要關聯進容器
      [[email protected] ~]$docker container attach a1
      
    3. 從終端剝離出來,不退出CTRL+p同時按,然後按CTRL+q,關聯回去命令同上
  • 刪除容器

    1. 刪除終止狀態的容器 docker container rm
    2. 刪除執行中的容器-f選項,a1為容器名
      [[email protected] ~]$docker container rm -f a1
      
    3. 清除所有處於終止狀態的容器 docker container prune
  • 獲取容器的日誌資訊

    [[email protected] ~]$docker container logs web1
    
  • 檢視容器中程序佔用情況,在容器外可使用命令直接檢視

    [[email protected] ~]$docker top web1
    
  • 動態檢視容器資源消耗情況統計資訊

    以下寫法效果相同
    [[email protected] ~]$docker stats
    [[email protected] ~]$docker container stats
    
  • 列出所有容器,處於停止狀態的容器需要加-a docker ps docker container ls

7 Docker預設網路

  • 預設橋 啟動docker後,系統會自動生成一個橋docker0,地址為172.17.0.1/16,後續建立容器時,如果沒有指定網路,會自動建立一對虛擬網絡卡,連線容器和此橋
    1. '啟動httpd容器,使用預設網路,連線至連線docker0,會分配一個172.17的地址'
    [[email protected] ~]$docker container run --name web1 httpd:2.4.37-alpine
    AH00558: httpd: Could not reliably determine the server's fully qualified domain name, `using 172.17.0.3`. Set the 'ServerName' directive globally to suppress this message
    2. "在宿主機上檢視httpd服務,顯示已經執行"
    [[email protected] ~]$curl 172.17.0.3
    <html><body><h1>It works!</h1></body></html>
    
  • 預設生成iptables規則 自動生成ANET規則,將172.17段地址通過net橋都會偽裝成host地址
    Chain POSTROUTING (policy ACCEPT 0 packets, 0 bytes)
     pkts bytes target     prot opt in     out     source               destination         
        0     0 MASQUERADE  all  --  *     !docker0  172.17.0.0/16        0.0.0.0/0 
    
  • 宿主機之外的網路想要訪問容器中的httpd,需要做DNET配置,docker網路服務部分解釋

8. Docker Images管理

Docker映象含有啟動容器所需要的檔案系統及其內容,因此,其用 於建立並啟動docker容器

  • 獲取可用映象資訊命令 docker search:在Docker Hub搜尋需要的映象

    [[email protected] ~]$docker search busybox
    NAME                        DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
    busybox                     Busybox base image.                             1396                [OK]
    
  • 管理映象命令

    1. 檢視管理映象的子命令
      [[email protected] ~]$docker image
      
    2. 語法格式 docker image COMMAND
    3. 常用子命令
      1. pull:下載一個映象 alpine是一個非常小的微型發行版,不指明標籤,預設下載最新版,alpine是一個用來做映象的基礎系統環境,結合服務來做映象可以壓縮大小(例如基於alpine製作httpd大小可能為30M,基於centos可能需要50M),實際工作中不建議使用太小,因為自帶工具太少,出現問題時只能使用容器內自帶工具排查原因
        [[email protected] ~]$docker image pull alpine
        拖一個帶標籤的版本
        [[email protected] ~]$docker image pull alpine:3.8
        
      2. rm:刪除映象
        1. '刪除帶標籤的版本'
        [[email protected] ~]$docker rmi alpine:3.8    <==rmi和image rm執行效果相同
        2. '刪除最新版本'
        [[email protected] ~]$docker image rm alpine
        
      3. ls:列出映象,同docker images ls -a: 顯示所有資訊 ls --no-trunc :不要截斷資訊長度 ls --digests:顯示完整格式資訊
        完整的REPOSITORY寫法是帶有伺服器地址和埠號的,沒有指明說明是在dockhub上
        [[email protected] ~]$docker image ls
        REPOSITORY    TAG      IMAGE ID    CREATED   SIZE
        | 所屬倉庫 |   標籤   |映象唯一的識別符號|建立時間| 映象大小 |
        
      4. inspect:檢視映象的詳細資訊
        [[email protected] ~]$docker image inspect alpine
         "ContainerConfig": {
         		"Cmd": [            
                        "/bin/sh",  <==定義容器執行時啟動的預設程序
                        "-c",
                        "#(nop) ",
                        "CMD [\"/bin/sh\"]"
        
      5. tag:管理映象標籤
        1. 格式 docker image tag SOURCE_IMAGE[:TAG] TARGET_IMAGE[:TAG]
        2. 引數說明 SOURCE_IMAGE[:TAG]:已有的映象 TARGET_IMAGE[:TAG]:打什麼樣的標籤
        3. 示例 為映象httpd:2.4.37-alpine打標籤為httpd:2.4,會在映象列表中額外生成一個標籤項,相當於原映象的連線
          [[email protected] ~]$docker image tag httpd:2.4.37-alpine  httpd:2.4
          
          指向非dockhub倉庫的完整寫法
          [[email protected] ~]$docker image tag httpd:2.4.37-alpine  reg.moli.com:8443/moli/httpd:2.4
          
          刪除標籤使用刪除命令即可
          [[email protected] ~]$docker image rm  reg.moli.com:8443/moli/httpd:2.4
          
      6. push:往倉庫推映象
  • 映象的結構 採用分層構建機制,最底層叫做bootfs,其上為rootfs 在這裡插入圖片描述

    1. bootfs:用於系統引導的檔案系統,包括bootloader和kernel,容器啟動後會被解除安裝以節約記憶體資源
    2. rootfs:提供使用者空間的根本,表現為docker容器的根檔案系統
      1. 傳統模式中, 系統啟動之時,核心掛載rootfs時會首先將其掛載為“只讀”模式,完整性自檢完成後將其重新掛載為讀寫模式
      2. 在Docker中 rootfs由核心掛載為“只讀”模式,而後通過“聯合掛載”技術額外為每個啟動的容器掛載一個“可寫”層 在這裡插入圖片描述
        1. 位於下層的映象為父映象(parent image),最底層的稱為基礎映象(base image),最上層為“可讀寫”層,其下僅為“只讀”
        2. 使用者最終看到的內容為最上層映象的內容,下層只要沒有標記為隱藏,上層就可以看到所有下層的內容
  • 執行分層構建映象的檔案系統Aufs advanced multi-layered unification filesystem:高階多層聯合檔案系統

    1. 用於為Linux檔案系統實現“聯合掛載”
    2. aufs是之前的UnionFS的重新實現,2006年由Junjiro Okajima開發
    3. Docker最初使用aufs作為容器檔案系統層,它目前仍作為儲存後端之一來支援
    4. aufs的競爭產品是overlayfs,後者自從3.18版本開始被合併到Linux核心
    5. docker的分層映象,除了aufs,docker還支援btrfs, devicemapper和vfs等
    6. 在Ubuntu系統下,docker預設Ubuntu的 aufs;而在CentOS7上,用的是devicemapper
  • 映象引用 docker daemon會試圖從本地獲取相關的映象;本地映象不存在時,其將從Registry中下載該映象並儲存到本地

    1. 格式 docker pull [OPTIONS] NAME[:TAG|@DIGEST]
    2. 選項: -a:下載儲存庫中的所有映象
    3. 映象名稱的完整格式 <域名/IP>[:埠號]<使用者名稱>/<軟體名>
      1. <域名/IP>[:埠號]:預設為Docker Hub
      2. <使用者名稱>/<軟體名>:預設為library
    4. 示例 沒有給出 Docker 映象倉庫地址,因此將會從 Docker Hub 獲取映象。而映象名稱是 httpd:2.4.37,因此將會獲取官方映象 library/httpd 倉庫中標籤為 2.4.37的映象
      [[email protected] ~]$docker pull httpd:2.4.37
      
  • Docker Registry Docker Registry,支援分層映象檔案的儲存驅動伺服器,讓使用者試圖去收發映象,儲存映象的一個集中式伺服器。 在這裡插入圖片描述 Storage Driver:aufs,overlayfs(整合進CentOS7.5後的核心),dm(效能不佳)

    1. Docker Registry分類
      1. Sponsor Registry: 第三方的registry,供客戶和Docker社群使用
      2. Mirror Registry: 第三方的registry,只讓客戶使用
      3. Vendor Registry: 由釋出Docker映象的供應商提供的registry
      4. Private Registry: 通過設有防火牆和額外的安全層的私有實體提供的registry
  • Docker Hub介紹

    1. 描述 Docker Hub是一個基於雲的註冊服務,允許您連結到它的程式碼儲存庫,構建您的映象並測試它們,手動儲存映象,並連結到Docker雲,以便您可以將映象部署到您的主機 它為容器映象的發現、分發提供了集中的資源以及變更管理、使用者和團隊協作以及工作流自動化貫穿整個開發流程
    2. Docker Hub提供的特性
      1. Image Repositories:映象存放倉庫 從社群和官方庫中查詢和提取影象,並管理、推送和從您可以訪問的私有映像庫中提取影象
      2. Automated Builds:自動構建 在對原始碼儲存庫進行更改時自動建立新映像
      3. Webhooks:回撥函式 自動化構建的一個特性,Webhooks允許在成功推送到儲存庫後觸發操作,相當於觸發器
      4. Organizations:組管理 建立工作組來管理對映像儲存庫的訪問
  • 自定義映象 前面說過每啟動一個容器,就會生成專用的讀寫層,刪除容器此層所有資料也會丟失,如果想要儲存此層內容,就需要將此層儲存為映象

    1. 命令格式 docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    2. 作用 可以將此屬於此容器的,專屬可寫層中所作出的所有修改儲存為映象層,只儲存最上層,下層本來就存在,掛載映象層後,所依賴的下層會自動掛載
    3. 選項 -c:定義新的執行命令 -a:作者 -p:提交為映象時,讓容器暫停
    4. 示例1 基於映象busybox執行容器b1,在專屬層中建立web目錄
      [[email protected] ~]$docker container run --name b1 -it busybox
      # vi /data/web/htdocs/index.html
      
      儲存容器b1的專屬層
      [[email protected] ~]$docker container commit  b1
      
      檢視儲存的專屬層映象檔案,此時沒有標籤
      [[email protected] ~]$docker image ls
      REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
      <none>              <none>            36cf41410893        19 seconds ago      1.15MB
      
      為映象檔案打標籤
      [[email protected] ~]$docker image tag 36cf41410893  httpd:v0.0.1
      
      執行儲存的映象檔案
      [[email protected] ~]$docker container run --name b1-1  -it httpd:v0.0.1
      / # ls /data/web/htdocs/index.html    <==可以看到原專屬讀寫層的資料
      
    5. 示例2:自定義一個httpd映象檔案
      1. pull一個centos基礎映象
        [[email protected] ~]$docker pull centos:7
        
      2. 基於基礎映象執行容器centos-base1,安裝網路基本工具net-tools,只要宿主機可以訪問網際網路,容器預設已經做了net,所以容器就可以訪問
         '啟動容器centos-base1'
        [[email protected] ~]$docker container run --name centos-base1 -it  centos:7
        [[email protected] /]# yum install net-tools   <==在容器中安裝網路基本工具
        
      3. 安裝httpd服務,根據需要安裝php和php-mysql
        [[email protected] /]# yum install httpd php php-mysql
        
      4. 安裝vim,編輯測試頁
        [[email protected] /]# yum install vim
        [[email protected] /]# vim /var/www/html/info.php
        <?php
                phpinfo();
        ?>
        
      5. 清除生成的零時檔案,儘可能讓映象檔案更小
        [[email protected] /]# yum clean all
        [[email protected] /]# rm -rf /var/cache/yum/
        
      6. 將此容器讀寫層做成映象,並取名為centos-httpd:v0.1-2.4,會自動新增標籤
        [[email protected] ~]$docker commit centos-base1  centos-httpd:v0.1-2.4
        [[email protected] ~]$docker image ls
        REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
        centos-httpd        v0.1-2.4            91cb79322cc9        About a minute ago   333MB
        
      7. 將定義的映象檔案修改為預設前臺啟動httpd,並起名為centos-httpd:v0.2-2.4
        [[email protected] ~]$docker commit -a "moli<[email protected]" -c 'CMD ["/usr/sbin/httpd","-DFOREGROUND"]' -p centos-base1 centos-httpd:v0.2-2.4
        '檢視映象檔案詳細資訊'
        [[email protected] ~]$docker image inspect centos-httpd:v0.2-2.4        
                "Cmd": [
                        "/usr/sbin/httpd",   <==預設啟動資訊確認修改
                        "-DFOREGROUND"
        '在宿主機上啟動映象,檢視主頁'
        [[email protected] ~]$docker run --name web4 centos-httpd:v0.2-2.4
        
  • 推送映象 將自定義的映象推到倉庫中,供其他人使用,命令為push,示例為阿里雲倉庫

    1. 登入dev.aliyun.com,定義Registry密碼,與登入阿里雲的密碼區分開 建立映象倉庫,如下圖所示,點選下一步彈出原始碼地址,此示例選擇本地,點選下一步建立完成 在這裡插入圖片描述
    2. 將自定義的映象檔案,打標籤為阿里雲個人倉庫標籤格式(在映象倉庫->操作->管理中可檢視格式)
      [[email protected] ~]$docker tag centos-httpd:v0.2-2.4  registry.cn-qingdao.aliyuncs.com/v9/httpd:v0.2-2.4
      
    3. 登入阿里雲Docker Registry,登入成功顯示為Login Succeeded
      [[email protected] ~]$docker login --username=v9 registry.cn-qingdao.aliyuncs.com
      
    4. 使用push推映象檔案,推送成功後,在阿里雲容器映象倉庫中管理->映象版本可檢視
      [[email protected] ~]$docker push registry.cn-qingdao.aliyuncs.com/v9/httpd
      
    5. 登出登入的阿里雲倉庫
      [[email protected] ~]$docker logout  registry.cn-qingdao.aliyuncs.com
      
  • 分發映象的方法

    1. 上例中的Registry,push到倉庫伺服器中
    2. 本地 使用docker image save IMAGEID… -o /PATH/TO/SOMEFILE.tar,然後通過檔案共享協議(如scp、ftp等)複製到另外一個節點上,在目標節點上使用docker image load -i PATH/TO/SOMEFILE.tar完成裝入 示例:
      1. 儲存映象到本地磁碟
        [[email protected] ~]$docker image save centos-httpd:v0.2-2.4  centos-httpd:v0.1-2.4  -o /data/centos-httpd.tar
        
      2. 將儲存的tar檔案傳送給節點102上
        [[email protected] ~]$scp /data/centos-httpd.tar 192.168.50.102:/data
        
      3. 在節點102上載入映象
        [[email protected] ~]$docker load -i /data/centos-httpd.tar
        檢視載入的映象
        [[email protected] ~]$docker image ls
        REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
        centos-httpd        v0.2-2.4            5ec41b218157        About an hour ago   333MB
        centos-httpd        v0.1-2.4            91cb79322cc9        About an hour ago   333MB
        
  • 示例:基於busybox基礎映象做一個web伺服器

    1. 執行基礎映象busybox,其上有httpd服務,建一個頁面測試檔案
      [[email protected] ~]$docker run --name b1 -it busybox
      / # mkdir /data/veb/htdocs -p  <==建頁面檔案目錄
      / # vi /data/veb/htdocs/index.htm  <==編輯頁面檔案
      <h1>httpd server incontainer.<h1>
      / # ifconfig      <==檢視IP地址
       inet addr:172.17.0.3  Bcast:172.17.255.255  Mask:255.255.0.0
      / # httpd -h /data/veb/htdocs -f      <==啟動測試,-f表示佔據前臺
      
    2. 在宿主機上curl檢視
      [[email protected] ~]$curl 172.17.0.3
      <h1>httpd server incontainer.<h1>
      
    3. 修改預設執行程式為httpd,並儲存為映象,busybox下的命令都是連線檔案,需要指定為/bin/sh子程序才能執行
      
                  
                 

      相關推薦

      linux學習51-容器基礎Docker

      容器基礎Docker 開源基金會lsf和alf 1. 容器簡介 什麼是容器 · 統稱來說,容器是一種工具,指的是可以裝下其它物品的工具。 · linux容器是與系統其它部分隔開的一系列程序,從另一個映象執行,並由該映象提供程序所需的全部檔案 特點 ·

      python學習_day54_前端基礎js(2)

      data 截取 定義 得到 let 結果 是什麽 index 插入   在JavaScript中除了null和undefined以外其他的數據類型都被定義成了對象,也可以用創建對象的方法定義變量,String、Math、Array、Date、RegExp都是JavaScri

      python學習_day52_前端基礎CSS布局3

      兩個 表示 sans ucid grand -i 參照物 原始的 doctype 一、定位屬性position 1、相對定位relative   相對定位是相對於該元素在文檔流中的原始位置,即以自己原始位置為參照物。有趣的是,即使設定了元素的相對定位以及偏移值,元素還占有著

      python學習_day58_前端基礎jQuery入門1

      基本 兼容多瀏覽器 python jquery入門 選擇 eight ges span 偶數 一、jQuery介紹   jQuery是一個輕量級的、兼容多瀏覽器的JavaScript庫。使用戶能夠更方便地處理HTML Document、Events、實現動畫效果、方便地進行

      Linux學習筆記_shell程式設計環境變數配置檔案

      shell程式設計之環境變數配置檔案 https://www.imooc.com/learn/361 簡介:本課程是《Tony老師聊shell》系列課程的第三篇,為你帶來常用的Linux環境變數配置檔案的使用。對環境變數配置檔案的功能進行了詳解, 然後又介紹了其他環境變數配置檔案,包括登

      Linux學習筆記_shell程式設計運算子

      shell程式設計之運算子 https://www.imooc.com/learn/355 **簡介:**本課程是《Tony老師聊shell——變數》課程的延續,主要介紹Linux shell程式設計基礎中的運算子。包括declare命令、數值運算方法和變數測試。 首先在declare

      Linux學習筆記_shell程式設計變數

      shell程式設計之變數 https://www.imooc.com/learn/336 **簡介:**本課程是《Linux達人養成計劃I》中第九章課程的延續,主要介紹Linux shell程式設計基礎中的變數。包括Bash變數的分類和各變數的詳細使用,如:使用者自定義變數、環境變數、語

      Linux學習筆記-最基礎的常用shell命令

      目錄 Shell基本命令 1.history 2.!! 3.alias 4.unalias 5.ls 6.">"與"<",">>"重定向符 7.“|”管道符號 8.“jobs”檢視暫停任務 9."fg"恢復暫停的任務 &nb

      容器基礎(一): Docker介紹

       IaaS IaaS階段, 使用者租借基礎設施,但是還是需要像以前管理伺服器那樣,用指令碼或者手工方式在這些機器上部署應用。這個過程中當然難免會碰到雲端機器和本地機器環境不一致的問題。想想每一次同步不同機器環境的過程,就知道這個過程的艱辛!   PaaS 2013年,Cl

      Linux學習工具(基礎篇—)

      1.為什麼要學習Linux? 不是因為大神都在用,而是因為linux是工作中部署環境必備的基礎技能,比如在docker部署環境。 2.用啥學linux? 1.初始學習階段使用vmware workstation pro。vmware的破解碼網上很多,這裡就不

      Linux學習小白成長

      1、簡介 Linux就是一個作業系統,就像你之前用過的windows和macos。下面是小弟畫的關係圖,有助於理解作業系統 作業系統始於二十世紀五十年代,當時的作業系統能執行批處理程式。批處理程式不需要使用者的互動,它從檔案或者穿孔卡片讀取資料,然後輸出到另外一個檔案或者印表機。貝爾實

      玩玩機器學習3——TensorFlow基礎Session基本運算、佔位符和變數的使用

      通過TensorFlow的矩陣和常量的"加減乘除"運算,講一下Session、變數以及佔位符的使用 目錄 變數的使用 Session建立會話與運算 #session的使用,介紹兩種啟動Session的方式,進行矩陣乘法運算 import tensorf

      玩玩機器學習4——TensorFlow基礎啟用函式

             啟用函式(activation function)執行時啟用神經網路中某一部分神經元,將啟用資訊向後傳入下一層的神經網路。神經網路之所以能解決非線性問題(如語音、影象識別),本質上就是啟用函式加入了非線性因素,彌補了線性模型的表達力,把“啟用的神經元的特徵”通過

      Linux 學習筆記—程序通訊 訊號

      2.4訊號 2.4.1 訊號的概念和機制 訊號是UNIX/Linux系統響應某些條件而產生的一個事件,接收到該訊號的程序會相應地採取一些行動。通常訊號是由一個錯誤產生的。但它們還可以作為程序間通訊或修改行為的一種方式,明確地由一個程序傳送給另一個程序。一個訊

      Linux 學習筆記—程序通訊 訊息佇列、訊號量、共享記憶體的概念區別聯絡

      2.5 訊息佇列(Message queues) 訊息佇列是核心地址空間中的內部連結串列,通過linux核心在各個程序直接傳遞內容,訊息順序地傳送到訊息佇列中,並以幾種不同的方式從佇列中獲得,每個訊息佇列可以用IPC識別符號唯一地進行識別。核心中的訊息佇列是通過

      Android學習筆記——UI基礎編寫介面最佳實踐

      參考書籍:Android第一行程式碼(第二版).郭霖著 1、製作Nine-Patch圖片 一種被特殊處理過的png圖片,能夠指定那些區域可以被拉伸、哪些不可以。在Android sdk目錄下有一個tools資料夾,找到draw9patch.bat檔案來製作N

      Linux學習日誌(基礎篇)----VIM末行模式(補充)、gcc相關

      6、vim配置檔案 使用者級別: ~/.vimrc(隱藏的,直接建立即可) 系統級別

      Linux學習筆記-Makefile優化標頭檔案依賴

      如果標頭檔案被更新,則包含了它的cpp檔案應該被重新編譯。 比如first裡面有個函式,main函式呼叫了first裡面的函式,那麼first.h變化了,main肯定要重新編譯 這裡有個知識點: -MMD 【這是編譯器使用的選項】 g++/gcc 編譯xxx.cp

      【嵌入式Linux學習七步曲第三篇 Linux系統bootlaoder移植】全面解析PowerPC架構下的扁平裝置樹FDT

      全面解析PowerPC架構下的扁平裝置樹FDT Sailor_forever  sailing_9806#163.com (本原創文章發表於Sailor_forever 的個人blog,未經本人許可,不得用於商業用途。任何個人、媒體、其他網站不得私自抄襲;網路媒體轉載請

      容器Docker小知識普及

        Docker確實是個好東西,相當於一個小型虛擬機器,裡面環境隔離只要有對應的映象就能執行業務應用、執行基礎應用、能跑資料庫等等,還能跑linux等等。     Docker 從狹義上來講就是一個程序,從廣義上來講是一個虛擬容器,其實更專業的叫法是應用容器( Applica