Docker鏡像管理基礎

Docker鏡像管理基礎

1、鏡像的概念

鏡像可以理解為應用程式的集裝箱,而docker用來裝卸集裝箱。

docker鏡像含有啟動容器所需要的文件系統及其內容,因此,其用於創建並啟動容器。

docker鏡像採用分層構建機制,最底層為bootfs,其上為rootfs

  • bootfs:用於系統引導的文件系統,包括bootloader和kernel,容器啟動完成後會被卸載以節約記憶體資源
  • rootfs:位於bootfs之上,表現為docker容器的根文件系統
    • 傳統模式中,系統啟動之時,內核掛載rootfs會首先將其掛載為「只讀」模式,完整性自檢完成後將其重新掛載為讀寫模式
    • docker中,rootfs由內核掛載為「只讀」模式,而後通過「聯合掛載」技術額外掛載一個「可寫」層

注意:當刪除容器時,這個容器自有的「可寫」層會一起被刪除

2、Docker鏡像層

位於下層的鏡像稱為父鏡像(parrent image),最底層的稱為基礎鏡像(base image);
最上層為「可讀寫」層,其下的均為「只讀」層。

3、Docker存儲驅動

docker提供了多種存儲驅動來實現不同的方式存儲鏡像,下面是常用的幾種存儲驅動:

  • AUFS
  • OverlayFS
  • Devicemapper
  • Btrfs
  • VFS

3.1 AUFS

AUFS(AnotherUnionFS)是一種Union FS,是文件級的存儲驅動。AUFS能透明覆蓋一或多個現有文件系統的層狀文件系統,把多層合併成文件系統的單層表示。簡單來說就是支援將不同目錄掛載到同一個虛擬文件系統下的文件系統。這種文件系統可以一層一層地疊加修改文件。無論底下有多少層都是只讀的,只有最上層的文件系統是可寫的。當需要修改一個文件時,AUFS創建該文件的一個副本,使用CoW將文件從只讀層複製到可寫層進行修改,結果也保存在可寫層。在Docker中,底下的只讀層就是image,可寫層就是Container。結構如下圖所示:

3.2 OverlayFS

Overlay是Linux內核3.18後支援的,也是一種Union FS,和AUFS的多層不同的是Overlay只有兩層:一個upper文件系統和一個lower文件系統,分別代表Docker的鏡像層和容器層。當需要修改一個文件時,使用CoW將文件從只讀的lower複製到可寫的upper進行修改,結果也保存在upper層。在Docker中,底下的只讀層就是image,可寫層就是Container。目前最新的OverlayFS為Overlay2。結構如下圖所示:

3.3 Device mapper

Device mapper是Linux內核2.6.9後支援的,提供的一種從邏輯設備到物理設備的映射框架機制,在該機制下,用戶可以很方便的根據自己的需要制定實現存儲資源的管理策略。前面講的AUFS和OverlayFS都是文件級存儲,而Device mapper是塊級存儲,所有的操作都是直接對塊進行操作,而不是文件。Device mapper驅動會先在塊設備上創建一個資源池,然後在資源池上創建一個帶有文件系統的基本設備,所有鏡像都是這個基本設備的快照,而容器則是鏡像的快照。所以在容器里看到文件系統是資源池上基本設備的文件系統的快照,並不有為容器分配空間。當要寫入一個新文件時,在容器的鏡像內為其分配新的塊並寫入數據,這個叫用時分配。當要修改已有文件時,再使用CoW為容器快照分配塊空間,將要修改的數據複製到在容器快照中新的塊里再進行修改。Device mapper 驅動默認會創建一個100G的文件包含鏡像和容器。每一個容器被限制在10G大小的卷內,可以自己配置調整。結構如下圖所示:

4、Docker registry

啟動容器時,docker daemon會試圖從本地獲取相關的鏡像,本地鏡像不存在時,其將從Registry中下載該鏡像並保存到本地。

