簡介 鏡像是Docker的三大核心概念之一。 ? 獲取鏡像 鏡像是Docker運(yùn)行容器的前提。 [root@gavin ~]# sudo docker pull ubuntu Using default tag: latest latest: Pulling from library/ubuntu 5b7339215d1d: Pull complete 14ca88e9f672: Pull complete a31c3b1caad4: Pull complete b054a26005b7: Pull complete Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Status: Downloaded newer image for ubuntu:latest 該命令實(shí)際上下載的就是ubuntu:latest鏡像,目前最新的18.04版本的鏡像。 [root@gavin ~]# sudo docker pull ubuntu:18.04 18.04: Pulling from library/ubuntu Digest: sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Status: Downloaded newer image for ubuntu:18.04 上面兩條命令實(shí)際上都相當(dāng)于sudo docker pull registry.hub./ubuntu:latest命令,即從默認(rèn)的注冊服務(wù)器registry.hub.中的ubuntu倉庫來下載標(biāo)記為latest的鏡像。 下載鏡像到本地后,即可隨時(shí)使用該鏡像了,例如利用該鏡像創(chuàng)建一個(gè)容器,在其中運(yùn)行bash應(yīng)用。 [root@gavin ~]# sudo docker run -t -t ubuntu:latest /bin/bash root@74bf842f3c6c:/# ? 查看鏡像信息 使用docker images命令可以列出本地主機(jī)上已有的鏡像。 [root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 4c108a37151f 2 weeks ago 64.2MB ubuntu latest 4c108a37151f 2 weeks ago 64.2MB 在列出信息中,可以看到有幾個(gè)字段信息:
其中鏡像的ID信息十分重要,它唯一標(biāo)識了鏡像。 [root@gavin ~]# sudo docker tag ubuntu:latest ubuntu:v1.0 再次使用docker images列出本地主機(jī)上鏡像信息,可以看到多了一個(gè)ubuntu:v1.0標(biāo)簽的鏡像。 [root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 4c108a37151f 2 weeks ago 64.2MB ubuntu latest 4c108a37151f 2 weeks ago 64.2MB ubuntu v1.0 4c108a37151f 2 weeks ago 64.2MB 細(xì)心的讀者可能會注意到,這些不同標(biāo)簽的鏡像的ID是完全一致的,說明它們實(shí)際上指向了同一個(gè)鏡像文件,只是別名不同而已。標(biāo)簽在這里起到了引用或快捷方式的作用。 [root@gavin ~]# sudo docker inspect 4c108a37151f [ { "Id": "sha256:4c108a37151f54439950335c409802e948883e00c93fdb751d206c9a9674c1f6", "RepoTags": [ "ubuntu:18.04", "ubuntu:latest", "ubuntu:v1.0" ], "RepoDigests": [ "ubuntu@sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c" ], "Parent": "", "Comment": "", "Created": "2019-06-18T22:51:38.340092056Z", "Container": "fdea049ea807b599050e885a88784e009ed78ebcc4d498be93744bb9374c6134", "ContainerConfig": { "Hostname": "fdea049ea807", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/sh", "-c", "#(nop) ", "CMD [\"/bin/bash\"]" ], "ArgsEscaped": true, "Image": "sha256:ae950a0376fe6c4d08fa7ff395f50f4a909e26e9f2d865d8641cda024161c6ee", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": {} }, "DockerVersion": "18.06.1-ce", "Author": "", "Config": { "Hostname": "", "Domainname": "", "User": "", "AttachStdin": false, "AttachStdout": false, "AttachStderr": false, "Tty": false, "OpenStdin": false, "StdinOnce": false, "Env": [ "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin" ], "Cmd": [ "/bin/bash" ], "ArgsEscaped": true, "Image": "sha256:ae950a0376fe6c4d08fa7ff395f50f4a909e26e9f2d865d8641cda024161c6ee", "Volumes": null, "WorkingDir": "", "Entrypoint": null, "OnBuild": null, "Labels": null }, "Architecture": "amd64", "Os": "linux", "Size": 64184378, "VirtualSize": 64184378, "GraphDriver": { "Data": { "LowerDir": "/var/lib/docker/overlay2/c2dab2bd224b9fa08454dd83047c951dc083d7e66cbd3bc121525f90d91aa3f8/diff:/var/lib/docker/overlay2/6247f7d6c45adb4475889cfa641dfc3c917de3a501d7e29c09833bdb98acf3de/diff:/var/lib/docker/overlay2/2adcd34ff16da9a82706938907f6f2bcee53ec5e0e7e6d6b8ee90eea80d635e4/diff", "MergedDir": "/var/lib/docker/overlay2/4d6fe2c8be4a0d1a7afc7a648c8be8dfbda2eb1b621db2b3a2832c5e3aa659f9/merged", "UpperDir": "/var/lib/docker/overlay2/4d6fe2c8be4a0d1a7afc7a648c8be8dfbda2eb1b621db2b3a2832c5e3aa659f9/diff", "WorkDir": "/var/lib/docker/overlay2/4d6fe2c8be4a0d1a7afc7a648c8be8dfbda2eb1b621db2b3a2832c5e3aa659f9/work" }, "Name": "overlay2" }, "RootFS": { "Type": "layers", "Layers": [ "sha256:ba9de9d8475e7f5e40086358a1353b3cc080994fc6d31e4272dd3acb69b0151e", "sha256:fbd2732ad777cb5db2515fa62b6122b797be233d01db02e0a19e5d894688cad6", "sha256:dda1518598187bf87704acc22aa0ec2a67d9e7835c24346dfca118ab42c5cd0b", "sha256:75e70aa52609fdbd63b58d46d6f7c20470062e1c9bb75616f7703a358a61e5ca" ] }, "Metadata": { "LastTagTime": "2019-07-09T18:06:36.890136591 04:00" } } ] docker inspect 命令返回的是一個(gè)JSON格式的消息,如果我們只要其中一項(xiàng)內(nèi)容時(shí),可以使用-f參數(shù)來指定,例如,獲取鏡像的Architecture信息: [root@gavin ~]# sudo docker inspect -f {{".Architecture"}} 4c108a37151f amd64 ? 搜尋鏡像使用docker search命令可以搜索遠(yuǎn)端倉庫中共享的鏡像,默認(rèn)搜索Docker Hub官方倉庫中的鏡像。用法為docker search TERM,支持的參數(shù)包括:
例如,搜索帶mysql關(guān)鍵字的鏡像如下所示: [root@gavin ~]# sudo docker search mysql NAME DESCRIPTION STARS OFFICIAL AUTOMATED mysql MySQL is a widely used, open-source relation… 8364 [OK] mariadb MariaDB is a community-developed fork of MyS… 2866 [OK] mysql/mysql-server Optimized MySQL Server Docker images. Create… 623 [OK] percona Percona Server is a fork of the MySQL relati… 438 [OK] centurylink/mysql Image containing mysql. Optimized to be link… 60 [OK] centos/mysql-57-centos7 MySQL 5.7 SQL database server 57 mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 46 deitch/mysql-backup Automated and scheduled mysql database dumps… 39 [OK] tutum/mysql Base docker image to run a MySQL database se… 32 schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 28 [OK] bitnami/mysql Bitnami MySQL Docker Image 27 [OK] linuxserver/mysql A Mysql container, brought to you by LinuxSe… 20 prom/mysqld-exporter 19 [OK] centos/mysql-56-centos7 MySQL 5.6 SQL database server 15 mysql/mysql-router MySQL Router provides transparent routing be… 12 circleci/mysql MySQL is a widely used, open-source relation… 12 arey/mysql-client Run a MySQL client from a docker container 10 [OK] yloeffler/mysql-backup This image runs mysqldump to backup data usi… 6 [OK] openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6 fradelg/mysql-cron-backup MySQL/MariaDB database backup using cron tas… 4 [OK] genschsa/mysql-employees MySQL Employee Sample Database 2 [OK] jelastic/mysql An image of the MySQL database server mainta… 1 monasca/mysql-init A minimal decoupled init container for mysql 0 widdpim/mysql-client Dockerized MySQL Client (5.7) including Curl… 0 [OK] ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 0 [OK] 可以看到返回了很多包含關(guān)鍵字的鏡像,其中包括鏡像名字、描述、星級(表示該鏡像的受歡迎程度)、是否官方創(chuàng)建、是否自動創(chuàng)建等。 ? 刪除鏡像使用鏡像的標(biāo)簽刪除鏡像 使用docker rmi命令可以刪除鏡像,命令格式為docker rmi IMAGE [IMAGE...],其中IMAGE可以為標(biāo)簽或ID。 [root@gavin ~]# sudo docker rmi ubuntu:v1.0 Untagged: ubuntu:v1.0 讀者可能會擔(dān)心,本地的ubuntu:latest鏡像是否會受到此命令的影響。無需擔(dān)心,當(dāng)同一個(gè)鏡像擁有多個(gè)標(biāo)簽的時(shí)候,docker rmi命令只是刪除了該鏡像多個(gè)標(biāo)簽中的指定標(biāo)簽而已,并不影響鏡像文件。因此上述操作相當(dāng)于只是刪除了鏡像4c108a37151f的一個(gè)標(biāo)簽而已。 [root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE ubuntu 18.04 4c108a37151f 2 weeks ago 64.2MB ubuntu latest 4c108a37151f 2 weeks ago 64.2MB 但當(dāng)鏡像只剩下一個(gè)標(biāo)簽的時(shí)候就要小心了,此時(shí)再使用docker rmi命令會徹底刪除該鏡像。 [root@gavin ~]# sudo docker rmi mysql:latest Untagged: mysql:latest Untagged: mysql@sha256:415ac63da0ae6725d5aefc9669a1c02f39a00c574fdbc478dfd08db1e97c8f1b Deleted: sha256:c7109f74d339896c8e1a7526224f10a3197e7baf674ff03acbab387aa027882a Deleted: sha256:35d60530f024aa75c91a123a69099f7f6eaf5ad7001bb983f427f674980d8482 Deleted: sha256:49d8bb533eee600076e3a513a203ee24044673fcef0c1b79e088b2ba43db2c17 Deleted: sha256:2e7d501ae7df8ee0eca0fe0b16c6e9fad9a3664811445f38f32636b47366eec3 Deleted: sha256:6a362ed9781f7b3f0c63b061dfb0f14d9ba10d021df10712a131158c103b0d18 Deleted: sha256:3e58b58898622709169f72e7fa20244e084316f3ee66142728bce3f35bb9538b Deleted: sha256:4beb9add2b61bbae54c13e9d9f374b1fe8573226c2fe889bdd5dc8eed19ffbc1 Deleted: sha256:b3a6af4f3db06bbe8f661019f7dbc354b5e63318fca01d8f1e6218f0afbaa5eb Deleted: sha256:037818566b488757260ae3d0064fbf6e47365cd08dc6409b7a018a512ef17f25 Deleted: sha256:000ec65531a617f550ee04f67c875b70f4b395af00b5f5bb7ed480b17078bc0b Deleted: sha256:11d387a2efcce7596530d6be2299b6528b0afe070aba3caf3432ca31c3b0132d Deleted: sha256:a883a9d05facd6220d9251787142b41cc6675f247bc47c94071e665adf65dbbf Deleted: sha256:cf5b3c6798f77b1f78bf4e297b27cfa5b6caa982f04caeb5de7d13c255fd7a1e 使用鏡像的ID刪除鏡像 當(dāng)使用docker rmi命令后面跟上鏡像的ID(也可以是ID能進(jìn)行區(qū)分的部分前綴串)時(shí),會先嘗試刪除所有指向該鏡像的標(biāo)簽,然后刪除該鏡像文件本身。 [root@gavin ~]# sudo docker run ubuntu:latest echo 'hello docker' hello docker 使用docker ps -a命令可以看到本機(jī)上存在的所有容器: [root@gavin ~]# sudo docker ps -a CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES f062ef2957f1 ubuntu:latest "echo 'hello docker'" 2 minutes ago Exited (0) 2 minutes ago sleepy_euler 可以看到,后臺存在一個(gè)退出狀態(tài)的容器,是剛基于ubuntu:latest鏡像創(chuàng)建的。 [root@gavin ~]# sudo docker rmi ubuntu:latest Untagged: ubuntu:latest 結(jié)果我們這里刪除成功了,原因是存在相同ID的鏡像(ubuntu:18.04,ubuntu:latest),前面只是刪除了一個(gè)tag(標(biāo)簽),這里我們再刪除ubuntu:18.04 [root@gavin ~]# sudo docker rmi ubuntu:18.04 Error response from daemon: conflict: unable to remove repository reference "ubuntu:18.04" (must force) - container f062ef2957f1 is using its referenced image 4c108a37151f 果不其然提示有容器正在引用,無法刪除。 [root@gavin ~]# sudo docker rmi -f ubuntu:18.04 Untagged: ubuntu:18.04 Untagged: ubuntu@sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Deleted: sha256:4c108a37151f54439950335c409802e948883e00c93fdb751d206c9a9674c1f6 博主不推薦使用-f參數(shù)來強(qiáng)制刪除一個(gè)存在容器依賴的鏡像,因?yàn)檫@樣往往會造成一些遺留問題。 [root@gavin ~]# sudo docker rm f06 f06 此時(shí)再使用ID來刪除鏡像,此時(shí)會正常打印出刪除的各層信息: [root@gavin ~]# sudo docker rmi 4c108a37151f Untagged: ubuntu:latest Untagged: ubuntu@sha256:9b1702dcfe32c873a770a32cfd306dd7fc1c4fd134adfb783db68defc8894b3c Deleted: sha256:4c108a37151f54439950335c409802e948883e00c93fdb751d206c9a9674c1f6 Deleted: sha256:7c1abf1dbbfd02a48330a7317ab45a6091d53e2e9cc062f0f3dbd2b7539947a6 Deleted: sha256:5a614dda4a54650168ee2cd30ce2e39576dad5c9a0d1907c02445687b4ea5090 Deleted: sha256:bd042113a73a5c9c6680990740446b7324afb39e243ade3d33bdaa9ffaf8d294 Deleted: sha256:ba9de9d8475e7f5e40086358a1353b3cc080994fc6d31e4272dd3acb69b0151e ? 創(chuàng)建鏡像 創(chuàng)建鏡像的方法有三種:基于已有鏡像的容器創(chuàng)建、基于本地模板導(dǎo)入、基于Dockerfile創(chuàng)建。 基于已有鏡像的容器創(chuàng)建該方法主要是使用docker commit命令,其命令格式為docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]],主要選項(xiàng)包括:
下面將演示如何使用該命令創(chuàng)建一個(gè)新鏡像。首先,啟動一個(gè)鏡像,并在其中進(jìn)行修改操作,例如創(chuàng)建一個(gè)test文件,之后退出: [root@gavin ~]# sudo docker run -ti ubuntu:18.04 /bin/bash root@e8382cf8c930:/# touch test root@e8382cf8c930:/# exit 記住容器的ID為:e8382cf8c930。 [root@gavin ~]# sudo docker commit -m "Added a new file" -a "Docker Newbee" e8382cf8c930 test:1.0 sha256:a7f06e6700e36df75ad4dfc952bab4861f35edb840f50aeb3b657d8cc27e9403 順利的話,命令會返回新創(chuàng)建的鏡像的ID信息,例如:a7f06e6700e36df75ad4dfc952bab4861f35edb840f50aeb3b657d8cc27e9403 [root@gavin ~]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE test 1.0 a7f06e6700e3 2 minutes ago 64.2MB ubuntu 18.04 4c108a37151f 3 weeks ago 64.2MB 基于本地模板導(dǎo)入 也可以直接從一個(gè)操作系統(tǒng)模板文件導(dǎo)入一個(gè)鏡像。在這里,推薦使用OpenVZ提供的模板來創(chuàng)建。OPENVZ模板的下載地址為https://wiki./Download/templates/precreated。 [root@gavin data]# sudo cat centos-7-x86_64.tar.gz | docker import - centos:7.0 sha256:0c4f10b8e790e76e2b60d4afff42248b04abacfb9918109e8b3dc94d72cafda1 然后查看新導(dǎo)入的鏡像,已經(jīng)在本地存在了: [root@gavin data]# sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE centos 7.0 0c4f10b8e790 About a minute ago 589MB test 1.0 a7f06e6700e3 16 minutes ago 64.2MB ubuntu 18.04 4c108a37151f 3 weeks ago 64.2MB ? 存出和存入鏡像可以使用docker save和docker load命令來存出和載入鏡像。 存出鏡像如果要存出鏡像到本地文件,可以使用docker save命令。例如,存出本地的ubuntu:18.04鏡像為文件 ubuntu_18.04.tar: [root@gavin /]# sudo docker save -o ubuntu_18.04.tar ubuntu:18.04 存入鏡像可以使用docker load從存出的本地文件中再導(dǎo)入到本地鏡像庫,例如從文件ubuntu_18.04.tar導(dǎo)入鏡像到本地鏡像列表,如下所示: [root@gavin /]# sudo docker load --input ubuntu_18.04.tar 或 [root@gavin /]# sudo docker load < ubuntu_18.04.tar 這將導(dǎo)入鏡像以及其相關(guān)的元數(shù)據(jù)信息(包括標(biāo)簽等),可以使用docker images命令進(jìn)行查看。 ? 上傳鏡像 可以使用docker push命令上傳鏡像到倉庫,默認(rèn)上傳到DockerHub官方倉庫(需要登錄),命令格式為docker push NAME[:TAG]。 [root@gavin /]# 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 https://hub. to create one. Username: xiaohui1994 Password: WARNING! Your password will be stored unencrypted in /root/.docker/config.json. Configure a credential helper to remove this warning. See https://docs./engine/reference/commandline/login/#credentials-store Login Succeeded [root@gavin /]# sudo docker push xiaohui1994/test:1.0 The push refers to repository [docker.io/xiaohui1994/test] bb817e704dea: Pushed 75e70aa52609: Mounted from library/ubuntu dda151859818: Mounted from library/ubuntu fbd2732ad777: Mounted from library/ubuntu ba9de9d8475e: Mounted from library/ubuntu 1.0: digest: sha256:ec47f750b7827f9e5483a4ac48d12fadf8cfe05b2e7839d0884b1bbacdf70441 size: 1359 此時(shí)登錄DockerHub可以看到剛上傳的鏡像: ? ? 這篇文章是我學(xué)習(xí) Docker 的記錄,內(nèi)容參考自《Docker技術(shù)入門與實(shí)戰(zhàn)》 ? 來源:https://www./content-4-319451.html |
|