1. 程式人生 > >Docker 從入門到放棄(三)映象使用

Docker 從入門到放棄(三)映象使用

當執行容器時,使用的映象如果在本地中不存在,docker 就會自動從 docker 映象倉庫中下載,預設是從 Docker Hub 公共映象源下載。

下面我們來學習:

  • 1、管理和使用本地 Docker 主機映象
  • 2、建立映象

一、列出映象列表

可以使用 docker images 來列出本地主機上的映象。

[email protected]:~# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello
-world latest f2a91732366c 2 weeks ago 1.85kB ubuntu 15.10 9b9cb95443b5 16 months ago 137MB training/webapp latest 6fae60ef3446 2 years ago 349MB

各個選項說明:

  • REPOSITORY:表示映象的倉庫源

  • TAG:

    映象的標籤

  • IMAGE ID:映象ID

  • CREATED:映象建立時間

  • SIZE:映象大小

說明:同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如ubuntu倉庫源裡,有15.10、14.04等多個不同的版本,我們使用 REPOSITORY:TAG 來定義不同的映象。

所以,如果要使用版本為15.10的ubuntu系統映象來執行容器時,命令如下:

[email protected]:~# docker run -t -i ubuntu:15.10 /bin/bash 
[email protected]:/# cat /etc/issue
Ubuntu 
15.10 \n \l

如果要使用版本為16.04的ubuntu系統映象來執行容器時,命令如下:

[email protected]:~# docker run -t -i ubuntu:16.04 /bin/bash
[email protected]:/# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

注意:如果你不指定一個映象的版本標籤,例如你只使用 ubuntu,docker 將預設使用 ubuntu:latest 映象。

二、獲取一個新的映象

當我們在本地主機上使用一個不存在的映象時 Docker 就會自動下載這個映象。如果我們想預先下載這個映象,我們可以使用 docker pull 命令來下載它。

下載完成後,我們可以直接使用這個映象來執行容器。

docker run -t -i ubuntu:13.10 /bin/bash

三、查詢映象

我們可以從 Docker Hub 網站來搜尋映象,Docker Hub 網址為: https://hub.docker.com/

我們也可以使用 docker search 命令來搜尋映象。比如我們需要一個httpd的映象來作為我們的web服務。我們可以通過 docker search 命令搜尋 httpd 來尋找適合我們的映象。

複製程式碼
[email protected]:~# docker search httpd
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                               The Apache HTTP Server Project                  1367                [OK]                
hypriot/rpi-busybox-httpd           Raspberry Pi compatible Docker Image with a …   39                                      
centos/httpd                                                                        15                                      [OK]
armhf/httpd                         The Apache HTTP Server Project                  8                                       
centos/httpd-24-centos7             Platform for running Apache httpd 2.4 or bui…   5                                       
macadmins/netboot-httpd             use in combination with bruienne/bsdpy          4                                       [OK]
lolhens/httpd                       Apache httpd 2 Server                           2                                       [OK]
salim1983hoop/httpd24               Dockerfile running apache config                2                                       [OK]
rgielen/httpd-image-php5            Docker image for Apache httpd with PHP 5 bas…   1                                       [OK]
rgielen/httpd-image-simple          Docker image for simple Apache httpd based o…   1                                       [OK]
lead4good/httpd-fpm                 httpd server which connects via fcgi proxy h…   1                                       [OK]
antoineco/httpd-mod_cluster         Apache HTTP Server with JBoss mod_cluster       1                                       [OK]
dockerpinata/httpd                                                                  0                                       
trollin/httpd                                                                       0                                       
tplatform/aws-linux-httpd24-php70   aws-linux-httpd24-php70                         0                                       [OK]
manasip/httpd                                                                       0                                       
jbpt/httpd                                                                          0                                       [OK]
antoineco/httpd                     Extra OS variants for the official HTTPd ima…   0                                       [OK]
ppc64le/httpd                       The Apache HTTP Server Project                  0                                       
publici/httpd                       httpd:latest                                    0                                       [OK]
efrecon/httpd                       A micro-sized httpd. Start serving files in0                                       [OK]
sbutler/pie-httpd                   PIE httpd server                                0                                       
camptocamp/os-wp-httpd              Wordpress httpd                                 0                                       [OK]
openbucks/httpd                                                                     0                                       
manageiq/httpd                      Container with httpd, built on CentOS for Ma…   0                                       [OK]
複製程式碼