Registry用於保存docker鏡像,包括鏡像的層次結構和元數據。用戶可以自建Registry,亦可使用官方的Docker Hub。

docker registry的分類:

  • Sponsor Registry:第三方的Registry,供客戶和Docker社區使用
  • Mirror Registry:第三方的Registry,只讓客戶使用
  • Vendor Registry:由發布docker鏡像的供應商提供的registry
  • Private Registry:通過設有防火牆和額外的安全層的私有實體提供的registry

docker registry的組成:

  • Repository
    • 由某特定的docker鏡像的所有迭代版本組成的鏡像倉庫
    • 一個Registry中可以存在多個Repository
      • Repository可分為「頂層倉庫」和「用戶倉庫」
      • 用戶倉庫名稱格式為「用戶名/倉庫名」
    • 每個倉庫可包含多個Tag(標籤),每個標籤對應一個鏡像
  • Index
    • 維護用戶帳戶、鏡像的檢驗以及公共命名空間的資訊
    • 相當於為Registry提供了一個完成用戶認證等功能的檢索介面

Docker Registry中的鏡像通常由開發人員製作,而後推送至「公共」或「私有」Registry上保存,供其他人員使用,例如「部署」到生產環境。

5、Docker鏡像的製作

多數情況下,我們做鏡像是基於別人已存在的某個基礎鏡像來實現的,我們把它稱為base image。 比如一個純凈版的最小化的centos、ubuntu或debian。

那麼這個最小化的centos鏡像從何而來呢? 其實這個基礎鏡像一般是由Docker Hub的相關維護人員,也就是Docker官方手動製作的。 這個基礎鏡像的製作對於Docker官方的專業人員來說是非常容易的,但對於終端用戶來說就不是那麼容易製作的了。

5.1 Docker Hub

Docker Hub 是一項基於雲的註冊表服務,允許您鏈接到程式碼存儲庫、構建映像並對其進行測試、存儲手動推送的映像以及指向 Docker Cloud 的鏈接,以便將映像部署到主機。

它為容器映像發現、分發和更改管理、用戶和團隊協作以及整個開發管道中的工作流自動化提供了集中式資源。

Docker Hub 提供以下主要功能:

  • 影像存儲庫
    • 從社區和官方庫中查找和提取映像,以及管理、推送到您有權訪問的私有映像庫以及從中拉取映像庫。
  • 自動構建
    • 在對源程式碼存儲庫進行更改時自動創建新映像。
  • 網路鉤子
    • Webhooks 是自動構建的一項功能,可讓您在成功推送到存儲庫後觸發操作。
  • 組織
    • 創建工作組以管理對映像存儲庫的訪問。
  • GitHub 和 Bitbucket 集成
    • 將中心和 Docker 映像添加到當前工作流。

5.2 Docker鏡像的獲取

要從遠程註冊表(例如您自己的 Docker 註冊表)獲取 Docker 映像並將其添加到本地系統,請使用 docker pull 命令:

# docker pull <registry>[:<port>]/[<namespace>/]<name>:<tag>

是一個在 TCP 上提供 docker 分發服務的主機(默認值:5000)

一起 識別由 註冊表控制的特定映像

  • 一些註冊表也支援原始;對於這些, 是可選的
  • 但是,當它被包括在內時,提供的附加層次結構級別對於區分具有相同影像是有用的

層次結構的附加層次

命名域 示例(<命名空間>/<名稱>)
組織(organization) redhat/kubernetes, google/kubernetes
用戶(username) Alice/application, bob/application
角色(role) 開發/資料庫,測試/資料庫,生產/資料庫

5.3鏡像的生成

鏡像的生成途徑:

  • Dockerfile
  • 基於容器製作
  • Docker Hub 自動構建

5.4基於容器製作鏡像

根據容器的更改創建新映像

