網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
1. 鏡像簡(jiǎn)介
Docker 鏡像(Image)是用于創(chuàng)建 Docker 容器的模板。Docker 鏡像相當(dāng)于一個(gè) root 文件系統(tǒng),比如官方鏡像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系統(tǒng)的 root 文件系統(tǒng)。在實(shí)際使用中,它包含運(yùn)行某個(gè)軟件所需的所有內(nèi)容,我們把應(yīng)用程序和配置依賴打包好形成一個(gè)可交付的運(yùn)行環(huán)境(包括代碼、運(yùn)行時(shí)需要的庫(kù)、環(huán)境變量和配置文件等),這個(gè)打包好的運(yùn)行環(huán)境就是image鏡像文件。
鏡像倉(cāng)庫(kù)服務(wù)(Image Registry)包含多個(gè)鏡像倉(cāng)庫(kù)(Image Repository),一個(gè)鏡像倉(cāng)庫(kù)中可以包含多個(gè)鏡像。
對(duì)于用戶來說,鏡像操作一般是指docker的客戶端操作,包括鏡像獲取,創(chuàng)建,修改,運(yùn)行,刪除,搜索,查看等一系列操作。docker最重要的操作命令是docker build,docker pull和docker run。
2. 獲取鏡像
Docker使用鏡像倉(cāng)庫(kù)來集中存放Docker鏡像,如同代碼庫(kù)一樣,我們可以自建私有Registry和使用公用Registry。
通常在倉(cāng)庫(kù)中存放有多個(gè)鏡像,而每個(gè)倉(cāng)庫(kù)可以包含多個(gè)標(biāo)簽(Tag),每個(gè)標(biāo)簽對(duì)應(yīng)著一個(gè)鏡像。我們可以通過<倉(cāng)庫(kù)名>:<標(biāo)簽>的格式來指定具體是哪個(gè)軟件哪個(gè)版本的鏡像,如果不給出標(biāo)簽,將以 Latest 作為默認(rèn)標(biāo)簽。
通過docker pull命令可以從倉(cāng)庫(kù)下載鏡像,其完整格式為:
docker pull [OPTIONS] NAME[:TAG]
OPTIONS:
-a:–all-tags=true|false: 是否獲取倉(cāng)庫(kù)中的所有鏡像,默認(rèn)為否
–disable-content-trust:忽略鏡像的校驗(yàn),默認(rèn)開啟
NAME:鏡像倉(cāng)庫(kù)名(用來區(qū)分鏡像)
TAG:鏡像標(biāo)簽(通常表示軟件版本信息)
對(duì)于Docker鏡像來說, 如果不顯式指定TAG, 則默認(rèn)會(huì)選擇latest標(biāo)簽,此時(shí)會(huì)下載倉(cāng)庫(kù)中最新版本的鏡像。
一般來說, 鏡像的latest 標(biāo)簽意味著該鏡像的內(nèi)容會(huì)跟蹤最新版本的變更而變化, 內(nèi)容是不穩(wěn)定的。因此,如果需要從穩(wěn)定性上考慮,則不要在生產(chǎn)環(huán)境中忽略鏡像的TAG使用默認(rèn)的latest 來標(biāo)記鏡像。
可以直接從官方Docker Hub 鏡像源來下載鏡像,例如:
$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
58690f9b18fc: Pull complete
b51569e7c507: Pull complete
da8ef40b9eca: Pull complete
fb15d46c38dc: Pull complete
Digest: sha256:0f71fa8d4d2d4292c3c617fda2b36f6dabe5c8b6e34c3dc5b0d17d4e704bd39c
Status: Downloaded newer image for ubuntu:16.04
docker.io/library/ubuntu:16.04
如果從非官方的倉(cāng)庫(kù)下載,則需要在倉(cāng)庫(kù)名稱前指定完整的倉(cāng)庫(kù)地址,例如:
$ docker pull hub.c.163.com/public/ubuntu:16.04
另外,有時(shí)需要使用鏡像代理服務(wù)來加速Docker 鏡像獲取 過程 ,在前面《Docker安裝及加速》一文中已經(jīng)講述。
3. 查看鏡像信息
使用docker images或docker image ls命令可以列出本地主機(jī)上已有鏡像的基本信息。
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 5a214d77f5d7 10 months ago 63.1MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
ubuntu 16.04 b6f507652425 11 months ago 135MB
參數(shù)說明:
- REPOSITORY:鏡像倉(cāng)庫(kù),比如ubuntu表示ubuntu系列的基礎(chǔ)鏡像;
- TAG:鏡像標(biāo)簽,比如 18.04是以u(píng)buntu版本號(hào)作為了鏡像標(biāo)簽;
- IMAGE ID:鏡像ID,每個(gè)鏡像的ID事唯一的,如果兩個(gè)鏡像的ID相同,說明它們實(shí)際上指向了同一個(gè)鏡像,只是具有不同標(biāo)簽名稱而已;
- CREATED:創(chuàng)建時(shí)間,顯示的是鏡像最后更新時(shí)間;
- SIZE:鏡像大小。
使用docker inspect命令獲取鏡像的詳細(xì)信息,其中,包括創(chuàng)建者,各層的數(shù)字摘要等,其格式為:
docker inspect [IMAGE_NAME|ID
例如:
$ docker inspect ubuntu:18.04
[
{
"Id": "sha256:5a214d77f5d747e6ed81632310baa6190301feeb875cf6bf9da560108fa09972",
"RepoTags": [
"ubuntu:18.04"
],
"RepoDigests": [
"ubuntu@sha256:0fedbd5bd9fb72089c7bbca476949e10593cebed9b1fb9edf5b79dbbacddd7d6"
],
"Parent": "",
"Comment": "",
"Created": "2021-10-01T02:23:24.179667784Z",
"Container": "20d614d2eca1b5a9ad6d5a56a80efce44096b87ca76a98256eb51f8dbaf7a8d2",
"ContainerConfig": {
"Hostname": "20d614d2eca1",
......
4. 搜索鏡像
使用 docker search 命令可以搜索Docker Hub 官方倉(cāng)庫(kù)中的鏡像,顯示信息包括鏡像名字、描述、收藏?cái)?shù)、是否官方創(chuàng)建、是否自動(dòng)創(chuàng)建等,命令格式為:
docker search [option] keyword
option選項(xiàng)主要包括:
- -f,–filter filter: 過濾輸出內(nèi)容;
- –format string: 格式化輸出內(nèi)容;
- –limit int:限制輸出結(jié)果個(gè)數(shù), 默認(rèn)為 25 個(gè);
- –automated :只列出 automated build類型的鏡像;
- –no-trunc :顯示完整的鏡像描述.
例如從官方庫(kù)中搜索mysql相關(guān)鏡像:
$ docker search -f stars=10 mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 12976 [OK]
mariadb MariaDB Server is a high performing open sou… 4972 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 594 [OK]
percona Percona Server is a fork of the MySQL relati… 583 [OK]
bitnami/mysql Bitnami MySQL Docker Image 72 [OK]
linuxserver/mysql-workbench 40
ubuntu/mysql MySQL open source fast, stable, multi-thread… 36
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 36
circleci/mysql MySQL is a widely used, open-source relation… 26
google/mysql MySQL server for Google Compute Engine 21 [OK]
rapidfort/mysql RapidFort optimized, hardened image for MySQL 13
參數(shù)說明:
- NAME: 鏡像倉(cāng)庫(kù)源的名稱
- DESCRIPTION: 鏡像的描述
- OFFICIAL: 是否 docker 官方發(fā)布
- stars: 類似 Github 里面的 star,表示點(diǎn)贊、喜歡的意思。
- AUTOMATED: 自動(dòng)構(gòu)建。
5. 創(chuàng)建鏡像
鏡像的來源有兩種,其一是從鏡像庫(kù)下載鏡像,其二是我們創(chuàng)建一個(gè)新的鏡像。創(chuàng)建鏡像也分為兩種,其一是基于已有鏡像創(chuàng)建,其二是使用 Dockerfile 來創(chuàng)建一個(gè)新的鏡像。
5.1 基于已有鏡像創(chuàng)建
首先,我們需要使用鏡像來創(chuàng)建一個(gè)容器,以運(yùn)行目標(biāo)鏡像,并在容器內(nèi)創(chuàng)建一個(gè)測(cè)試文件test.txt。在完成操作之后,輸入 exit 命令來退出這個(gè)容器。
$ docker run -t -i ubuntu:18.04 /bin/bash
root@49152c044299:/# touch test.txt
root@49152c044299:/# exit
此時(shí) ID 為 49152c044299 的容器,就是我們完成更改的容器,可以通過命令 docker commit 來提交容器副本。
$ docker container commit -m "add test.txt" -a "testdocker" 49152c044299 testdocker/ubuntu:test
sha256:9c44392a137352f2b22acbe322543eb6f30970b9bd2edf9145d19c28d5fe21fc
參數(shù)說明:
- -m: 提交的描述信息
- -a: 指定鏡像作者
- 49152c044299:容器 ID
- testdocker/ubuntu:test : 指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名
我們可以使用 docker image ls命令來查看我們的新鏡像 testdocker/ubuntu:test:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
testdocker/ubuntu test 9c44392a1373 19 seconds ago 63.1MB
ubuntu 18.04 5a214d77f5d7 10 months ago 63.1MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
ubuntu 16.04 b6f507652425 11 months ago 135MB
5.2 使用Dockerfile 新建鏡像
使用命令 docker build 可以從零開始創(chuàng)建一個(gè)新的鏡像。為此,我們需要?jiǎng)?chuàng)建一個(gè) Dockerfile 文件,其中包含一組指令來告訴 Docker 如何構(gòu)建鏡像。
首先使用vim編寫一個(gè)Dockerfile文件:
FROM ubuntu:18.04
MAINTAINER test <xxxxx@163.com>
WORKDIR /home
RUN touch testImage.txt
EXPOSE 80
內(nèi)部指令:
- FROM:指定使用哪個(gè)鏡像源
- RUN :告訴docker 在鏡像內(nèi)執(zhí)行什么命令
然后,使用 Dockerfile 文件,通過 docker build 命令來構(gòu)建一個(gè)鏡像:
$ docker build -t testimage/ubuntu:testimage1 .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM ubuntu:18.04
---> 5a214d77f5d7
Step 2/5 : MAINTAINER test <chenhua2820@163.com>
---> Running in 92f0afdaf3bf
Removing intermediate container 92f0afdaf3bf
---> 88d4b9bc0c0e
Step 3/5 : WORKDIR /home
---> Running in ec9fd2b1cbcc
Removing intermediate container ec9fd2b1cbcc
---> 6a91a52c5589
Step 4/5 : RUN touch testImage.txt
---> Running in d60d6a8de1db
Removing intermediate container d60d6a8de1db
---> 1a7c4f1cd570
Step 5/5 : EXPOSE 80
---> Running in 7c2922e1bb55
Removing intermediate container 7c2922e1bb55
---> f3fdbec0b0f9
Successfully built f3fdbec0b0f9
Successfully tagged testimage/ubuntu:testimage1
參數(shù)說明:
- -t :指定要?jiǎng)?chuàng)建的目標(biāo)鏡像名
- . :Dockerfile 文件所在目錄,可以指定Dockerfile 的絕對(duì)路徑
使用docker images 查看創(chuàng)建的鏡像已經(jīng)在列表中存在,鏡像ID為f3fdbec0b0f9:
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
testimage/ubuntu testimage1 f3fdbec0b0f9 38 seconds ago 63.1MB
testdocker/ubuntu test 9c44392a1373 45 minutes ago 63.1MB
ubuntu 18.04 5a214d77f5d7 10 months ago 63.1MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
ubuntu 16.04 b6f507652425 11 months ago 135MB
運(yùn)行新的鏡像,可以看到/home目錄下已經(jīng)創(chuàng)建了測(cè)試文件testImage.txt:
$ docker run -t -i testimage/ubuntu:testimage1 /bin/bash
root@952d273dc630:/home# ls
testImage.txt
6. 刪除鏡像
當(dāng)我們不再需要某個(gè)鏡像的時(shí)候,可以通過 docker image rm 或者docker rmi 命令從 Docker 主機(jī)刪除該鏡像。其格式為:
docker rmi [image]
docker image rm [image]
刪除操作會(huì)在當(dāng)前主機(jī)上刪除該鏡像以及相關(guān)的鏡像層。這意味著無法通過 docker image ls 命令看到刪除后的鏡像,并且對(duì)應(yīng)的包含鏡像層數(shù)據(jù)的目錄會(huì)被刪除。但是,如果某個(gè)鏡像層被多個(gè)鏡像共享,那只有當(dāng)全部依賴該鏡像層的鏡像都被刪除后,該鏡像層才會(huì)被刪除。
例如,刪除掉前面創(chuàng)建的測(cè)試鏡像testimage/ubuntu:testimage1:
$ docker rmi testimage/ubuntu:testimage1
Untagged: testimage/ubuntu:testimage1
Deleted: sha256:f3fdbec0b0f96a8f3bb2e6a4b07ba04dc45b9c59618c2b376ebea7b68ed53971
Deleted: sha256:1a7c4f1cd57038116b7a5eff05a323fc244a135741c2fd69ad89f21569f00afb
Deleted: sha256:22997b7cad7e4294d4eb9b02bc475e2bcc94c2dd168b8a8499adb02cfc4cb573
Deleted: sha256:6a91a52c5589c29f6439bf6c7def37942037a5346a2fd8520f3d8a1fc3d49ccb
Deleted: sha256:88d4b9bc0c0ee678efad3b8192d3c0cf017dfae142dbc7e87af4fecaafb4f847
刪除完成后,docker image ls查看一下當(dāng)前鏡像列表,可以看到testimage/ubuntu:testimage1已不在列表內(nèi):
$ docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
testdocker/ubuntu test 9c44392a1373 About an hour ago 63.1MB
ubuntu 18.04 5a214d77f5d7 10 months ago 63.1MB
hello-world latest feb5d9fea6a5 10 months ago 13.3kB
ubuntu 16.04 b6f507652425 11 months ago 135MB
如果被刪除的鏡像上存在運(yùn)行狀態(tài)的容器,那么刪除操作不會(huì)被允許。再次執(zhí)行刪除鏡像命令之前,需要停止并刪除該鏡像相關(guān)的全部容器。例如刪除時(shí)遇到如下錯(cuò)誤:
$ docker rmi testimage/ubuntu:testimage1
Error response from daemon: conflict: unable to remove repository reference "testimage/ubuntu:testimage1" (must force) - container 952d273dc630 is using its referenced image f3fdbec0b0f9
可以先使用docker ps -a查看依賴的容器id,然后docker rm [容器ID]刪除容器后,最后執(zhí)行docker rmi [鏡像名]來刪除鏡像。
原文鏈接:https://blog.csdn.net/NoBack7/article/details/126188817
相關(guān)推薦
- 2022-01-29 composer global require “fxp/composer-asset-plugin
- 2023-06-17 pytorch?簡(jiǎn)介及常用工具包展示_python
- 2022-02-03 ionic集成極光推送之點(diǎn)擊推送跳轉(zhuǎn)到指定頁(yè)面
- 2022-06-22 C#使用Dictionary<string,?string>拆分字符串與記錄log方法_
- 2022-03-30 Android?RecyclerView曝光采集的實(shí)現(xiàn)方法_Android
- 2022-11-12 C語(yǔ)言楊氏矩陣查找算法實(shí)例講解_C 語(yǔ)言
- 2023-12-15 log4j.properties自定義日志配置
- 2022-07-29 python中open函數(shù)對(duì)文件處理的使用教程_python
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支