您的位置:首页 > 运维架构 > Docker

Docker(二) 镜像详解

2017-11-16 18:44 615 查看
说明:本笔记是在CentOS 7 环境中实践练习的,其他环境可适当改变命令或参考其他。

    想要了解Docker就必须了解Docker的三个核心概念,即镜像、容器和仓库。了解了这三个概念也就了解了Docker的生命周期。下面笔记是我在学习Docker过程中的总结。

一、Docker 镜像。

    Docker 运行容器之前需要本地存在对应的镜像,如果镜像不存在,Docker 会尝试先从默认镜像仓库下载(默认使用Docker Hub公共注册服务器中的仓库),用户也可以配置,使用自己定义的仓库。

1、获取镜像

获取镜像可以使用命令 docker pull NAME [:TAG],如果不指定TAG,Docker会默认选择latest标签,下载仓库中最新的镜像。
如:下载ubuntu镜像
(1)、下载最新版本,即不指定版本号:docker pull ubuntu
[root@localhost xb]# docker pull ubuntu
Using default tag: latest
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu

ae79f2514705: Pull complete
c59d01a7e4ca: Pull complete
41ba73a9054d: Pull complete
f1bbfd495cc1: Pull complete
0c346f7223e2: Pull complete
Digest: sha256:6eb24585b1b2e7402600450d289ea0fd195cfb76893032bbbb3943e041ec8a65
(2)、下载指定版本ubuntu:docker pull ubuntu:14.04
[root@localhost xb]# docker pull ubuntu:14.04
Trying to pull repository docker.io/library/ubuntu ...
14.04: Pulling from docker.io/library/ubuntu

bae382666908: Pull complete
f1ddd5e846a8: Pull complete
90d12f864ab9: Pull complete
a57ea72e3176: Pull complete
783a14252520: Pull complete
Digest: sha256:f6eed4def93a3b54da920737f0abf1a8cae2e480bb368280c898265fcaf910a3
(3)、下载最新CentOS镜像:docker pull centos
[root@localhost xb]# docker pull centos
Using default tag: latest
Trying to pull repository docker.io/library/centos ...
latest: Pulling from docker.io/library/centos

d9aaf4d82f24: Pull complete
Digest: sha256:4565fe2dd7f4770e825d4bd9c761a81b26e49cc9e3c9631c58cfc3188be9505a

以上命令相当于docker pull registry.hub.docker.com/ubuntu:latest命令,即从[b]registry.hub.docker.com中的ubuntu仓库下载标记为latest的镜像。[/b]
我们也可以从别的注册服务器的仓库中下载,需要在仓库名称钱指定完整的仓库注册服务器地址。例如,从dockerpool社区的镜像源下载最新的镜像:docker pull dl.dockerpool.com:5000/ubuntu

2、查看镜像信息:
(1)、docker images 命令可以查看本地的镜像信息
[root@localhost xb]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              dd6f76d9cc90        11 days ago         122 MB
docker.io/ubuntu    14.04               3aa18c7568fc        11 days ago         188 MB
docker.io/centos    latest              d123f4e55e12        11 days ago         196.6 MB

repository:来源。来自于那个仓库,如上表:有两个来自ununtu仓库,一个来源于centos仓库。
tag:镜像的标签信息,标记来源于同意仓库的不同镜像。如:14.04;latest(表示最新)
iamge id :镜像的id号(唯一),唯一的标识了镜像
created:创建时间
size:镜像大小
(2)、使用docker tag 命令为本地镜像添加新的标签,方便后续使用。
repository:来源。来自于那个仓库,如上表:有两个来自ununtu仓库,一个来源于centos仓库。
tag:镜像的标签信息,标记来源于同意仓库的不同镜像。如:14.04;latest(表示最新)
iamge id :镜像的id号(唯一),唯一的标识了镜像
created:创建时间
size:镜像大小
(2)、使用docker tag 命令为本地镜像添加新的标签,方便后续使用。


注意:最后两个镜像的ID一样,说明这两个指向了同一个镜像文件。

(3)、使用docker inspect 可以获取镜像的详细信息。
[root@localhost xb]# docker inspect dd6f76d9cc90
[
{
"Id": "sha256:dd6f76d9cc90f3ec2bded9e1c970bb6a8c5259e05401b52df42c997dec1e79be",
"RepoTags": [
"docker.io/ubuntu:latest"
],
"RepoDigests": [
"docker.io/ubuntu@sha256:6eb24585b1b2e7402600450d289ea0fd195cfb76893032bbbb3943e041ec8a65"
],
"Parent": "",
"Comment": "",
"Created": "2017-11-04T09:45:35.219223981Z",
"Container": "1d47863c2619835d381f791bb5fac859d2d3eefad6cd170ad8023f57d8108f34",
"ContainerConfig": {
"Hostname": "1d47863c2619",
"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:3372a56afc4801e2e46b51f63d2b74d20d92772a20c46d5443d3760676d4a2d3",
"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:3372a56afc4801e2e46b51f63d2b74d20d92772a20c46d5443d3760676d4a2d3",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": null,
"OnBuild": null,
"Labels": null
},
"Architecture": "amd64",
"Os": "linux",
"Size": 122019781,
"VirtualSize": 122019781,
"GraphDriver": {
"Name": "devicemapper",
"Data": {
"DeviceId": "22",
"DeviceName": "docker-253:0-4707444-dba515e4696d5737c940722f49115cf570cc3b7cdbe70f2369578e9aeeba2913",
"DeviceSize": "10737418240"
}
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:0f5ff0cf6a1c53f94b15f03536c490040f233bc455f1232f54cc8eb344a3a368",
"sha256:f1c896f31e4935defe0f9714c011ee31b3179ac745a4ed04e07c2e6ef2a7c349",
"sha256:51db18d04d72c86f0fdc6087c6903bc3ad6bec155f6cfbb9b3051e70fb910cf3",
"sha256:f51f76255b02ab76a187976397bad344c086ab3b1f132058b09e545beb7e8d2d",
"sha256:174a611570d45cc705d866329385f28f25b917b97641013603a85ba148996a05"
]
}
}
]

该命令返回了一个JSON格式的数据,包含了该镜像的详细信息。
需要获取镜像某一项信息,可使用 -f 参数:
[root@localhost xb]# docker inspect -f {{".Os"}} dd
linux

注意:在指定镜像的时候通常可以使用镜像的前几个字符来代替;如上使用的“dd”来代替“dd6f76d9cc90”
3、查找镜像:使用docker search 命令可以搜索远程仓库中共享的镜像,默认搜索docker hub仓库。
命令:docker search term
[root@localhost mydoc]# docker search mysql




返回结果包含了镜像名、描述、星级(表示该镜像的受欢迎程度)、是否官方创建、是否自动创建等。默认输出的顺序是按照星级排序的。
4、删除镜像:docker rmi IMAGE[IMAGE...];其中IMAGE可以为镜像标签或者镜像ID

使用标签删除镜像:docker rmi ubuntu:14.04
使用id删除镜像:docker rmi dd6f76d9cc90  或  [b]docker
rmi 
dd6(ID为完整ID或能够确定镜像的ID的前半部分)[/b]

