Docker的鏡像使用-Window

鏡像加速

鏡像默認是通過 DockerHub 拉取的,中國可能有些困難,會報以下錯誤:

net/http: TLS handshake timeout

所以,需要配置中國的加速服務地址:

官方地址://registry.docker-cn.com

網易://hub-mirror.c.163.com/

阿里云://<你的ID>.mirror.aliyuncs.com

七牛雲加速器://reg-mirror.qiniu.com

中科大://docker.mirrors.ustc.edu.cn

window通過docker desktop的設置可以添加保存(保存後會自動重啟docker服務),如下:

 查找鏡像

我們可以從 Docker Hub 網站來搜索鏡像,Docker Hub 網址為: //hub.docker.com/

我們也可以使用 docker search 命令來搜索鏡像,比如我們一個centos的鏡像,那我們可以在 powershell (後文也統一使用powershell)用以下命令:

PS C:\> docker search centos
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
centos                             The official build of CentOS.                   6318                [OK]
ansible/centos7-ansible            Ansible on Centos7                              132                                     [OK]
consol/centos-xfce-vnc             Centos container with "headless" VNC session…   123                                     [OK]
jdeathe/centos-ssh                 OpenSSH / Supervisor / EPEL/IUS/SCL Repos - …   116                                     [OK]
.......

NAME: 鏡像倉庫源的名稱

DESCRIPTION: 鏡像的描述

OFFICIAL: 是否 docker 官方發布

STARS: 類似 Github 裡面的 star,表示點贊、喜歡的意思。

OFFICIAL:是否為官方鏡像。

AUTOMATED: 自動構建。

通過上面例子看到 docker search 命令查詢有一個小缺點,沒有 tag 這樣不好獲取指定 tag 的鏡像,通過 Docker Hub 網站查找資訊很全面,沒有這些問題。

獲取鏡像

當我們的本地主機使用一個不存在的鏡像時,會自動下載後使用。如果我們要先獲取鏡像,可以使用 docker pull 命令,如下:

PS C:\> docker pull centos
Using default tag: latest
latest: Pulling from library/centos
7a0437f04f83: Pull complete    
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1 Status: Downloaded newer image
for centos:latest docker.io/library/centos:latest

可以看到如果不指定鏡像的 Tag ,那麼默認 Tag 為 latest。可以通過在鏡像名後增加:Tag 來指定(也可以通過 Digest 摘要)

PS C:\> docker pull centos:centos8.3.2011

如果需要獲取鏡像的全部標籤

PS C:\> docker pull --all-tags centos

同一個標籤的鏡像反覆獲取,只會存在一個。

查詢本地鏡像

通過 docker images 命令來列出本地主機上的鏡像。

PS C:\> docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos              latest              300e315adb2f        31 hours ago        209MB
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB

各列說明:

REPOSITORY:表示鏡像的倉庫源

TAG:鏡像的標籤

IMAGE ID:鏡像ID

CREATED:鏡像創建時間

SIZE:鏡像大小

同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如 centos 倉庫源里,有 15.10、14.04 等多個不同的版本,我們使用 REPOSITORY:TAG 來定義不同的鏡像。

刪除鏡像

鏡像刪除通過 docker rmi 命令執行,可以同時刪除多個鏡像,如下刪除了鏡像 hello-world 和 centos

PS C:\> docker rmi hello-world centos

鏡像名稱也可增加 Tag 標籤來刪除指定鏡像的指定標籤。

創建鏡像

當我們從 docker 鏡像倉庫中下載的鏡像不能滿足我們的需求時,我們可以通過以下兩種方式對鏡像進行更改。

1、從已經創建的容器中修改鏡像,並且提交這個鏡像

2、使用 Dockerfile 指令來創建一個新的鏡像

編輯鏡像

 先通過鏡像 centos 來創建一個容器

PS D:\> docker run -t -i centos /bin/bash

運行後會構建一個 centos 的容器,並進入到容器中的 cnetos 作業系統中,我們這裡進行一個安裝 redis 的操作,讓我們新的 centos 鏡像有 redis (官方的原始 centos 鏡像是純凈的)。依次執行下面的語句:

[root@fda2c65d7e02 /]# yum -y install wget                                          //注釋:安裝wget,用來執行wget命令                                
[root@fda2c65d7e02 /]# wget //download.redis.io/releases/redis-4.0.6.tar.gz    //注釋:下載redis壓縮包
[root@fda2c65d7e02]# tar -zxvf redis-4.0.6.tar.gz                      //注釋:解壓redis壓縮包
[root@fda2c65d7e02 /]# yum install gcc                            //注釋:yunm安裝gcc依賴
[root@fda2c65d7e02 /]# cd redis-4.0.6                             //注釋:跳轉到redis解壓目錄下
[root@fda2c65d7e02 redis-4.0.6]# yum -y install gcc automake autoconf libtool make  //注釋:安裝make,用來執行make命令
[root@fda2c65d7e02 redis-4.0.6]# make MALLOC=libc                      //注釋:編譯安裝redis
[root@fda2c65d7e02 redis-4.0.6]# cd src && make install                             //注釋:切換到redis src目錄下,將/usr/local/redis-4.0.6/src目錄下的文件加到/usr/local/bin目
[root@fda2c65d7e02 src]# ./redis-server                           //注釋:運行redis,可以看到成功運行了

之後我們輸入 exit 命令退出容器,使用 commit 命令提交容器副本,在本機創建新鏡像(可以通過 push 命令推送到 docker hub 上)

PS D:\> docker commit -m="add redis" -a="xu" fda2c65d7e02  xu/centos:v1.0.1

各個參數說明:

-m: 提交的描述資訊

-a: 指定鏡像作者

fda2c65d7e02:容器 ID,可以通過 docker ps -a 命令查看

xu/cnetos:v1.0.1: 指定要創建的目標鏡像名和標籤 tag

查詢鏡像

PS D:\> docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
xu/centos           v1.0.1              0827da229df3        9 seconds ago       445MB
centos              latest              300e315adb2f        2 days ago          209MB

可以試下,通過我們自己修改後的鏡像來創建的容器自帶 redis

創建鏡像

我們使用 build 命令, 從零開始來創建一個新的鏡像。為此,我們需要創建一個 Dockerfile 文件,其中包含一組指令來告訴 Docker 如何構建我們的鏡像。我們創建一個txt文件,重命名為Dockerfile(刪除後綴),內容如下:

FROM centos
RUN yum -y install wget
RUN yum -y install gcc automake autoconf libtool make
RUN wget http://download.redis.io/releases/redis-4.0.6.tar.gz
RUN tar -zxvf redis-4.0.6.tar.gz
WORKDIR /redis-4.0.6
RUN make MALLOC=libc
WORKDIR src
RUN make install
CMD ["/bin/bash"]

指令說明

FROM:指明基礎的鏡像,可以用:指明tag

RUN:在鏡像容器中執行命令

WORKDIR:跳轉目錄,為後續的RUN、CMD或者ENTRYPOINT指定工作目錄

CMD:構建容器後調用,也就是在容器啟動時才進行調用

Dockerfile文件創建完成後,打開 PowerShell 運行 build 命令等待創建完成即可.

PS D:\xwc\myDockerfile> docker build -t xu/centos:1.0.2 .

參數說明:

-t :指定要創建的目標鏡像名,可以添加 :tag 指定標籤,否則默認 latest

. :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對路徑(我這裡直接在文件所在路徑打開 powershell 所以不指定,默認改文件夾下)

鏡像標籤

可以通過 tag 命令修改鏡像的名稱和標籤

PS D:\> docker tag bf756fb1ae65 xu/hello-world:666

上面的命令是將鏡像 id 為 bf756fb1ae65 的鏡像複製一份用戶/鏡像名為 xu/hello-world 標籤為 666,查看鏡像可以看到它們的鏡像 id 都是相同的

PS D:\> docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              bf756fb1ae65        11 months ago       13.3kB
xu/hello-world      666                 bf756fb1ae65        11 months ago       13.3kB