用法:

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
選項 默認值 說明
—author, -a 作者(例如,「約翰·漢尼拔·史密斯[email protected]“)
-c, –change list 對創建的映像應用Dockerfile指令
-m, –message string 提交消息
-p, –pause true 提交期間暫停容器

準備工作:安裝啟動docker並配置加速器(詳情見Docker基礎用法

# 使用pull命令拉網上的busybox鏡像
[root@localhost ~]# docker pull busybox
Using default tag: latest
latest: Pulling from library/busybox
50783e0dfb64: Pull complete 
Digest: sha256:ef320ff10026a50cf5f0213d35537ce0041ac1d96e9b7800bafd8bc9eff6c693
Status: Downloaded newer image for busybox:latest
docker.io/library/busybox:latest
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED      SIZE
busybox      latest    7a80323521cc   6 days ago   1.24MB

# 使用鏡像busybox創建並運行一個名叫bus1容器並使用交互模式進去編輯,創建一個index.html文件
[root@localhost ~]# docker run -it --name bus1 busybox
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # mkdir /data
/ # echo 'hellow world' > /data/index.html
/ # cat /data/index.html 
hellow world

# 創建鏡像的時候不能關閉容器,必須使其處於運行狀態,所以我們必須要另起一個終端
[root@localhost ~]# docker commit -a "[email protected]" -p -m "first commit" bus1
sha256:c476706b4b674189c8c47342398195108dfab017006d0351b31196f2d83aed47
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED       SIZE
<none>       <none>    c476706b4b67   8 seconds ago   1.24MB
busybox      latest    beae173ccac6   7 months ago    1.24MB

# 替換資訊,名稱為web,版本為v1
[root@localhost ~]# docker tag c476706b4b67 web:v1
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED        SIZE
web        v1        c476706b4b67   44 seconds ago   1.24MB
busybox      latest    beae173ccac6   7 months ago     1.24MB

# 複製web鏡像,名稱為483607723,版本為v2
[root@localhost ~]# docker tag web:v1 483607723/web:v2
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
483607723/web    v2        c476706b4b67   About a minute ago   1.24MB
web           v1        c476706b4b67   About a minute ago   1.24MB
busybox        latest    beae173ccac6   7 months ago         1.24MB

打開Docker官網(Home – Docker)右上角Sign in。

在首頁選擇Create a Repository

輸入倉庫名稱web,然後點擊Create

這裡有上傳方法

# 登陸我們dockerhub帳號
[root@localhost ~]# docker login
Login with your Docker ID to push and pull images from Docker Hub. If you don't have a Docker ID, head over to //hub.docker.com to create one.
Username: 483607723
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
//docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 上傳剛才修改的鏡像webv2
[root@localhost ~]# docker push 483607723/web:v2
The push refers to repository [docker.io/483607723/web]
af1fc705554b: Pushed 
01fd6df81c8e: Mounted from library/busybox 
v2: digest: sha256:e7ffae293a2b4ad19dcbd821198769af4b7abde789ec2109af6f71628e7ef730 size: 734

上傳成功

# 刪除剛剛上傳的鏡像web:v2
[root@localhost ~]# docker rmi -f 483607723/web:v2 
Untagged: 483607723/web:v2
Untagged: 483607723/web@sha256:e7ffae293a2b4ad19dcbd821198769af4b7abde789ec2109af6f71628e7ef730
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
web          v1        c476706b4b67   12 minutes ago   1.24MB
busybox      latest    beae173ccac6   7 months ago     1.24MB

# 在網上下載我們剛上傳的鏡像web:v2
[root@localhost ~]# docker pull 483607723/web:v2
v2: Pulling from 483607723/web
Digest: sha256:e7ffae293a2b4ad19dcbd821198769af4b7abde789ec2109af6f71628e7ef730
Status: Downloaded newer image for 483607723/web:v2
docker.io/483607723/web:v2
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
483607723/web     v2        c476706b4b67   14 minutes ago   1.24MB
web            v1        c476706b4b67   14 minutes ago   1.24MB
busybox         latest    beae173ccac6   7 months ago     1.24MB

# 查看裡面的內容是否一樣,rm可以在退出鏡像後自動刪除容器
[root@localhost ~]# docker run -it --rm 483607723/web:v2 
/ # ls
bin   data  dev   etc   home  proc  root  sys   tmp   usr   var
/ # ls /data/
index.html
/ # cat /data/index.html 
hello world
/ # exit
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE     COMMAND   CREATED          STATUS          PORTS     NAMES

由此可見,新生成的鏡像中是包含了新增的內容的,但是此時有一個問題,那就是容器默認要啟動的進程是什麼?在這裡,默認情況下是啟動的sh進程,但我們是要啟動一個http站點,所以我們要在創建鏡像時將容器默認啟動的進程設為httpd,這樣一來我們就可以通過新生成的鏡像來快速構建一個簡單的http站點了。

5.5快速構建一個簡單的http站點

# 使用交互模式臨時進入web:v2
[root@localhost ~]# docker run -it --rm 483607723/web:v2

(另起一個終端)
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE          COMMAND   CREATED          STATUS       PORTS     NAMES
2a77d42276da   483607723/web:v2   "sh"      37 seconds ago   Up 36 seconds          agitated_turing

# 把鏡像web:v2的啟動進程修改為httpd,另存為web:v3
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS     NAMES
baa76767998e   483607723/web:v3   "/bin/httpd -f -h /d…"   49 seconds ago   Up 48 seconds             gifted_sinoussi
(-a是作者資訊,-c為修改默認啟動命令,/bin/httpd為啟動進程,-f是不讓它在後台運行,-c修改默認啟動命令,-h指定目錄)
[root@localhost ~]# docker commit -a "[email protected]" -c 'CMD ["/bin/httpd","-f","-h","/data"]' -p 2a77d42276da 483607723/web:v3
sha256:886b2b24d0bf1c9b2bc19a17b88d9cae4817fe334d704ab3069a6643b7d2e8d7
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
483607723/web   v3        886b2b24d0bf   6 seconds ago    1.24MB
483607723/web   v2        c476706b4b67   26 minutes ago   1.24MB
web             v1        c476706b4b67   26 minutes ago   1.24MB
busybox         latest    beae173ccac6   7 months ago     1.24MB

# 上傳鏡像web:v3
[root@localhost ~]# docker push 483607723/web:v3 
The push refers to repository [docker.io/483607723/web]
af1fc705554b: Layer already exists 
01fd6df81c8e: Layer already exists 
v3: digest: sha256:c7c0f6d6bdfba9a744a04a8f807ce33a19bdcbb96d428ce09bbd92ed20f47afc size: 734

# 使用交互模式臨時進入web:v3
[root@localhost ~]# docker run -it --rm 483607723/web:v3

(另起一個終端)
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE              COMMAND                  CREATED          STATUS          PORTS     NAMES
baa76767998e   483607723/web:v3   "/bin/httpd -f -h /d…"   49 seconds ago   Up 48 seconds             gifted_sinoussi

# 使用inspect命令查看它的IP地址
[root@localhost ~]# docker inspect baa76767998e
......
"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "3c24f137381af6bee978bf7087e142784d622cf7ef9271be5528048d4263be96",
                    "EndpointID": "84f33913c45e60c599a15b1bf6237c51ab368f5320ac4c5833569b09681a7605",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
......

# 訪問這個IP地址,測試是否成功構成站點
[root@localhost ~]# curl 172.17.0.3
hello world

6、鏡像的導入與導出

假如有2台主機,我們在主機1上做了一個鏡像,主機2想用這個鏡像怎麼辦呢?

我們可以在主機1上push鏡像到鏡像倉庫中,然後在主機2上pull把鏡像拉下來使用,這種方式就顯得比較麻煩,假如我只是測試用的,在一台主機上做好鏡像後在另一台主機上跑一下就行了,沒必要推到倉庫上然後又把它拉到本地來。

此時我們可以在已有鏡像的基礎上把鏡像打包成一個壓縮文件,然後拷貝到另一台主機上將其導入,這就是鏡像的導入和導出功能。

docker中我們使用docker save進行導出,使用docker load進行導入。

[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
483607723/web   v3        886b2b24d0bf   10 minutes ago   1.24MB
483607723/web   v2        c476706b4b67   36 minutes ago   1.24MB
web             v1        c476706b4b67   36 minutes ago   1.24MB
busybox         latest    beae173ccac6   7 months ago     1.24MB

# 用save命令保存所有本地的鏡像,導出到web.tar.gz中(不指定版本的話為所有版本)
[root@localhost ~]# docker save -o web.tar.gz 483607723/web
[root@localhost ~]# ls
anaconda-ks.cfg  web.tar.gz
[root@localhost ~]# file web.tar.gz 
web.tar.gz: POSIX tar archive

# 刪除保存的2個鏡像(模擬新的主機)
[root@localhost ~]# docker rmi 483607723/web:v2 483607723/web:v3 
[root@localhost ~]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
web          v1        c476706b4b67   39 minutes ago   1.24MB
busybox      latest    beae173ccac6   7 months ago     1.24MB

# 用load導入web.tar,恢復兩個web鏡像
[root@localhost ~]# docker load -i web.tar.gz 
Loaded image: 483607723/web:v2
Loaded image: 483607723/web:v3
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED          SIZE
483607723/web   v3        886b2b24d0bf   14 minutes ago   1.24MB
web             v1        c476706b4b67   41 minutes ago   1.24MB
483607723/web   v2        c476706b4b67   41 minutes ago   1.24MB
busybox         latest    beae173ccac6   7 months ago     1.24MB

作業練習

在Docker Hub上獲取一個centos基礎鏡像並創建容器,然後在容器里源碼安裝httpd服務,並將該容器重新製作成鏡像,並上傳到Docker Hub

# 使用pull命令拉網上的centos鏡像
[root@localhost ~]# docker pull centos
Using default tag: latest
latest: Pulling from library/centos
a1d0c7532777: Pull complete 
Digest: sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Status: Downloaded newer image for centos:latest
docker.io/library/centos:latest
[root@localhost ~]# docker images
REPOSITORY      TAG       IMAGE ID       CREATED         SIZE
483607723/web   v3        886b2b24d0bf   2 hours ago     1.24MB
483607723/web   v2        c476706b4b67   2 hours ago     1.24MB
web             v1        c476706b4b67   2 hours ago     1.24MB
busybox         latest    beae173ccac6   7 months ago    1.24MB
centos          latest    5d0da3dc9764   10 months ago   231MB

# 使用鏡像centos創建並運行一個名叫centos1容器
[root@localhost ~]# docker run -it --name centos1 centos /bin/bash
[root@2f0c1da981f3 /]# ls
bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

# 在容器centos1中配置yum源
[root@2f0c1da981f3 /]# rm -rf /etc/yum.repos.d/*
[root@2f0c1da981f3 /]# curl -o /etc/yum.repos.d/CentOS-Base.repo //mirrors.aliyun.com/repo/Centos-vault-8.5.2111.repo
[root@2f0c1da981f3 /]# sed -i -e '/mirrors.cloud.aliyuncs.com/d' -e '/mirrors.aliyuncs.com/d' /etc/yum.repos.d/CentOS-Base.repo
[root@2f0c1da981f3 /]# yum install -y //mirrors.aliyun.com/epel/epel-release-latest-8.noarch.rpm
[root@2f0c1da981f3 /]# sed -i 's|^#baseurl=//download.example/pub|baseurl=//mirrors.aliyun.com|' /etc/yum.repos.d/epel*[root@2f0c1da981f3 /]# sed -i 's|^metalink|#metalink|' /etc/yum.repos.d/epel*

# 開發工具準備
[root@2f0c1da981f3 /]# dnf groups mark install -y "Development Tools"

# 創建apache服務的用戶和組
[root@2f0c1da981f3 /]# useradd -r -M -s /sbin/nologin apache
[root@2f0c1da981f3 /]# id apache
uid=998(apache) gid=996(apache) groups=996(apache)

# 安裝依賴包
[root@2f0c1da981f3 /]#  yum -y install openssl-devel pcre-devel expat-devel libtool gcc gcc-c++

# 下載apr、apr-util、httpd安裝包至/usr/src/下
[root@2f0c1da981f3 /]# cd /usr/src/
[root@2f0c1da981f3 src]# wget //downloads.apache.org/apr/apr-1.6.5.tar.bz2
[root@2f0c1da981f3 src]# wget //downloads.apache.org/apr/apr-util-1.6.1.tar.bz2
[root@2f0c1da981f3 src]# wget //downloads.apache.org/httpd/httpd-2.4.54.tar.bz2
[root@2f0c1da981f3 src]# ls
apr-1.6.5.tar.bz2  apr-util-1.6.1.tar.bz2  debug  httpd-2.4.54.tar.bz2	kernels

# 解壓和安裝apr
[root@2f0c1da981f3 src]# tar -xf apr-1.6.5.tar.bz2 
[root@2f0c1da981f3 src]# ls
apr-1.6.5  apr-1.6.5.tar.bz2  apr-util-1.6.1.tar.bz2  debug  httpd-2.4.54.tar.bz2  kernels
[root@2f0c1da981f3 src]# cd apr-1.6.5
[root@2f0c1da981f3 apr-1.6.5]# vim configure
 cfgfile="${ofile}T"
    trap "$RM \"$cfgfile\"; exit 1" 1 2 15
    # $RM "$cfgfile"        //將此行加上注釋,或者刪除此行
    
[root@2f0c1da981f3 apr-1.6.5]# ./configure --prefix=/usr/local/apr
配置過程略...
[root@2f0c1da981f3 apr-1.6.5]#make && make install
配置過程略...

# 解壓和安裝apr-util
[root@2f0c1da981f3 src]# tar -xf apr-util-1.6.1.tar.bz2 
[root@2f0c1da981f3 src]# cd apr-util-1.6.1
[root@2f0c1da981f3 apr-util-1.6.1]# ./configure --prefix=/usr/local/apr-util --with-apr=/usr/local/apr
配置過程略...
[root@2f0c1da981f3 apr-util-1.6.1]#  make && make install
配置過程略...

# 編譯安裝httpd
[root@2f0c1da981f3 httpd-2.4.54]# ./configure --prefix=/usr/local/apache --enable-so --enable-ssl --enable-cgi --enable-rewrite --with-zlib --with-pcre --with-apr=/usr/local/apr --with-apr-util=/usr/local/apr-util/ --enable-modules=most --enable-mpms-shared=all --with-mpm=prefork
[root@2f0c1da981f3 httpd-2.4.54]# make && make install

# 編輯apache啟動腳本
[root@2f0c1da981f3 /]# vim httpd.sh
#!/bin/bash
/usr/local/apache/bin/apachectl
sleep 5d
[root@2f0c1da981f3 /]# chmod +x httpd.sh 		#給腳本執行許可權
[root@2f0c1da981f3 /]# ls -l | grep httpd.sh
-rwxr-xr-x. 1 root root   53 Aug  6 15:56 httpd.sh

(另起一個終端)
# 基於容器centos1製作鏡像
[root@localhost ~]# docker commit -a 'zsl <[email protected]>' -c 'CMD ["/httpd.sh"]' -p centos1 483607723/centos-httpd:v1
sha256:ca1d47fbafabae0791a9ce96c4052a90522c734ff1a434fa9e2d21a642de0a4d
[root@localhost ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
483607723/centos-httpd   v1        ca1d47fbafab   18 seconds ago   776MB
centos                   latest    5d0da3dc9764   10 months ago    231MB

# 用新生成的鏡像創建容器
[root@localhost ~]# docker run -d -it --name web1 483607723/centos-httpd:v1 
50efb3b77296224ec572ded4c65a349abb726e90d6af26e8d431c64b75984a78
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                       COMMAND       CREATED         STATUS         PORTS     NAMES
50efb3b77296   483607723/centos-httpd:v1   "/httpd.sh"   9 seconds ago   Up 7 seconds             web1
2f0c1da981f3   centos                      "/bin/bash"   3 hours ago     Up 3 hours               centos1
[root@localhost ~]# docker inspect web1
......
"Networks": {
                "bridge": {
                    "IPAMConfig": null,
                    "Links": null,
                    "Aliases": null,
                    "NetworkID": "3c24f137381af6bee978bf7087e142784d622cf7ef9271be5528048d4263be96",
                    "EndpointID": "6611f8535de660d6f74efb36925faf3ff02153283e4f417abad5cd2d8005db3a",
                    "Gateway": "172.17.0.1",
                    "IPAddress": "172.17.0.3",
                    "IPPrefixLen": 16,
                    "IPv6Gateway": "",
                    "GlobalIPv6Address": "",
                    "GlobalIPv6PrefixLen": 0,
                    "MacAddress": "02:42:ac:11:00:03",
                    "DriverOpts": null
                }
......
[root@localhost ~]# curl 172.17.0.3
<html><body><h1>It works!</h1></body></html>

# 配置埠映射
[root@localhost ~]# docker run -d -it --name web2 -p 8080:80 483607723/centos-httpd:v1 
fd7563facbe81ad04343cfb6488ade3781cbe87d5510002edef00c7e3581f54c
[root@localhost ~]# docker ps
CONTAINER ID   IMAGE                       COMMAND       CREATED          STATUS          PORTS                                   NAMES
fd7563facbe8   483607723/centos-httpd:v1   "/httpd.sh"   12 seconds ago   Up 11 seconds   0.0.0.0:8080->80/tcp, :::8080->80/tcp   web2
50efb3b77296   483607723/centos-httpd:v1   "/httpd.sh"   6 minutes ago    Up 6 minutes                                            web1
2f0c1da981f3   centos                      "/bin/bash"   3 hours ago      Up 3 hours                                              centos1
[root@localhost ~]# ss -anlt | grep 80
LISTEN 0      128          0.0.0.0:8080      0.0.0.0:*          
LISTEN 0      128             [::]:8080         [::]:*     

# 

進入Docker Hub創建倉庫

# 登陸我們dockerhub帳號
[root@localhost ~]# docker login
Authenticating with existing credentials...
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
//docs.docker.com/engine/reference/commandline/login/#credentials-store

Login Succeeded

# 修改上傳鏡像的名稱
[root@localhost ~]# docker tag 483607723/centos-httpd:v1 483607723/httpd:v1
[root@localhost ~]# docker images
REPOSITORY               TAG       IMAGE ID       CREATED          SIZE
483607723/centos-httpd   v1        ca1d47fbafab   38 minutes ago   776MB
483607723/httpd          v1        ca1d47fbafab   38 minutes ago   776MB
centos                   latest    5d0da3dc9764   10 months ago    231MB

# 使用push命令將鏡像上傳
[root@localhost ~]# docker push 483607723/httpd:v1 
The push refers to repository [docker.io/483607723/httpd]
c76332ad693c: Mounted from 483607723/centos-httpd 
74ddd0ec08fa: Mounted from 483607723/centos-httpd 
v1: digest: sha256:43698f0ad872c35669c61feb19f3568b25a7ef4c9271518c945f0b3cc68f9800 size: 742

上傳成功

Tags: