Docker 入门系列(2)- Docker 镜像, 免 sudo 使用 docker 命令、获取查看、修改镜像标签、查找删除创建镜像、导入导出镜像
1. 免 sudo 使用 docker 命令
- 如果還沒有 docker group 就添加一個
sudo groupadd docker
- 將用戶加入該 group 內(nèi)
sudo gpasswd -a ${USER} docker
- 重啟 docker 服務(wù)
sudo service docker restart
- 切換當(dāng)前會話到新 group 或者重啟 X 會話
newgrp - docker
注意:最后一步是必須的,否則因?yàn)?groups 命令獲取到的是緩存的組信息,剛添加的組信息未能生效,所以 docker images 執(zhí)行時同樣有錯。
2. Docker 鏡像操作
Docker 運(yùn)行容器前需要本地存在對應(yīng)的鏡像,如果鏡像沒保存在本地,Docker 會嘗試先從默認(rèn)鏡像倉庫下載 https://hub.docker.com/,用戶也可以通過配置,使用自定義的鏡像倉庫。
1. 獲取鏡像
docker pull NAME[:TAG]
其中,NAME 是鏡像倉庫的名稱(用來區(qū)分鏡像),TAG 是鏡像的標(biāo)簽 ( 往往用來表示版本信息) 。如果不顯式指定 TAG,則默認(rèn)會選擇 latest 標(biāo)簽,這會下載倉庫中最新版本的鏡像。
~/docker$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
7b8b6451c85f: Pull complete
ab4d1096d9ba: Pull complete
e6797d1788ac: Pull complete
e25c5c290bde: Pull complete
Digest: sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39
Status: Downloaded newer image for ubuntu:16.04
2. 查看鏡像
docker images
列出本地主機(jī)上已有的鏡像,各個字段信息分別為來自于哪個倉庫(REPOSITORY)、鏡像的標(biāo)簽信息(TAG )、鏡像的唯一ID號(IMAGE ID)、創(chuàng)建時間(CREATED)、鏡像大小(SIZE)。
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
3. 修改本地鏡像標(biāo)簽
docker tag
為本地鏡像添加新的標(biāo)簽:
~/docker$ docker tag ubuntu:16.04 ubuntu:test
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu test a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
不同標(biāo)簽的鏡像 ID 完全一致,說明它們實(shí)際上指向了同一個鏡像文件,只是別名不同而已。
4. 查看鏡像詳細(xì)信息
docker inspect
docker inspect 命令可以獲取該鏡像的詳細(xì)信息,詳情如下:
~/docker$ docker inspect ubuntu
[]
Error: No such object: ubuntu
~/docker$ docker inspect ubuntu:16.04
[{"Id": "sha256:a51debf7e1eb2018400cef1e4b01f2e9f591f6c739de7b5d6c142f954f3715a7","RepoTags": ["ubuntu:16.04","ubuntu:test"],"RepoDigests": ["ubuntu@sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39"],"Parent": "","Comment": "","Created": "2018-11-19T21:23:53.455319926Z","Container": "f4879d05f303ba132b6cc82988306e44819b9d0872dc891d864374d3a9b51b08","ContainerConfig": {"Hostname": "f4879d05f303","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:d6ab6854552cda39995558786e1690e20092af93f8145294473ac62fd76c9b1b","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": {}},"DockerVersion": "17.06.2-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:d6ab6854552cda39995558786e1690e20092af93f8145294473ac62fd76c9b1b","Volumes": null,"WorkingDir": "","Entrypoint": null,"OnBuild": null,"Labels": null},"Architecture": "amd64","Os": "linux","Size": 116379573,"VirtualSize": 116379573,"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/712e9847e3ad03a267475d1d9a0ac4b048db2d019bdaff2c5d5c2c16aebb5c9f/diff:/var/lib/docker/overlay2/1f8d82d0ffea021b7c60a7dc6fff9cec089134d21e6eadea33324806ca3af969/diff:/var/lib/docker/overlay2/dc48b79aa28f9229192998904dc8ebad58e4f6247e6a2efb8f24fa569fc10c09/diff","MergedDir": "/var/lib/docker/overlay2/93bcd26c8df6ca3c8c30cedeb039ceea2d353cdd5780fa0ab928a730011a1974/merged","UpperDir": "/var/lib/docker/overlay2/93bcd26c8df6ca3c8c30cedeb039ceea2d353cdd5780fa0ab928a730011a1974/diff","WorkDir": "/var/lib/docker/overlay2/93bcd26c8df6ca3c8c30cedeb039ceea2d353cdd5780fa0ab928a730011a1974/work"},"Name": "overlay2"},"RootFS": {"Type": "layers","Layers": ["sha256:41c002c8a6fd36397892dc6dc36813aaa1be3298be4de93e4fe1f40b9c358d99","sha256:647265b9d8bc572a858ab25a300c07c0567c9124390fd91935430bf947ee5c2a","sha256:819a824caf709f224c414a56a2fa0240ea15797ee180e73abe4ad63d3806cae5","sha256:3db5746c911ad8c3398a6b72aa30580b25b6edb130a148beed4d405d9c345a29"]},"Metadata": {"LastTagTime": "2018-12-04T22:07:50.559903444+08:00"}}
]
5. 查找鏡像
docker search
docker search 命令可以搜索遠(yuǎn)端倉庫中共享的鏡像,默認(rèn)搜索官方倉庫中的鏡像。用法為 docker search TERM,支持的參數(shù)主要包括:
-
–automated=true| false: 僅顯示自動創(chuàng)建的鏡像,默認(rèn)為否;
-
–no-trunc=true| false: 輸出信息不截?cái)囡@示,默認(rèn)為否;
-
-s,–stars=X: 指定僅顯示評價為指定星級以上的鏡像,默認(rèn)為0,即輸出所有鏡像。
~/docker$ docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 7465 [OK]
mariadb MariaDB is a community-developed fork of MyS… 2407 [OK]
mysql/mysql-server Optimized MySQL Server Docker images. Create… 557 [OK]
zabbix/zabbix-server-mysql Zabbix Server with MySQL database support 149 [OK]
hypriot/rpi-mysql RPi-compatible Docker Image with Mysql 102
zabbix/zabbix-web-nginx-mysql Zabbix frontend based on Nginx web-server wi… 79 [OK]
centurylink/mysql Image containing mysql. Optimized to be link… 59 [OK]
1and1internet/ubuntu-16-nginx-php-phpmyadmin-mysql-5 ubuntu-16-nginx-php-phpmyadmin-mysql-5 47 [OK]
centos/mysql-57-centos7 MySQL 5.7 SQL database server 43
mysql/mysql-cluster Experimental MySQL Cluster Docker images. Cr… 35
tutum/mysql Base docker image to run a MySQL database se… 31
bitnami/mysql Bitnami MySQL Docker Image 23 [OK]
schickling/mysql-backup-s3 Backup MySQL to S3 (supports periodic backup… 23 [OK]
linuxserver/mysql A Mysql container, brought to you by LinuxSe… 17
zabbix/zabbix-proxy-mysql Zabbix proxy with MySQL database support 17 [OK]
centos/mysql-56-centos7 MySQL 5.6 SQL database server 12
circleci/mysql MySQL is a widely used, open-source relation… 7
mysql/mysql-router MySQL Router provides transparent routing be… 6
openshift/mysql-55-centos7 DEPRECATED: A Centos7 based MySQL v5.5 image… 6
dsteinkopf/backup-all-mysql backup all DBs in a mysql server 5 [OK]
openzipkin/zipkin-mysql Mirror of https://quay.io/repository/openzip… 1
jelastic/mysql An image of the MySQL database server mainta… 1
ansibleplaybookbundle/mysql-apb An APB which deploys RHSCL MySQL 0 [OK]
cloudfoundry/cf-mysql-ci Image used in CI of cf-mysql-release 0
cloudposse/mysql Improved `mysql` service with support for `m… 0 [OK]
6. 刪除鏡像
docker rmi IMAGE[IMAGE...]
docker rmi 命令可以刪除鏡像,命令格式為 docker rmi IMAGE[IMAGE…],其中 IMAGE 可以為標(biāo)簽或ID。
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu test a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
~/docker$ docker rmi ubuntu:test
Untagged: ubuntu:test
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
當(dāng)同一個鏡像擁有多個標(biāo)簽的時候,docker rmi 命令只是刪除該鏡像多個標(biāo)簽中的指定標(biāo)簽而已,并不影響鏡像文件。因此上述操作相當(dāng)于只是刪除了鏡像 a51debf7e1eb 的標(biāo)簽而已。
當(dāng)使用 docker rmi 命令,并且后面跟上鏡像的 ID ( 也可以是能進(jìn)行區(qū)分的部分 ID 串前綴 ) 時,會先嘗試刪除所有指向該鏡像的標(biāo)簽,然后刪除該鏡像文件本身。
注意,當(dāng)有該鏡像創(chuàng)建的容器存在時,鏡像文件默認(rèn)是無法被刪除的。
- 先創(chuàng)建一個容器:
~/docker$ docker run ubuntu:16.04 echo "Hello, world"
Hello, world
- 使用 docker ps -a 命令可以看到本機(jī)上存在的所有容器:
~/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f632ff0305aa ubuntu:16.04 "echo 'Hello, world'" 46 seconds ago Exited (0) 45 seconds ago eloquent_swartz
33197473a278 hello-world "/hello" 3 days ago Exited (0) 3 days ago frosty_galileo
- 試圖刪除該鏡像,Docker 會提示有容器正在運(yùn)行,無法刪除:
~/docker$ docker rmi ubuntu:16.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:16.04" (must force) - container f632ff0305aa is using its referenced image a51debf7e1eb
- 先刪除依賴該鏡像的所有容器,再使用ID 來刪除鏡像:
:~/docker$ docker rm f6
f6
:~/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
33197473a278 hello-world "/hello" 3 days ago Exited (0) 3 days ago frosty_galileo
7. 創(chuàng)建鏡像
創(chuàng)建鏡像有三種方法:
- 基于已有鏡像的容器創(chuàng)建
- 基于本地模板導(dǎo)入
- 基于 Dockerfile 創(chuàng)建
基于已有鏡像的容器創(chuàng)建:
該方法主要是使用 docker commit 命令。命令格式為
docker commit[OPTIONS]CONTAINER[REPOSITORY[:TAG]]
主要選項(xiàng)包括:
- -a,–author="":作者信息
- c,–change=[]:提交的時候執(zhí)行 Dockerfile指令,包括CMD|
ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等; - -m,–message="":提交消息
- p,–pause=true:提交時暫停容器運(yùn)行
創(chuàng)建新鏡像示例
先啟動一個鏡像,并在其中進(jìn)行修改操作,例如創(chuàng)建一個 test 文件,之后退出。
~/docker$ docker run -ti ubuntu:16.04
root@c53b34da8804:/# touch test.sh
root@c53b34da8804:/# pwd
/
root@c53b34da8804:/# ls
bin dev home lib64 mnt proc run srv test.sh usr
boot etc lib media opt root sbin sys tmp var
root@c53b34da8804:/# exit
exit
~/docker$
容器 ID 為 c53b34da8804,該容器跟原來的 ubuntu 鏡像相比已發(fā)生變化。使用 docker commit 命令提交為一個新的鏡像,提交時使用 ID 或者名稱來指定容器。
~/docker$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
c53b34da8804 ubuntu:16.04 "/bin/bash" 16 minutes ago Exited (0) 16 minutes ago mystifying_sanderson
33197473a278 hello-world "/hello" 3 days ago Exited (0) 3 days ago frosty_galileo
~/docker$ docker commit -m "add new file" -a "wohu1104" c53b34da8804 test_image
sha256:1cd880207b3efc2ce140237803672344fe3ec7ed3970dffc63c113cac262ed50
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 18 seconds ago 116MB
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu latest 93fd78260bd1 2 weeks ago 86.2MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
8. 導(dǎo)出和導(dǎo)入鏡像
- 使用 docker save 命令用來將鏡像導(dǎo)出到本地文件
~/docker$ docker save -o ubuntu.tar ubuntu:16.04
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 9 minutes ago 116MB
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
ubuntu latest 93fd78260bd1 2 weeks ago 86.2MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
~/docker$ ls
ubuntu.tar
其中 -o 和 > 表示輸出到文件,ubuntu.tar 為目標(biāo)文件,ubuntu:16.04 是源鏡像名(name:tag)
- 使用 docker load 將導(dǎo)出本地文件再導(dǎo)入到本地鏡像庫
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 14 minutes ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
~/docker$ docker load -i ubuntu.tar
Loaded image: ubuntu:16.04
~/docker$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test_image latest 1cd880207b3e 15 minutes ago 116MB
ubuntu 16.04 a51debf7e1eb 2 weeks ago 116MB
hello-world latest 4ab4c602aa5e 2 months ago 1.84kB
其中 -i 和 < 表示從文件輸入。會成功導(dǎo)入鏡像及相關(guān)元數(shù)據(jù),包括tag信息
9. 上傳鏡像
使用 docker push 命令上傳鏡像到倉庫,默認(rèn)上傳到 Docker Hub官方倉庫 ( 需要登錄 )。命令格式為:
docker push NAME[:TAG] |[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
參考:
https://www.cnblogs.com/lsgxeva/p/8746644.html
總結(jié)
以上是生活随笔為你收集整理的Docker 入门系列(2)- Docker 镜像, 免 sudo 使用 docker 命令、获取查看、修改镜像标签、查找删除创建镜像、导入导出镜像的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Ubuntu 16.04 安装 Dock
- 下一篇: Docker 入门系列(3)- Dock