NAME:映象倉庫源的名稱

DESCRIPTION:映象的描述

OFFICIAL:是否docker官方釋出

四、拖取映象

我們決定使用上圖中的httpd 官方版本的映象,使用命令 docker pull 來下載映象。

 

下載完成後,我們就可以使用這個映象了

docker run httpd

五、建立映象

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

  1. 從已經建立的容器中更新映象,並且提交這個映象
  2. 使用 Dockerfile 指令來建立一個新的映象

六、更新映象

更新映象之前,我們需要使用映象來建立一個容器。(建立容器必須先進入映象啊!)

[email protected]:~# docker run -t -i ubuntu:15.10 /bin/bash
[email protected]:/# 

在執行的容器內使用 apt-get update 命令進行更新。

在完成操作之後,輸入 exit命令來退出這個容器。

此時ID為4301b57638b7的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit來提交容器副本。

[email protected]:~# docker commit -m="has update" -a="Tinywan" 4301b57638b7 Tinywan/ubuntu:v2
sha256:680b98860b7d1b338df06947ddb89df0243b2d51af414955a6a85d3cd35e1984

各個引數說明:

  • -m:提交的描述資訊

  • -a:指定映象作者

  • e218edb10161:容器ID

  • Tinywan/ubuntu:v2:指定要建立的目標映象名

 我們可以使用 docker images 命令來檢視我們的新映象 runoob/ubuntu:v2:

複製程式碼
[email protected]:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
tinywan/ubuntu      v2                  344de7f9ce0f        11 seconds ago       137MB
hello-world         latest              f2a91732366c        2 weeks ago          1.85kB
ubuntu              16.04               20c44cd7596f        2 weeks ago          123MB
ubuntu              15.10               9b9cb95443b5        16 months ago        137MB
training/webapp     latest              6fae60ef3446        2 years ago          349MB
複製程式碼

使用我們的新映象 runoob/ubuntu 來啟動一個容器

[email protected]:~# docker run -t -i tinywan/ubuntu:v2 /bin/bash
[email protected]:/# cat /etc/issue
Ubuntu 15.10 \n \l

構建映象

我們使用命令 docker build , 從零開始來建立一個新的映象。為此,我們需要建立一個 Dockerfile 檔案,其中包含一組指令來告訴 Docker 如何構建我們的映象。

複製程式碼
[email protected]:/home/www/docker# cat Dockerfile 
FROM    ubuntu:14.04
MAINTAINER      Fisher "[email protected]qq.com"

RUN     /bin/echo 'tinywan:123456' |chpasswd
RUN     useradd tinywan
RUN     /bin/echo 'tinywan:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
複製程式碼

每一個指令都會在映象上建立一個新的層,每一個指令的字首都必須是大寫的。

  • FROM:指定使用哪個映象源(基於哪個映象)
  • MAINTAINER : 映象建立者
  • RUN:指令告訴 docker 在映象內執行命令,安裝了什麼...(安裝軟體用)
  • CMD:container(容器)啟動時執行的命令,但是一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD

然後,我們使用 Dockerfile 檔案,通過 docker build 命令來構建一個映象:

複製程式碼
[email protected]:/home/www/docker# docker build -t tinywan/ubuntu:14.04 .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM    ubuntu:14.04
 ---> d6ed29ffda6b
Step 2/7 : MAINTAINER      Fisher "[email protected]"
 ---> Using cache
 ---> 89d1dd5723ac
