1. 程式人生 > 其它 >docker 從入門到實踐-筆記

docker 從入門到實踐-筆記

技術標籤:讀書筆記dockerlinux

由於工作中經常用到docker,所以把 docker入門實踐讀了讀,以便熟練使用。順便記了點筆記,精簡下內容,方便查閱。
筆記只到前八章,後面的內容感覺不是op基本不太用的到。

文章目錄

一、docker簡介

1 什麼是docker?

  • dotcloud內部專案》13年開源〉Linux基金會加入
  • go語言開發,對程序進行封裝隔離,屬於作業系統層面的虛擬化技術。
  • 與傳統虛擬化的區別
    • 傳統虛擬化是先虛擬一套硬體後,在其上執行一個完整的作業系統,然後再在上面執行所需的應用程序,耗費資源。
    • docker容器內的應用程序直接運行於宿主的核心,容器沒有自己的核心,而且也沒有自己的硬體虛擬。容器要比傳統的虛擬機器更為輕便。

2 為什麼要使用docker?

  • 更高效地利用系統資源
  • 更快速地啟動時間
  • 一致的執行環境
  • 持續的交付和部署
  • 更輕鬆的遷移
  • 更輕鬆的維護和擴充套件

對比傳統虛擬機器的總結:

在這裡插入圖片描述

二、基本概念

1 docker映象

  • 對Linux而言,核心啟動後,會掛載root檔案系統。docker映象就相當於一個root檔案系統。

  • docker 映象是一個特殊的檔案系統,除了提供容器執行所需的程式、庫、資源配置檔案外,還包含了一些為執行時準備的配置引數(如匿名卷、環境變數、使用者等。

  • 驚醒不包含任何動態資料,其內容在構建之後也不會被改變。

分層儲存

  • 使用Union FS 的基礎,設計為分層儲存的架構
  • 映象並不是一個ISO那樣的打包檔案,只是一個虛擬的概念,由一組檔案系統,或者說多層檔案系統聯合組成。
  • 構建時,會一層層構建,前一層是後一層的基礎。每一層構建完就不再發生任何變化,後一層的改變只發生在自己一層。
    • 例如,刪除前一層的檔案操作,實際不會刪除前一層的檔案,而是在當前層標記該檔案已刪除。
    • 所以在構建映象時,要額外小心,每一層應儘量只包含該層需要新增的東西。
  • 分層儲存使映象的複用、定製變得更容易。

2 docker 容器

  • 映象和容器的關係,類似類和物件的關係
  • 容器可以被建立、啟動、停止、刪除、暫停等
  • 容器的實質是程序,但是該程序與直接在宿主機的程序不同,容器程序有屬於自己的獨立的名稱空間。
    • 容器可以擁有自己的 root檔案系統、網路配置、程序空間、甚至自己的使用者ID空間。

容器和映象使用的都是分層儲存。

  • 每個容器執行時,以映象為基礎層,在其上建立一個當前容器的儲存層,可以稱這個為容器執行時讀寫而準備的儲存層為容器儲存層。
  • 容器儲存層生命週期和容器保持一致。
  • 最佳實踐要求:容器不應該向其儲存層內寫入任何資料,容器儲存層要保持無狀態化。所有的檔案寫入操作,都應該使用資料卷、或者繫結宿主目錄。其效能和穩定性也更高。
  • 資料卷的生命週期獨立。容器刪除或重新執行後,資料不會丟失。

3 docker registry

Docker Registry 是一個集中的儲存、分發映象的服務。

一個 docker registry 中可以包含多個 倉庫-repository;每個倉庫可以含有多個標籤-tag;每個標籤對應一個映象。

<倉庫名>:<標籤名> 映象;如果忽略標籤,則預設為 latest

倉庫名一般為兩段式路徑,如jwilder/nginx-proxy;前面往往是docker registry 多使用者環境下的使用者名稱,後者則是對應的軟體名。

Docker Registry 公開服務

  • 公開服務開放給使用者使用,允許使用者管理映象。允許使用者免費上傳、下載公開的映象。
  • 最常用的 Docker Hub
  • 國內提供了針對Docker hub 的加速映象。如:阿里雲加速。

私有 Docker Registry

  • 使用者可以在本地搭建私有Docker Registry。
  • Docker 官方提供了 Docker Registry 的映象。可以直接使用為私有Registry服務。
  • 除了官方,也有第三方軟體實現了 Docker Registry API,甚至提供了使用者介面以及一些高階功能。如:VMWare Harbor 和 Sonatype Nexus。

三、安裝Docker

CE:社群版。支援週期7個月。每6個月釋出一個stable版本

EE:企業版

CentOS 安裝 docker CE

支援 64 位的 centos7,要求版本核心不低於3.10

  • 解除安裝舊版本
  1. $ sudo yum remove docker \ docker-client \
    docker-client-latest \ docker-common \ docker-latest \ docker-latest-logrotate \ docker-logrotate \ docker-selinux \ docker-engine-selinux \ docker-engine
    
  • 使用yum安裝

    • 更新國內yum源

    • sudo yum-config-manager \ --add-repo \
      https://mirrors.ustc.edu.cn/docker-ce/linux/centos/docker-ce .repo
      
    • 安裝依賴包

    • sudo yum install -y yum-utils \ device-mapper-persistent-data \
      lvm2
      
    • 安裝

    • sudo yum makecache fast
      sudo yum install docker-ce
      
    • 啟動

    • sudo systemctl enable docker
      sudo systemctl start docker
      
    • 建立docker 使用者組

    • 預設 docker命令會用 Unix socket 與Docker 引擎通訊。而只有 root使用者和docker組的使用者才可以訪問Docker引擎的 Unix socket。

    • 建立docker組

    • sudo groupadd docker
      
    • 將當前使用者加入 docker 組

    • sudo usermod -aG docker $USER
      
    • 退出當前終端並重新登入,進行如下測試。

      1. 測試 Docker 是否安裝正確

        1. docker run hello-world
          
    • 映象加速

      • 請在 /etc/docker/daemon.json (如果檔案不存在請新建該檔案)

      • {
        "registry-mirrors": [
        "https://registry.docker-cn.com"
        ] }
        
      • 重啟服務

      • sudo systemctl daemon-reload
        sudo systemctl restart docker
        
      • 檢測加速是否生效

      • docker info

        看到

        Registry Mirrors: https://registry.docker-cn.com/

四、使用docker 映象

docker 執行容器需要本地存在對應的映象,如果本地不存在該映象,docker會從映象倉庫下載該映象。

1 獲取映象

  • docker pull 從 映象倉庫獲取映象

    • docker pull 【選項】 【docker registry 地址【:埠號】/倉庫名【:標籤】
      
    • 具體可看 docker pull --help

    • 映象倉庫地址格式為:<域名/IP>[:埠號]。 預設地址是 Docker Hub

    • 倉庫名同之前的格式。對應docker hub 如果不給出使用者名稱,則預設是 library,也就是官方映象。

2 使用映象

  • docker image ls 列出映象

    • 映象體積

      • docker hub上顯示的是壓縮後的,本地顯示的是解壓後的體積
      • docker image ls 列表中的映象體積總和並不是所有映象的實際硬碟消耗,因為其多層儲存,實際硬碟佔用空間可能比這個體積總和小很多。
      • docker system df 檢視映象、容器、資料卷佔用的空間。
    • 虛懸映象

      • 由於新舊映象同名,舊映象名稱被取消,從而出現倉庫名、標籤均為。
      • docker pull, docker build 都可以導致這種現象。
      • docker image ls -f dangling=true 可以專門顯示這種映象。
      • 虛懸映象已經失去存在價值,可以使用 docker image prune 刪除
    • 中間層映象

      • docker image ls 只會顯示頂層映象。
      • docker image ls -a 會顯示包括中間映象的所有映象
      • 這會看到很多無標籤的映象,這些是中間映象,是其他映象的依賴,他們不應該被刪除。
      • 刪除所有依賴中間映象的映象後,這些依賴的中間映象也會被連帶刪除
    • 列出部分映象

      • 根據倉庫名列出映象

        • docker image ls ubuntu
          
      • 列出某個特定映象

        • docker image ls ubuntu:18.04
          
      • 過濾刪選 --filter 或者-f

        • # 在 mongo:3.2 之後建立的映象
          docker image ls -f since=mongo:3.2
          
    • 以特定格式顯示

      • 預設 docker image ls 會顯示完整的表格

      • docker image ls -q 只顯示id

      • 可以與 -f 配合使用,篩選id 批量刪除

      • 使用go的模版用法,自己組織排列表格

        • #下面的命令會直接列出映象結果,並且只包含映象ID和倉庫名:
          docker image ls --format "{{.ID}}: {{.Repository}}"
          
          #打算以表格等距顯示,並且有標題行,和預設一樣,不過自己定義列:
          docker image ls --format "table {{.ID}}\t{{.Repository}}\t{{.T ag}}"
          
    • 刪除本地映象

      • docker image rm 命令

        • docker image rm [選項] <映象1> [<映象2> ...]
          
        • 其中 <映象> 可以是 映象短id 、映象長id、映象名、或者映象摘要。

        • id去前三個以上能夠區別就可以。

    • Untagged 和 Deleted

      • 映象的唯一標識是 id和摘要,一個映象可能對應多個標籤。
      • 按映象標籤刪除映象會首先刪除標籤,如果沒有標籤指向該映象,則會執行delete操作。
      • 刪除行為自上而下進行判斷刪除。
    • docker image ls 配合docker image rm。

3 利用 commit 理解映象構成

  • docker commit 可以將容器儲存為映象

    • 語法格式

      •  docker commit [選項] <容器ID或容器名> [<倉庫名>[:<標籤>]]
         
         例如:
         docker commit \
        --author "Tao Wang <[email protected]>" \ --message "修改了預設網頁" \
        webserver \
        nginx:v2
        
        
      • docker history 可以檢視映象內的歷史記錄

    • 慎用 docker commit

      • 會有大量無關內容新增,導致映象極為臃腫。
      • 對所有的映象操作都是黑箱,除了製作映象的人知道執行過什麼命令,怎麼生成的映象,別人無從得知。
      • 每層commit 都會使映象更加臃腫一次

4 使用 Dockerfile 定製映象

Dockerfile 是一個文字檔案,其內包含了一條條的指令,每條指令構建一層。因此每一條指令的內容,就是描述該層如何構建。

  • 步驟

    • 在一個空白目錄中,建立一個文字檔案,命名為Dockerfile

    • 寫入構建內容,例如

      • FROM nginx
        RUN echo '<h1>Hello, Docker!</h1>' > /usr/share/nginx/html/index .html
        
    • 執行命令構建映象

      • #例如
        docker build -t nginx:v3 
        
  • FROM 指定基礎映象

    • FROM 是 Dockerfile的必備指令,也必須是第一條指令

    • 在 Docker Hub 上有非常多的高質量的官方映象,有可以直接拿來使用的服務類的 映象,如 nginx 、 redis 、 mongo 、 mysql 、 httpd 、 php 、 tomcat 等;也有一些方便開發、構建、執行各種語言應用的映象,如

      node 、 openjdk 、 python 、 ruby 、 golang 等。可以在其中尋找一個最 符合我們最終目標的映象為基礎映象進行定製。

      如果沒有找到對應服務的映象,官方映象中還提供了一些更為基礎的作業系統鏡 像,如 ubuntu 、 debian 、 centos 、 fedora 、 alpine 等,這些操作系 統的軟體庫為我們提供了更廣闊的擴充套件空間。

    • scratch 是一個特殊的映象,是一個虛擬的概念,表示空白映象,並不實際存在。

  • RUN 執行命令

    • RUN指令用來執行命令列命令。在定製映象時最常用。
    • 有兩種格式
      1. shell 格式 : RUN <命令>
      2. exec格式:RUN [“可執行檔案”,“引數1”,“引數2”]
    • AUFS 最大層數現在是不超過127層
    • 應該把多個命令合併為一個RUN指令,只建立一層映象,並及時刪除多餘下載,快取等。僅僅使用一個RUN指令,並使用&&將各個所需命令連線起來。
    • Dockerfile 支援shell類的行尾加 \ 換行 以及 # 的註釋方式
  • docker build 進行映象構建

    • 格式

      • docker build [選項] <上下文路徑/URL/- >
        

1 映象構建上下文 (Context)

docker build [選項] <上下文路徑/URL/->

  • docker build 的工作原理:並非在本地構建,而是在服務端
  • 使用者指定上下文路徑,docker build 會將路徑下的所有內容打包,上傳給docker 引擎。
  • dockerfile中的相對路徑都是相對上下文的。
  • 可以用 .dockerignore 忽略不需要上傳的內容。
  • 預設使用上下文路徑先的dockerfile。也可以單獨通過 -f 檔案路徑指定。

2 其它 docker build 的用法

  • 直接用 git repo 構建

    • docker build https://github.com/twang2218/gitlab-ce-zh.git#:11 .1
      
    • 指定了構建的 git repo url;指定預設分支master;構建目錄 為 /11.1/

    • docker 會自己clone 切換分支、指定目錄,然後開始構建。

  • 用給定的tar壓縮包構建

    • docker build http://server/context.tar.gz
      
    • 自動下載、解壓,以其作為上下文,開始構建。

  • 從標準輸入中讀取 Dockerfile 進行構建

    •  docker build - < Dockerfile
       # 或者
        cat Dockerfile | docker build -
      
    • 只能讀取Dockerfile ,沒有上下文,所以不能把本地檔案COPY進映象。

  • 從標準輸入中讀取上下文壓縮包進行構建

    • docker build - < context.tar.gz
      
    • 如果發現輸入的檔案格式為 gzip、bzip2 以及 xz,會自動解壓展開,作為上下文,開始構建。

3 Dockerfile 指令詳解

  • COPY 複製檔案

    • 兩種指令格式,一種類似命令列,一種類似函式呼叫

      1. COPY [--chown=<user>:<group>] <源路徑>... <目標路徑>
        
      2.  COPY [--chown=<user>:<group>] ["<源路徑1>",... "<目標路徑>"]
        
    • <源路徑>可以有多個,甚至可以是萬用字元

    • <目標路徑>可以是容器內的絕對路徑,也可以是相對工作目錄的相對路徑。工作目錄可以用WORKDIR指定。

    • 使用指令時 可以加上 --chown=: 改變檔案所屬使用者及所屬組。

  • ADD 更高階的複製檔案

    • 性質與COPY基本一致,增加了一些功能。
    • <源路徑>可以是URL,會自動下載,下載後的檔案許可權為600. URL 下載不會自動解壓縮。
    • <源路徑>是tar檔案,gzip或者bzip2 以及 sz,add 會自動解壓縮。如果希望不自動解壓,則要使用COPY。
    • ADD會使映象構建快取失效,所以會使構建變慢。語義也不如COPY清晰。
    • 最佳實踐要求:儘可能使用COPY,只有需要解壓縮時使用 ADD
    • 使用指令時也可以加上 --chown=: 改變檔案所屬使用者及所屬組
  • CMD 容器啟動命令

    • CMD指令的格式和RUN相似,也是兩種格式

      • shell格式

        • CMD <命令>
          
      • exec 格式

        • CMD ["可執行檔案", "引數1", "引數2"]
          
      • 引數列表格式,在指定了 ENTRYPOINT 後, 用 CMD指定引數

        • CMD [ "引數1", "引數2"]
          
    • CMD 是用於指定預設的容器主程序的啟動命令的。如 ubuntu 映象預設的 CMD 是 /bin/bash

    • 推薦使用exec,這種格式會解析為JSON資料,一定要用 " " 雙引號

    • 實際上shell格式,會被包裝成sh -c 的 exex 引數格式。

    • docker的所有應用都應放在前臺執行,否則主程式就會退出,容器就失去了存在的意義。所以不能用 CMD service XXX start

    • 正確做法是 直接執行 XXX 可執行檔案,並且以前臺形式執行:

      •  CMD ["nginx", "-g", "daemon off;"]
        

4 ENTRYPOINT 入口點

  • ENTRYPOINT 的格式 也分為 shell 和exec兩種格式
  • ENTRYPOINT的目的和CMD 一樣,都是在指定容器啟動程式以及引數。
  • 指定ENTRYPOINT後 ,CMD的含義就發生了改變,不再是直接執行的命令,而是將其內容作為引數傳給ENTRYPOINT。
    • 即執行 “”
  • ENTRYPOINT主要是為了一下場景
    1. 讓映象變成命令一樣使用,直接執行映象後接的引數會傳送給ENTRYPOINT,而不是直接替換CMD。
    2. 執行應用執行前的準備工作。可以寫一個指令碼,然後放入ENTRYPOINT 中執行。

5 ENV設定環境變數

  • 有兩種格式
    1. ENV
    2. ENV = =…
  • 作用是設定環境變數,之後的其它命令或應用都可以直接使用定義的環境變數。

5 ARG 構建引數

  • 格式:ARG <引數名>[=<預設值>]
  • 構建引數和ENV的效果一樣,但是ARG定義的引數只在構建時存在,容器執行時不存在
  • docker build 中 用 --build-arg <引數名>=<值> 可以覆蓋 ARG定義的引數。

6 VOLUME 定義匿名卷

  • 格式
    • VOLUME ["<路徑1>","<路徑2>"]
    • VOLUME <路徑>
  • 容器執行時,應儘量保持容器儲存層不發生寫操作,對於需要儲存的動態資料,其資料檔案應該儲存在卷中。
  • 為防止執行時使用者忘記將動態檔案目錄掛載為卷,可以通過VOLUME 事先將這些目錄掛載為匿名卷。
  • 執行時 可以 在 docker run 後加 -v 引數替代掛載配置。

7 EXPOSE 宣告埠

  • 格式: EXPOSE <埠1> [<埠2>…]
  • EXPOSE 命令宣告執行時容器提供服務埠,僅僅只是宣告。
  • 執行時應用並不會因為這個宣告開啟這個埠的服務。
  • 好處
    • 幫助映象使用者理解這個映象服務的守護埠,以方便配置對映。
    • 在執行時使用隨機埠對映時,即 docker run -P 時,會自動隨機對映 EXPOSE的埠。
  • 注意區分 EXPOSE 和執行時 -p <宿主埠>:<容器埠>
    • -p 是對映宿主埠和容器埠,即將容器的對應埠服務公開給外界訪問
    • 而EXPOSE 僅僅是宣告容器打算使用什麼埠,而不會自動與宿主埠進行對映。

8 WORKDIR 指定工作目錄

  • 格式為:WORKDIR <工作目錄路徑>
  • 使用 WORKDIR 可以指定工作目錄(當前目錄),以後的各層的當前目錄都會變成這個目錄。
  • 注意 dockerfile 和shell不同。每個RUN命令是單獨的一層容器。是獨立的,上一個RUN進入某個目錄,下一個RUN並不在這個目錄。WORKDIR會使每次RUN都在指定目錄
  • 如果指定的目錄不存在,WORKDIR會自動幫忙建立。

9 USER 指定當前使用者

  • 格式為: USER <使用者名稱>[:<使用者組>]
  • 與 WORKDIR 相似,都是改變環境狀態,並影響以後的層。
  • USER 改變之後層的 執行 RUN CMD 以及 ENTRYPOINT的身份
  • USER 切換的使用者必須是事先建立好的。

在TTY缺失的情況下 可以下載使用gosu 替換 su 和 sudo的使用。

10 HEALTHCHECK 健康檢查

  • 格式
    • 設定檢查容器健康狀況的命令
      • HEALTHCHECK [選項] CMD <命令>
    • 遮蔽基礎映象的健康檢查命令,如果有
      • HEALTHCHECK NONE
  • 作用,通過檢測容器健康狀態,避免程式進入死鎖,不退出,卻無法提供服務的情況。
  • 指定 HEALTHCHECK 指令後,容器初始狀態為 starting,在指令檢查成功後 變為 healthy,如果連續一定次數失敗 則會變為 unhealthy
  • HEALTHCHECK 支援一下選項
    • –interval=<間隔> : 兩次健康檢查的時間間隔,預設30s
    • –timeout=<時長> :健康檢查命令執行超時時間,如果超過這個時間,本次健康檢查就被視為失敗,預設 30 秒;
    • –retries=<次數>:當連續失敗指定次數後,則將容器狀態視為unhealthy,預設 3 次。
  • 同 CMD,ENTRYPOINT ,HEALTHCHECK 只可以出現一次,如果出現多個,只有最後一個生效。
  • HEALTHCHECK 【選項】 CMD 後面的命令 可以是 shell 或exec 格式。命令的返回值決定了檢查是否成功: 0-成功 1-失敗 2-保留不要使用。

11 ONBUILD 為他人做嫁衣

  • 格式:ONBUILD <其它指令>
  • ONBUILD 後的命令在當前映象構建時並不會執行,只有以當前映象為基礎映象,去構建下一級映象時才會被執行。

5 多階段構建

  • docker 17.05 之前 ,構建映象時通常會採用兩種方式

    1. 全部放入一個dockerfile
      1. 映象層次多,體積較大,部署的時間變長
      2. 原始碼存在洩漏的風險
    2. 分散到多個dockerfile
      1. 部署過程比較複雜
  • 17.05 之後開始支援分階段構建,只需要編寫一個dockerfile 就可以解決上述問題

    • 只構建某一階段的映象

      • 可以使用as來為某一階段命名

      • FROM golang:1.9-alpine as builder
        
      • 如果只想構建 這個階段的映象,構建時增加 --target=builder 引數即可,如

      • docker build --target builder -t username/imagename:tag .
        
    • 構建時從其它映象複製檔案

      • COPY --from=0 <源路徑> <目標路徑> 從上一階段的映象中複製檔案

      • 也可以複製任意映象中的檔案,如

        • COPY --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
          
  • 實戰多階段構建 Laravel 映象 (PHP開發)

6 其它的映象構建方式

  • 從rootfs 壓縮包匯入
    • 壓縮包可以是本地檔案、遠端 Web 檔案,甚至是從標準輸入中得到。壓縮包將會 在映象 / 目錄展開,並直接作為映象第一層提交。
  • docker save 和docker load
    • 將映象儲存為一個檔案,然後傳輸到另一個位置,然後在載入進來。
    • 這是沒有Docker Registry 時的做法,現在不推薦
    • docker save 將映象儲存為歸檔檔案

7 映象的實現原理

  • Docker 映象是怎麼實現增量的修改和維護的?
    • 每個映象由很多層次構成
    • Docker 使用Union FS 將這些不同的層結合到一個映象中。
      • Union FS 通常有兩個用途
        1. 實現不借助 LVM 、RAID 將多個disk掛到同一目錄下。
        2. 將一個只讀的分支可一個可寫的分支聯合在一起。

五、操作Docker 容器

容器:獨立執行的一個或一組應用,以及它們的執行態環境。

虛擬機器:模擬執行的一整套作業系統

如何管理一個容器,建立、啟動、停止

1 啟動容器

  • 兩種啟動方式:
    1. 基於映象新建一個容器並啟動
    2. 將在終止狀態的容器重新啟動。
  1. 新建並啟動

    • docker run 【選項】 映象 <命令> <命令引數>
    • 互動模式
      • -t 分配一個偽終端 (pseudo-tty)並繫結到容器的標準輸入上
      • -i 讓容器的標準輸入保持開啟
    • 當利用docker run 來建立容器時,後臺執行的標準操作包括:
      • 檢查本地是否存在指定的映象,不存在則從公有倉庫下載
      • 利用映象建立並啟動一個容器
      • 分配一個檔案系統,並在只讀的映象層外面掛載一層可讀寫層
      • 從宿主機配置的網橋介面中橋接一個虛擬介面到容器中
      • 從地址池配置一個ip地址給容器
      • 執行使用者指定的應用程式
      • 執行完畢後容器被終止
  2. 啟動已終止容器

    • docker container start
    • 容器中所需的資源都是應用程式所必須的,除此之外,並沒有其它的資源。
  3. 後臺執行

    • -d 引數,讓docker 在後臺執行而不是直接把執行命令的結果輸出在當前的宿主機下
    • 容器是否會長久執行,和docker run 指定的命令有關,和 -d 無關
    • -d 會返回一個 唯一 id ,docker container ls 可以檢視
    • docker container logs [container ID or NAMES] 可以獲取容器的輸出資訊
  4. 終止容器

    • docker container stop 終止一個在執行的容器
    • 當dock兒中指定的應用終結時,容器也會自動終止。
    • 如果只啟動終端,exit 或者 ctr +d 退出終端時,所建立的容器會立刻終止。
    • 終止狀態的容器可以用 docker container ls -a 檢視
    • docker container start 命令來重新啟動
    • docker container restart 命令會將一個執行態的容器終止,然後再重 新啟動它
  5. 進入容器

    docker attach 或者 docker exec 可以進入容器,推薦使用 exec

    1. attach命令
      • 進入後,exit 會導致容器終止
    2. exec
      • docker exec 後面可以跟多個引數,主要是 -i -t
      • exit 不會導致容器終止
  6. 匯出和匯入容器

    1. docker ecport 可以匯出本地某個容器,匯出的容器快照到本地檔案,如

      1. docker export 7691a814370e > ubuntu.tar
        
    2. docker import 從容器快照檔案中再匯入為映象

      1. cat ubuntu.tar | docker import - test/ubuntu:v1.0
        
      2. 也支援指定 URL或目錄匯入

        docker import http://example.com/exampleimage.tgz example/imag erepo
        
      3. docker load vs docker import

        • docker import 容 器快照檔案將丟棄所有的歷史記錄和元資料資訊(即僅儲存容器當時的快照狀 態),
        • 而docker load 映象儲存檔案將儲存完整記錄,體積也要大。此外,從容器快照檔案匯入 時可以重新指定標籤等元資料資訊。
  7. 刪除容器

    • docker container rm
    • 刪除執行中的容器 -f 引數,docker會發送 SIGKILL訊號給容器
  8. 清理所有處於終止狀態的容器

    1. docker container prune
      

六、訪問倉庫

  • Repository 倉庫是集中存放映象的地方
  • Registry 註冊伺服器,是管理倉庫的具體伺服器。每個伺服器可以有多個倉庫,每個倉庫下面有多個映象。

1 docker hub

Docker hub 是官方維護的公共倉庫

  • 登陸
    • 可以在官網註冊一個賬號
    • docker login / docker logout 登陸/退出
  • 拉取映象
    • docker search 關鍵詞 查詢官方映象
    • docker pull 映象 拉取映象
    • 前面沒有使用者名稱的映象,由docker 公司建立、驗證、支援、提供。被稱為基礎映象或者根映象
    • 前面有使用者字首的是有docker使用者建立並維護的映象
    • 在查詢時 --filter=stars=N 可以僅顯示收藏數量N以上的映象
  • 推送映象
    • docker push 使用者字首/倉庫名:tag
  • 自動建立

2 私有倉庫

Nexus3.x 私有倉庫

七、docker 資料管理

  • 資料卷 Volumes
  • 掛載主機目錄 Bind mounts
  1. 資料卷

    • 資料卷是一個可供一個或多個容器使用的特殊目錄。繞過了 UFS

      • 在容器間可以共享和重用
      • 對資料卷的修改會立馬生效
      • 對資料卷的更新不會影響映象
      • 資料卷 預設一直存在,即使容器被刪除。
    • 建立資料卷,例如

      • docker volume create my-vol
        
    • 檢視所有的 資料卷

      • docker volume ls
        
    • 檢視指定資料卷的資訊

      • docker volume inspect my-vol
        
    • 啟動一個掛載資料卷的容器

      • docker run -d -P \
        --name web \
        # -v my-vol:/webapp \
        --mount source=my-vol, target=/webapp \
        training/webapp \
        python app,py
        
    • 檢視容器的具體資訊時可以看到資料卷的具體資訊

      • docker inspect web
        
      • 在 “Mounts” key 的下面

    • 刪除資料卷

      • 資料卷生命週期獨立於容器,docker不會自動刪除資料卷

      • 如果要在刪除容器時同時刪除資料卷,使用 docker rm -v 刪除容器

      • 清理無主資料卷

        • docker volume prune
          
  2. 掛載主機目錄

    • 使用 --mount 可以指定掛載一個本機目錄到容器中

      • docker run -d -P \
        --name web \
        # -v /src/webapp:opt/webapp \
        --mount type=bind,source=/src/webapp, target=/opt/webapp \
        training/webapp \
        python app.py
        
      • 本地目錄必須是絕對路徑

      • 如果 路徑不存在,–mount 會報錯

      • 方便測試

      • 預設許可權是讀寫,可以增加 readonly 選項 改為只讀

      • 也可以掛載一個本地主機檔案作為資料卷

八、docker中的網路功能介紹

docker 允許通過外部訪問容器或容器互聯的方式來提供網路服務

  1. 外部訪問容器

    • 通過 -P 或者 -p 來指定埠對映
    • -P 會隨機對映一個 49000-49900 的埠到容器開放的網路埠
    • -p 則可以指定要對映的埠,一個指定埠只能繫結一個容器
    • -p 可以使用多次,繫結多個埠
    • -p 支援的格式有 ip:hostPort:containerPort | ip::containerPort | hostPort:containerPort
    • 只指定port 忽略ip,是對映介面上的所有地址
    • docker port container 可以檢視容器的埠配置
  2. 容器互聯

    1. docker run --link 可以使容器互聯
    2. 自定義docker網路連線多個容器
    • 建立一個新的 Docker 網路

      • docker network create -d bridge my-net
        
      • -d 指定docker網路的型別,有 bridge overlay 兩個選項

    • 執行一個容器並連線到新建的 my-net 網路

      • docker run -it --rm --name busybox1 --network my-net busybox sh
        
    • 開啟新終端,再執行一個容器並加入到 my-net

      • docker run -it --rm --name busybox2 --network my-net busybox sh
        
    • 在兩個容器中用 ping 可以證明 busybox1 容器和 busybox2 容器建立了互關係

      • # busybox1中
        PING busybox2
        
        # busybox2 中
        PING busybox1
        
  3. docker compose

    • 如果有多個容器需要連線,推薦使用 docker compose
  4. 配置DNS

  5. 高階網路配置

  6. Docker Compose 專案