*作者:周世杰

上一節(jié)我們主要講了《Docker 介紹及實戰(zhàn)》,這一節(jié)我們給大家重點講下Docker鏡像。
以實戰(zhàn)為主,分三步走:使用別人的鏡像 ——》制作自己鏡像——》搭建自己的私有鏡像倉庫。

一、使用別人的鏡像

  1. 配置國內鏡像源

  • Docker 拉?。╬ull)鏡像都是訪問默認的Docker hub上的鏡像,在國內網(wǎng)絡環(huán)境下,下載鏡像速度特別慢,所以建議國內用戶使用Registry Mirror配置國內倉庫鏡像.方法如下:

  • 首先,通過/etc/docker(系統(tǒng)如果沒有這個文件,就新建一個)文件指定要使用的鏡像源,這里以Docker官方提供的中國區(qū)鏡像源為例:

  • vi /etc/docker
    {
    "registry-mirrors":[";]
    }

  • 備注:大家也可以使用其他的鏡像源,比如:

  • ustc:

  • 網(wǎng)易:

  • 騰訊: //只有在騰訊云里面才可以訪問到

  • DaoCloud: http://{id}.m.daocloud.io //{id}需要自己注冊賬號后申請得到

  • aliyun: https://{id}.mirror.aliyuncs.com // {id} 需要自己注冊賬號后申請得到

  • 接著,重新加載配置,重啟docker:

  • systemctl daemon-reload
    systemctl restart docker

  • 通過 docker info 看下配置是否生效:

  1. 搜索鏡像

  • 使用別人的鏡像,第一步應該是先搜索鏡像,通常我們會去Docker官方鏡像庫()里面找。下面通過docker search來搜索鏡像。

  • 以busybox為例(BusyBox是一個集成了一百多個最常用Linux命令和工具【如cat、echo、grep、mount、telnet】的精簡工具箱,它只有不到2MB的大小,很方便進行各種快速驗證)

  • 首先通過以下命令看下幫助:

  • docker search --help


  • 接下來參考幫助來搜索busybox鏡像:

  • docker search busybox


  • 通過上圖,我們看到搜索到25個鏡像(其實還有很多,只是默認返回25條記錄),鏡像按照stars(收藏數(shù))從大到小排列。

  • 如果我們只想查找收藏數(shù)大于10的,可以通過-f來過濾:

  • docker search -f stars=10 busybox


  • 限制只返回2條,并且返回不截斷輸出結果:

  • docker search -f stars=10 --limit=2 --no-trunc busybox


  • 如果只想搜索官方鏡像,可以這樣:

  • docker search -f is-official=true busybox

  1. 獲取鏡像

  • 搜索到我們想要的鏡像后,通過docker pull來拉取鏡像:

  • docker pull busybox

  • tip:不指定tag,則默認會拉取latest標簽的鏡像。

  1. 查看鏡像信息

  • 鏡像pull下來后,我們通過以下命令查看下載的鏡像:

  • docker images


  • 可以看到鏡像來自哪個倉庫,標簽,鏡像ID,創(chuàng)建時間,鏡像大小。
    還可以通過以下命令查看鏡像的詳細信息:

  • 注:命令中的 af2f 為鏡像的id,請根據(jù)實際情況替換;文中出現(xiàn)的類似命令都以此方法處理

  • docker inspect af2f


  • 通過以下命令查看鏡像歷史信息:

  • docker history af2f


  • 我們可以結合busybox的Dockerfile文件來看組成鏡像的各個層的具體內容。

    上面看到的scratch鏡像值得一說:
    scratch鏡像:世界上最小的鏡像,通常被用來制作第一個真正的鏡像。
    scratch是這樣做出來的:

  • tar cv --files-from /dev/null | docker import - scratch

  • 如果嘗試拉取鏡像,會得到這樣的提示:

    也就是說scratch是docker保留字,這個鏡像神一樣的存在,直接基于它做鏡像就可以,不需要拉取。

  1. 標記鏡像

  • 我們在使用鏡像的時候,一般都是通過name:tag的形式。tag相當于鏡像的別名,通常標記為可識別的版本。比如我本地pull了busybox的三個版本):

    通過docker tag給鏡像添加任意標簽:

  • docker tag busybox:1.30 busybox:custom


  • 通過上面的操作,我給鏡像busybox:1.30添加了一個新標簽:custom.

  1. 清理鏡像

  • 使用Docker一段時間后,系統(tǒng)中可能會遺留一些臨時的鏡像文件,以及一些沒有被使用的鏡像,就需要我們不定期的清理鏡像。

  • 清理之前我們先看以下系統(tǒng)有哪些容器和鏡像,其中tag為latest和custom的鏡像正在使用:

    通過以下命令清理鏡像:

  • docker image prune -a -f


  • 參數(shù)說明:
    -a 刪除所有無用鏡像,不光是臨時鏡像
    -f 強制刪除鏡像,而不是進行提示確認

  • 通過上面的命令,我們發(fā)現(xiàn)鏡像只剩下tag為latest這一個了(因為這個被正在運行的容器使用,所以沒有被清理)。

  • 需要注意的是,tag為custom的鏡像也被刪了,查看容器列表:

    通過容器列表可以看到,原來使用tag為custom鏡像的容器,現(xiàn)在的image變?yōu)閍f2f...這個ID了。也就是說通過上面命令清理鏡像的時候,除了沒有被用到的鏡像會被刪除以外,同一個ID的鏡像只會保留一個。

  1. 刪除鏡像

  • 對于沒有用到的鏡像,我們還可以使用以下命令來刪除鏡像:

  • docker rmi busybox:latest

  1. 傳遞鏡像

  • 很多時候,我們需要在內網(wǎng)的docker環(huán)境下使用外網(wǎng)的鏡像,我們可以在外網(wǎng)環(huán)境下,通過docker pull把鏡像拉下來,然后通過以下命令打包成tar文件:

  • docker save -o bu busybox:latest


  • 然后把該tar文件拷貝到內網(wǎng),在內網(wǎng)docker環(huán)境下執(zhí)行以下命令導入鏡像:

  • docker load -i bu