[root@localhost mydoc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              dd6f76d9cc90        11 days ago         122 MB
docker.io/ubuntu    14.04               3aa18c7568fc        11 days ago         188 MB
centos              new                 d123f4e55e12        12 days ago         196.6 MB
docker.io/centos    latest              d123f4e55e12        12 days ago         196.6 MB
[root@localhost mydoc]# docker rmi ubuntu:14.04
Untagged: ubuntu:14.04
Untagged: docker.io/ubuntu@sha256:f6eed4def93a3b54da920737f0abf1a8cae2e480bb368280c898265fcaf910a3
Deleted: sha256:3aa18c7568fc27f60836c67a0f74947b64da3555978b8437a0be8a23b988d9a2
Deleted: sha256:93c62f500fa88056c0c90a59b23ed647abe96fe532206db98b5133751b051e68
Deleted: sha256:9290981da9b4cf4e5c4a5b3832608e51172eea327c9bbdc99aa4244d6ee988c2
Deleted: sha256:93774300532ae7926e7504f13c12c5a9358f22c09b1a32a2256b4b7351429dcf
Deleted: sha256:766364823d7e82cfe25d4393be31f8a5a681e8a610d937d00453df2322edc469
Deleted: sha256:c47d9b229ca4eaf5d3b85b6fa7f794d00910a42634dd0fd5107a9a937b13b20f
[root@localhost mydoc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker.io/ubuntu    latest              dd6f76d9cc90        11 days ago         122 MB
centos              new                 d123f4e55e12        12 days ago         196.6 MB
docker.io/centos    latest              d123f4e55e12        12 days ago         196.6 MB

注意:删除镜像的时候当该镜像只有一个标签的时候,会彻底删除该镜像。
注意:如果有该镜像创建的容器存在时,该镜像将无法删除,可加-f参数,强制删除。
如:docker rmi -f ubuntu:14.04
这样删除之后会出现原来被删除的镜像换了一个id又继续存在系统中
一般操作先删除容器:docker rm 容器id或id前半部分
4、创建镜像
    创建镜像有三种方式:

基于已有镜像的容器创建
基于本地模板导入
基于Dockerfile创建
1)、基于已有镜像的容器创建镜像

    命令:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
    主要包括选项:

-a:--author=" ":作者信息
-m:--message=" ":提交信息
-p:--pause=true:提交是暂停容器运行
实战过程:

# 启动容器
[root@localhost mydoc]# docker run -ti ubuntu:latest /bin/bash
# 创建文件
root@2f8241feb70b:/# touch test
# 退出容器
root@2f8241feb70b:/# exit
exit
# 提交镜像,指定容器id,为上边所示2f8241feb70b , 并指定仓库名为test
[root@localhost mydoc]# docker commit -m "created a new file named test" -a "xb" 2f8241feb70b test
# 创建成功后返回的新镜像的id信息
sha256:d0769584f950b5affd1c45803267671a11d6d54cd8997afddb0d216b574738c8
# 查看当前镜像
[root@localhost mydoc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test                latest              d0769584f950        7 seconds ago       122 MB
docker.io/ubuntu    latest              dd6f76d9cc90        11 days ago         122 MB
centos              new                 d123f4e55e12        12 days ago         196.6 MB
docker.io/centos    latest              d123f4e55e12        12 days ago         196.6 MB

2)、基于本地模板导入创建镜像
    一般推荐使用OpenVZ提供的镜像模板来创建。
# 网站地址:https://openvz.org/Download/template/precreated
[root@localhost mydoc]# wget http://download.openvz.org/template/precreated/centos-6-x86-minimal.tar.gz # docker import import - (+自定义的名字)
[root@localhost mydoc]# cat centos-6-x86-minimal.tar.gz | docker import - centos-6-x86
sha256:1845f9850572ad4bf5c2eb1638fda36151095bbfa2d5201659f42c3349de1007
[root@localhost mydoc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
centos-6-x86        latest              1845f9850572        About a minute ago   512.1 MB
test                latest              d0769584f950        19 minutes ago       122 MB
docker.io/ubuntu    latest              dd6f76d9cc90        12 days ago          122 MB
docker.io/centos    latest              d123f4e55e12        12 days ago          196.6 MB
centos              new                 d123f4e55e12        12 days ago          196.6 MB

3)、存出和导入镜像

把现有镜像,导出为一个文件。

# 把现有镜像,导出为一个文件。
# -o + 要导出最后的文件名 + 要导出的文件的标签(名) 或id
# docker save o - (+ 要导出最后的文件名 + 要导出的文件的标签(名) 或id )
[root@localhost mydoc]# docker save -o filename_centos_6_x86.tar d0769584f950
[root@localhost mydoc]# ls
centos-6-x86-minimal.tar.gz  filename_centos_6_x86.tar

用导出的文件恢复本地镜像
# 1. 先删除镜像
# 2. 再利用文件恢复
# 形式:== docker load --input xb_centos6.tar
# == docker load < frankie-centos.tar
# "xb_centos6.tar" --为文件名
[root@localhost mydoc]# docker load < xb_centos6.tar
0a2f11f7b1ef: Loading layer [==================================================>] 524.3 MB/524.3 MB
Loaded image ID: sha256:479daab2d4ba4bc744813aa57bd27ef7e31594ff8a6bb10184f42a669064c6d8
[root@localhost mydoc]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 479daab2d4ba 3 minutes ago 512.1 MB
test latest d0769584f950 43 minutes ago 122 MB
docker.io/ubuntu latest dd6f76d9cc90 12 days ago 122 MB
centos new d123f4e55e12 12 days ago 196.6 MB
docker.io/centos latest d123f4e55e12 12 days ago 196.6 MB

注意:导出镜像到本地的时候 如果使用的是镜像Id导出,在回复镜像后就会出现上边的仓库和tag为<none>的形式。使用仓库名则不会。
如:
[root@localhost mydoc]# docker save -o centos6_local.tar centos6
[root@localhost mydoc]# ls
centos6_local.tar  centos-6-x86-minimal.tar.gz  xb_centos6.tar  zuul-log
[root@localhost mydoc]# docker rmi a2
Untagged: centos6:latest
Deleted: sha256:a25a84d41b5b1692738d00416c9694be2d837fdc60a07a1e56f69333d7225fc3
[root@localhost mydoc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
<none>              <none>              479daab2d4ba        9 minutes ago       512.1 MB
test                latest              d0769584f950        49 minutes ago      122 MB
docker.io/ubuntu    latest              dd6f76d9cc90        12 days ago         122 MB
centos              new                 d123f4e55e12        12 days ago         196.6 MB
docker.io/centos    latest              d123f4e55e12        12 days ago         196.6 MB
[root@localhost mydoc]# docker load < centos6_local.tar
Loaded image: centos6:latest
[root@localhost mydoc]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
centos6             latest              a25a84d41b5b        2 minutes ago       512.1 MB
<none>              <none>              479daab2d4ba        9 minutes ago       512.1 MB
test                latest              d0769584f950        50 minutes ago      122 MB
docker.io/ubuntu    latest              dd6f76d9cc90        12 days ago         122 MB
centos              new                 d123f4e55e12        12 days ago         196.6 MB
docker.io/centos    latest              d123f4e55e12        12 days ago         196.6 MB

4)、上传镜像:docker push NAME[:TAG] 
    默认上传到 Docker Hub仓库,需要登陆。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  centos Docker java 容器