Step 3/7 : RUN     useradd tinywan
 ---> Running in 2241d8c9a59e
Removing intermediate container 2241d8c9a59e
 ---> 7d64f7cf63e7
Step 4/7 : RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
 ---> Running in d90a9513959f
Removing intermediate container d90a9513959f
 ---> bd375fb5a38c
Step 5/7 : EXPOSE  22
 ---> Running in 2bca5bbc5e32
Removing intermediate container 2bca5bbc5e32
 ---> 1566f7bdb2ac
Step 6/7 : EXPOSE  80
 ---> Running in 15819d4ecc8f
Removing intermediate container 15819d4ecc8f
 ---> 1865484d9bf5
Step 7/7 : CMD     /usr/sbin/sshd -D
 ---> Running in 9647aa30dd56
Removing intermediate container 9647aa30dd56
 ---> d918b7bb73d8
Successfully built d918b7bb73d8
Successfully tagged tinywan/ubuntu:14.04
複製程式碼

引數說明:

  • -t :指定要建立的目標映象名

  • . :Dockerfile 檔案所在目錄,可以指定Dockerfile 的絕對路徑

使用docker images 檢視建立的映象已經在列表中存在,映象ID為d918b7bb73d8

複製程式碼
[email protected]:/home/www/docker# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tinywan/ubuntu      14.04               d918b7bb73d8        45 seconds ago      221MB
tinywan/ubuntu      v2                  344de7f9ce0f        About an hour ago   137MB
hello-world         latest              f2a91732366c        2 weeks ago         1.85kB
ubuntu              16.04               20c44cd7596f        2 weeks ago         123MB
ubuntu              14.04               d6ed29ffda6b        2 weeks ago         221MB
ubuntu              15.10               9b9cb95443b5        16 months ago       137MB
training/webapp     latest              6fae60ef3446        2 years ago         349MB
複製程式碼

錯誤????

chpasswd: (user tinywan) pam_chauthtok() failed, error:
Authentication token manipulation error

我們可以使用新的映象來建立容器

複製程式碼
[email protected]:/home/www/docker# docker run -t -i tinywan/ubuntu:14.04  /bin/bash
[email protected]:/# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l

[email protected]:/# id tinywan
uid=1000(tinywan) gid=1000(tinywan) groups=1000(tinywan)
[email protected]:/# 
複製程式碼

從上面看到新映象已經包含我們建立的使用者tinywan

設定映象標籤

我們可以使用 docker tag 命令,為映象新增一個新的標籤。

複製程式碼
[email protected]:/home/www/docker# docker tag d918b7bb73d8 tinywan/ubuntu:develop
[email protected]:/home/www/docker# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tinywan/ubuntu      14.04               d918b7bb73d8        5 minutes ago       221MB
tinywan/ubuntu      develop             d918b7bb73d8        5 minutes ago       221MB
tinywan/ubuntu      v2                  344de7f9ce0f        About an hour ago   137MB
hello-world         latest              f2a91732366c        2 weeks ago         1.85kB
ubuntu              16.04               20c44cd7596f        2 weeks ago         123MB
ubuntu              14.04               d6ed29ffda6b        2 weeks ago         221MB
ubuntu              15.10               9b9cb95443b5        16 months ago       137MB
training/webapp     latest              6fae60ef3446        2 years ago         349MB
複製程式碼

docker tag 映象ID,這裡是 d918b7bb73d8 ,使用者名稱稱、映象源名(repository name)和新的標籤名(tag)。

使用 docker images 命令可以看到,ID為d918b7bb73d8的映象多一個標籤。

當執行容器時,使用的映象如果在本地中不存在,docker 就會自動從 docker 映象倉庫中下載,預設是從 Docker Hub 公共映象源下載。

下面我們來學習:

  • 1、管理和使用本地 Docker 主機映象
  • 2、建立映象

一、列出映象列表

可以使用 docker images 來列出本地主機上的映象。

[email protected]:~# docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              f2a91732366c        2 weeks ago         1.85kB
ubuntu              15.10               9b9cb95443b5        16 months ago       137MB
training/webapp     latest              6fae60ef3446        2 years ago         349MB

各個選項說明:

  • REPOSITORY:表示映象的倉庫源

  • TAG:映象的標籤

  • IMAGE ID:映象ID

  • CREATED:映象建立時間

  • SIZE:映象大小

說明:同一倉庫源可以有多個 TAG,代表這個倉庫源的不同個版本,如ubuntu倉庫源裡,有15.10、14.04等多個不同的版本,我們使用 REPOSITORY:TAG 來定義不同的映象。

所以,如果要使用版本為15.10的ubuntu系統映象來執行容器時,命令如下:

[email protected]:~# docker run -t -i ubuntu:15.10 /bin/bash 
[email protected]:/# cat /etc/issue
Ubuntu 15.10 \n \l

如果要使用版本為16.04的ubuntu系統映象來執行容器時,命令如下:

[email protected]:~# docker run -t -i ubuntu:16.04 /bin/bash
[email protected]:/# cat /etc/issue
Ubuntu 16.04.3 LTS \n \l

注意:如果你不指定一個映象的版本標籤,例如你只使用 ubuntu,docker 將預設使用 ubuntu:latest 映象。

二、獲取一個新的映象

當我們在本地主機上使用一個不存在的映象時 Docker 就會自動下載這個映象。如果我們想預先下載這個映象,我們可以使用 docker pull 命令來下載它。

下載完成後,我們可以直接使用這個映象來執行容器。

docker run -t -i ubuntu:13.10 /bin/bash

三、查詢映象

我們可以從 Docker Hub 網站來搜尋映象,Docker Hub 網址為: https://hub.docker.com/

我們也可以使用 docker search 命令來搜尋映象。比如我們需要一個httpd的映象來作為我們的web服務。我們可以通過 docker search 命令搜尋 httpd 來尋找適合我們的映象。

複製程式碼
[email protected]:~# docker search httpd
NAME                                DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
httpd                               The Apache HTTP Server Project                  1367                [OK]                
hypriot/rpi-busybox-httpd           Raspberry Pi compatible Docker Image with a …   39                                      
centos/httpd                                                                        15                                      [OK]
armhf/httpd                         The Apache HTTP Server Project                  8                                       
centos/httpd-24-centos7             Platform for running Apache httpd 2.4 or bui…   5                                       
macadmins/netboot-httpd             use in combination with bruienne/bsdpy          4                                       [OK]
lolhens/httpd                       Apache httpd 2 Server                           2                                       [OK]
salim1983hoop/httpd24               Dockerfile running apache config                2                                       [OK]
rgielen/httpd-image-php5            Docker image for Apache httpd with PHP 5 bas…   1                                       [OK]
rgielen/httpd-image-simple          Docker image for simple Apache httpd based o…   1                                       [OK]
lead4good/httpd-fpm                 httpd server which connects via fcgi proxy h…   1                                       [OK]
antoineco/httpd-mod_cluster         Apache HTTP Server with JBoss mod_cluster       1                                       [OK]
dockerpinata/httpd                                                                  0                                       
trollin/httpd                                                                       0                                       
tplatform/aws-linux-httpd24-php70   aws-linux-httpd24-php70                         0                                       [OK]
manasip/httpd                                                                       0                                       
jbpt/httpd                                                                          0                                       [OK]
antoineco/httpd                     Extra OS variants for the official HTTPd ima…   0                                       [OK]
ppc64le/httpd                       The Apache HTTP Server Project                  0                                       
publici/httpd                       httpd:latest                                    0                                       [OK]
efrecon/httpd                       A micro-sized httpd. Start serving files in0                                       [OK]
sbutler/pie-httpd                   PIE httpd server                                0                                       
camptocamp/os-wp-httpd              Wordpress httpd                                 0                                       [OK]
openbucks/httpd                                                                     0                                       
manageiq/httpd                      Container with httpd, built on CentOS for Ma…   0                                       [OK]
複製程式碼

NAME:映象倉庫源的名稱

DESCRIPTION:映象的描述

OFFICIAL:是否docker官方釋出

四、拖取映象

我們決定使用上圖中的httpd 官方版本的映象,使用命令 docker pull 來下載映象。

 

下載完成後,我們就可以使用這個映象了

docker run httpd

五、建立映象

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

  1. 從已經建立的容器中更新映象,並且提交這個映象
  2. 使用 Dockerfile 指令來建立一個新的映象

六、更新映象

更新映象之前,我們需要使用映象來建立一個容器。(建立容器必須先進入映象啊!)

[email protected]:~# docker run -t -i ubuntu:15.10 /bin/bash
[email protected]:/# 

在執行的容器內使用 apt-get update 命令進行更新。

在完成操作之後,輸入 exit命令來退出這個容器。

此時ID為4301b57638b7的容器,是按我們的需求更改的容器。我們可以通過命令 docker commit來提交容器副本。

[email protected]:~# docker commit -m="has update" -a="Tinywan" 4301b57638b7 Tinywan/ubuntu:v2
sha256:680b98860b7d1b338df06947ddb89df0243b2d51af414955a6a85d3cd35e1984

各個引數說明:

  • -m:提交的描述資訊

  • -a:指定映象作者

  • e218edb10161:容器ID

  • Tinywan/ubuntu:v2:指定要建立的目標映象名

 我們可以使用 docker images 命令來檢視我們的新映象 runoob/ubuntu:v2:

複製程式碼
[email protected]:~# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
tinywan/ubuntu      v2                  344de7f9ce0f        11 seconds ago       137MB
hello-world         latest              f2a91732366c        2 weeks ago          1.85kB
ubuntu              16.04               20c44cd7596f        2 weeks ago          123MB
ubuntu              15.10               9b9cb95443b5        16 months ago        137MB
training/webapp     latest              6fae60ef3446        2 years ago          349MB
複製程式碼

使用我們的新映象 runoob/ubuntu 來啟動一個容器

[email protected]:~# docker run -t -i tinywan/ubuntu:v2 /bin/bash
[email protected]:/# cat /etc/issue
Ubuntu 15.10 \n \l

構建映象

我們使用命令 docker build , 從零開始來建立一個新的映象。為此,我們需要建立一個 Dockerfile 檔案,其中包含一組指令來告訴 Docker 如何構建我們的映象。

複製程式碼
[email protected]:/home/www/docker# cat Dockerfile 
FROM    ubuntu:14.04
MAINTAINER      Fisher "[email protected]"

RUN     /bin/echo 'tinywan:123456' |chpasswd
RUN     useradd tinywan
RUN     /bin/echo 'tinywan:123456' |chpasswd
RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
EXPOSE  22
EXPOSE  80
CMD     /usr/sbin/sshd -D
複製程式碼

每一個指令都會在映象上建立一個新的層,每一個指令的字首都必須是大寫的。

  • FROM:指定使用哪個映象源(基於哪個映象)
  • MAINTAINER : 映象建立者
  • RUN:指令告訴 docker 在映象內執行命令,安裝了什麼...(安裝軟體用)
  • CMD:container(容器)啟動時執行的命令,但是一個Dockerfile中只能有一條CMD命令,多條則只執行最後一條CMD

然後,我們使用 Dockerfile 檔案,通過 docker build 命令來構建一個映象:

複製程式碼
[email protected]:/home/www/docker# docker build -t tinywan/ubuntu:14.04 .
Sending build context to Docker daemon  2.048kB
Step 1/7 : FROM    ubuntu:14.04
 ---> d6ed29ffda6b
Step 2/7 : MAINTAINER      Fisher "[email protected]"
 ---> Using cache
 ---> 89d1dd5723ac
Step 3/7 : RUN     useradd tinywan
 ---> Running in 2241d8c9a59e
Removing intermediate container 2241d8c9a59e
 ---> 7d64f7cf63e7
Step 4/7 : RUN     /bin/echo -e "LANG=\"en_US.UTF-8\"" >/etc/default/local
 ---> Running in d90a9513959f
Removing intermediate container d90a9513959f
 ---> bd375fb5a38c
Step 5/7 : EXPOSE  22
 ---> Running in 2bca5bbc5e32
Removing intermediate container 2bca5bbc5e32
 ---> 1566f7bdb2ac
Step 6/7 : EXPOSE  80
 ---> Running in 15819d4ecc8f
Removing intermediate container 15819d4ecc8f
 ---> 1865484d9bf5
Step 7/7 : CMD     /usr/sbin/sshd -D
 ---> Running in 9647aa30dd56
Removing intermediate container 9647aa30dd56
 ---> d918b7bb73d8
Successfully built d918b7bb73d8
Successfully tagged tinywan/ubuntu:14.04
複製程式碼

引數說明:

  • -t :指定要建立的目標映象名

  • . :Dockerfile 檔案所在目錄,可以指定Dockerfile 的絕對路徑

使用docker images 檢視建立的映象已經在列表中存在,映象ID為d918b7bb73d8

複製程式碼
[email protected]:/home/www/docker# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tinywan/ubuntu      14.04               d918b7bb73d8        45 seconds ago      221MB
tinywan/ubuntu      v2                  344de7f9ce0f        About an hour ago   137MB
hello-world         latest              f2a91732366c        2 weeks ago         1.85kB
ubuntu              16.04               20c44cd7596f        2 weeks ago         123MB
ubuntu              14.04               d6ed29ffda6b        2 weeks ago         221MB
ubuntu              15.10               9b9cb95443b5        16 months ago       137MB
training/webapp     latest              6fae60ef3446        2 years ago         349MB
複製程式碼

錯誤????

chpasswd: (user tinywan) pam_chauthtok() failed, error:
Authentication token manipulation error

我們可以使用新的映象來建立容器

複製程式碼
[email protected]:/home/www/docker# docker run -t -i tinywan/ubuntu:14.04  /bin/bash
[email protected]:/# cat /etc/issue
Ubuntu 14.04.5 LTS \n \l

[email protected]:/# id tinywan
uid=1000(tinywan) gid=1000(tinywan) groups=1000(tinywan)
[email protected]:/# 
複製程式碼

從上面看到新映象已經包含我們建立的使用者tinywan

設定映象標籤

我們可以使用 docker tag 命令,為映象新增一個新的標籤。

複製程式碼
[email protected]:/home/www/docker# docker tag d918b7bb73d8 tinywan/ubuntu:develop
[email protected]:/home/www/docker# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
tinywan/ubuntu      14.04               d918b7bb73d8        5 minutes ago       221MB
tinywan/ubuntu      develop             d918b7bb73d8        5 minutes ago       221MB
tinywan/ubuntu      v2                  344de7f9ce0f        About an hour ago   137MB
hello-world         latest              f2a91732366c        2 weeks ago         1.85kB
ubuntu              16.04               20c44cd7596f        2 weeks ago         123MB
ubuntu              14.04               d6ed29ffda6b        2 weeks ago         221MB
ubuntu              15.10               9b9cb95443b5        16 months ago       137MB
training/webapp     latest              6fae60ef3446        2 years ago         349MB
複製程式碼

docker tag 映象ID,這裡是 d918b7bb73d8 ,使用者名稱稱、映象源名(repository name)和新的標籤名(tag)。

使用 docker images 命令可以看到,ID為d918b7bb73d8的映象多一個標籤。