二、制作自己的鏡像

我們不可能一直使用別人的鏡像,在容器時代,我們的業(yè)務也需要跑在容器里面,所以我們要學會自己制作鏡像。

制作鏡像的方式主要有兩種:

  • 一是通過docker commit的方式,這種方式適合新手,或者鏡像不需要經(jīng)常更改的情況,制作過程就是啟動一個已有鏡像,然后在容器里面把自己的業(yè)務部署好,最后commit成鏡像就ok了。

  • 二是通過Dockerfile文件build鏡像,本人比較推薦使用這種方式,后續(xù)維護和更新鏡像比較容易,前提就是需要掌握Dockerfile文件的編寫。

下面重點介紹通過Dockerfile的方式來制作鏡像,首先說一下Dockerfile中常用的指令:

  • FROM :指定構建鏡像的基礎源鏡像。FROM一般是 Dockerfile 中非注釋行的第一個指令。

  • LABEL : 以鍵值對的形式給鏡像添加元數(shù)據(jù)。

  • MAINTAINER :指定創(chuàng)建/維護鏡像的用戶或組織,已過時,推薦使用LABEL

  • ADD :復制本地文件/目錄、遠程文件到容器指定路徑中,還可以是一個tar文件(自動解壓)

  • COPY :復制本地文件/目錄到容器指定路徑中

  • ENV :指定環(huán)境變量,會被后續(xù)RUN使用,并在容器運行時保留

  • WORKDIR :為后續(xù)的RUN、CMD、ENTRYPOINT配置工作目錄

  • USER :指定運行容器時的用戶名/UID,后續(xù)的RUN、CMD、ENTRYPOINT也會使用指定用戶。

  • RUN :根據(jù)業(yè)務需要執(zhí)行一些命令

  • VOLUME :創(chuàng)建一個掛載點

  • EXPOSE :指定容器要暴露的端口號

  • ONBUILD :當所創(chuàng)建的鏡像被作為其它新創(chuàng)建鏡像的基礎鏡像時,所執(zhí)行的操作

  • CMD :配置容器啟動后執(zhí)行的命令,支持三種格式:

    • CMD [“executable” ,”Param1”, “param2”] 使用exec執(zhí)行,推薦

    • CMD command param1 param2,在/bin/sh上執(zhí)行

    • CMD [“Param1”, “param2”] 提供給ENTRYPOINT做默認參數(shù)。

  • ENTRYPOINT : 配置容器啟動后執(zhí)行的命令,并且不可被 docker run 提供的參數(shù)覆蓋。支持兩種格式:

    • ENTRYPOINT [“executable”, “param1”, “param2”]

    • ENTRYPOINT command param1 param2 (shell中執(zhí)行)

從零開始制作一個“hello”鏡像,讓它 say: hello world

1.編寫一個

#include

2.編譯 (使用靜態(tài)編譯,把所需依賴都包含進來):

gcc -static -o hello

3.編寫Dockerfile

FROM scratch
COPY hello /
ENTRYPOINT ["/hello","p1","p2"]

4.構建鏡像 (注意后面有個點 . ):

docker build -t hello .

5.運行(--rm:容器運行結束后自動刪除):

docker run --rm hello p3 p4

輸出:

hello world
parameter 1 is p1.
parameter 2 is p2.
parameter 3 is p3.
parameter 4 is p4.

三、搭建自己的私有鏡像倉庫

學會自己制作鏡像后,要給自己鏡像一個“家”。下面教大家以最快捷的方式搭建一個私有鏡像倉庫;

首先拉取倉庫的鏡像:

docker pull registry

然后運行:

docker run -d -p 5000:5000 --restart always --name registry -v /opt/registry:/var/lib/registry registry

這樣我們的鏡像倉庫就搭建好了。下面我們驗證下倉庫是否可用,把busybox鏡像tag后進行push到私有倉庫:

然后把本地的busybox鏡像全部刪除,再從私有鏡像倉庫拉取。

經(jīng)過測試可以正常pull,證明我們的私有倉庫沒有問題。

總結

把上文提到的docker命令匯總下:

  • docker search :搜索鏡像

  • docker pull : 拉取鏡像

  • docker images : 列出本地鏡像

  • docker inspect : 查看鏡像元數(shù)據(jù)

  • docker history : 查看鏡像歷史信息

  • docker tag :給鏡像添加標簽

  • docker image prune :清理鏡像

  • docker rmi :刪除鏡像

  • docker save :保存鏡像為tar文件

  • docker load : 從tar文件加載鏡像

  • docker commit : 從容器創(chuàng)建鏡像

  • docker build : 從Dockerfile文件構建鏡像

本節(jié)的Docker 鏡像就介紹這些,我們下節(jié)給大家分享《微服務技術》

1.《如何訪問docker運行的鏡像、一個docker鏡像運行多個實例!》援引自互聯(lián)網(wǎng),旨在傳遞更多網(wǎng)絡信息知識,僅代表作者本人觀點,與本網(wǎng)站無關,侵刪請聯(lián)系頁腳下方聯(lián)系方式。

2.《如何訪問docker運行的鏡像、一個docker鏡像運行多個實例!》僅供讀者參考,本網(wǎng)站未對該內容進行證實,對其原創(chuàng)性、真實性、完整性、及時性不作任何保證。

3.文章轉載時請保留本站內容來源地址,http://f99ss.com/keji/3367671.html