Docker镜像管理
1:什么是镜像
镜像文件一般由若干个层(layer)组成,f17d81b4b692这样的串是层的唯一ID,(实际上完整的id是256比特,64个十六进制字符组成),使用docker pull 命令下载中会获取并输出镜像的各层信息,当不同的镜像包括相同的层时,本地仅存了层的一份内容,减少了存储空间。
2:搜索镜像
命令选项:
-f –filter :过滤输出内容
–fromat string: 格式化输出内容
–limit int : 限制输出结果个数,默认25个
–no-trunc:不截断输出结果
[root@virtual_host ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16245 [OK]
---
3:拉取镜像并启动
# 拉取Centos系统镜像,如果不指定TAG,则默认会选择latest标签,下载仓库中最新版本的镜像。
[root@virtual_host ~]# 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
#生产环境应指定版本TAG镜像,拉取nginx:1.20.1稳定版
[root@ecs-test ~]# docker pull nginx:1.20.1
1.20.1: Pulling from library/nginx
b380bbd43752: Pull complete
83acae5e2daa: Pull complete
33715b419f9b: Pull complete
eb08b4d557d8: Pull complete
74d5bdecd955: Pull complete
0820d7f25141: Pull complete
Digest: sha256:a98c2360dcfe44e9987ed09d59421bb654cb6c4abe50a92ec9c912f252461483
Status: Downloaded newer image for nginx:1.20.1
docker.io/library/nginx:1.20.1
如果从非官方的仓库下载,需要在仓库名称前指定完整的仓库地址,例如:从网易蜂巢的镜像源下载ubuntu:18.04
docker pull hub.c.163.com/public/ubuntu:18.04
#查看images
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx 1.20.1 c8d03f6b8b91 2 months ago 133MB
hello-world latest feb5d9fea6a5 3 months ago 13.3kB
centos latest 5d0da3dc9764 3 months ago 231MB
#使用交互式运行centos容器并分配伪终端
#查看容器系统版本
[root@virtual_host ~]# docker run -it centos /bin/bash
[root@1524349d8edb /]# cat /etc/redhat-release
CentOS Linux release 8.4.2105
4:删除镜像
#使用标签删除,可以删除某个标签副本
[root@virtual_host ~]# docker rmi centos:latest
Untagged: centos:latest
Untagged: centos@sha256:a27fd8080b517143cbbbab9dfb7c8571c40d67d534bbdee55bd6c473f432b177
Deleted: sha256:5d0da3dc976460b72c77d94c8a1ad043720b0416bfc16c52c45d4847e53fadb6
Deleted: sha256:74ddd0ec08fa43d09f32636ba91a0a3053b02cb4627c35051aff89f853606b59
#强制删除,一般不建议使用,会导致某些问题
[root@virtual_host ~]# docker rmi -f nginx:1.20.1
Untagged: nginx:1.20.1
Untagged: nginx@sha256:a98c2360dcfe44e9987ed09d59421bb654cb6c4abe50a92ec9c912f252461483
Deleted: sha256:c8d03f6b8b915209c54fc8ead682f7a5709d11226f6b81185850199f18b277a2
Deleted: sha256:67a7407724b6c71e2355fc2236b5be27d1f03bf9cbdffdfbb97c1d2a326ccf94
Deleted: sha256:d9ba8a6f08b1a478a08ac08edeaa89e657a78f71a3f8bdb8eea8f211cfa6bd4a
Deleted: sha256:146919003c6b6842551d30de0707b1c329aa26176093e1b0447090c7faa86696
Deleted: sha256:39bab5abc501ec6f680443ad530ba82576ac0943a63ccafc35a81c75e2f90223
Deleted: sha256:451162614317f9aa771883ba0c53581bf6c2fc84463783d334f7d9c10e076a95
Deleted: sha256:e81bff2725dbc0bf2003db10272fef362e882eb96353055778a66cda430cf81b
#使用镜像ID删除,会删除镜像文件本身
root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 3 months ago 13.3kB
[root@virtual_host ~]# docker rmi feb
Untagged: hello-world:latest
Untagged: hello-world@sha256:507ecde44b8eb741278274653120c2bf793b174c06ff4eaa672b713b3263477b
Deleted: sha256:feb5d9fea6a5e9606aa995e879d862b825965ba48de054caab5ef356dc6b3412
Deleted: sha256:e07ee1baac5fae6a26f30cabfe54a36d3402f96afda318fe0a96cec4ca393359
#删除有正在运行该镜像创建的容器时,应先删除容器id,然后删除镜像id
查看nginx 镜像id
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine bef258acf10d Less than a second ago 23.4MB
#查看容器id
[root@virtual_host ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6cb0b89b1bf3 nginx:alpine "/docker-entrypoint.…" 48 seconds ago Up 47 seconds 80/tcp nginx
#删除容器及镜像
[root@virtual_host ~]# docker rm -f 6cb
6cb
[root@virtual_host ~]# docker rmi -f bef
Untagged: nginx:alpine
Untagged: nginx@sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3
Deleted: sha256:bef258acf10dc257d641c47c3a600c92f87be4b4ce4a5e4752b3eade7533dcd9
Deleted: sha256:af2fcce448e2e4451a5f4796a9bf9cb5c9b5f88e0d6d10029cada42fb9d268ac
Deleted: sha256:b9e199348d7206cb55d8ab0724d68196a04635b74a0a448bee4e881e1a227d02
Deleted: sha256:0ca7a3881c86d6b0a75111269877b29812ee3f38943c2e0940b6aa5c91a6d9f9
Deleted: sha256:9c73bb886729dedf383ca0f3d1e19cc9d7bad261f81386201e70d99da5f03d9e
Deleted: sha256:d92f4554946db13553972cf0f964d343e1b5525328b06548893f0143fbd1d144
Deleted: sha256:8d3ac3489996423f53d6087c81180006263b79f206d3fdec9e66f0e27ceb8759
5:清理镜像
使用Docker一段时间后,系统中会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prun命令清理,支持选项:
-a,-all :删除所有无用镜像,不光是临时镜像
-filter filter :只清理符合给定过滤器的镜像
-f,-force:强制删除镜像。
[root@virtual_host ~]# docker image prune -f
Total reclaimed space: 0B
6:使用tag命令添加镜像标签
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine bef258acf10d Less than a second ago 23.4MB
httpd alpine 294cecd6c779 7 days ago 58.2MB
redis alpine 3900abf41552 4 weeks ago 32.4MB
caddy alpine 439af64db489 6 weeks ago 40.1MB
#添加一个自定义nginx标签
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine bef258acf10d Less than a second ago 23.4MB
nginx v1 bef258acf10d Less than a second ago 23.4MB
httpd alpine 294cecd6c779 7 days ago 58.2MB
redis alpine 3900abf41552 4 weeks ago 32.4MB
caddy alpine 439af64db489 6 weeks ago 40.1MB
7:使用inspect命令查看详细信息
[root@virtual_host ~]# docker inspect nginx:alpine
[
{
"Id": "sha256:bef258acf10dc257d641c47c3a600c92f87be4b4ce4a5e4752b3eade7533dcd9",
"RepoTags": [
"nginx:alpine",
"nginx:v1"
],
"RepoDigests": [
"nginx@sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3"
],
"Parent": "",
"Comment": "",
"Created": "2022-01-25T20:39:11.21594189Z",
"Container": "5c96fae18bfe5309fd16ced41e0839c3f87c35781793208ad2e779d8a2c68ecb",
"ContainerConfig": {
"Hostname": "5c96fae18bfe",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.21.6",
"NJS_VERSION=0.7.2",
"PKG_RELEASE=1"
],
"Cmd": [
"/bin/sh",
"-c",
"#(nop) ",
"CMD [\"nginx\" \"-g\" \"daemon off;\"]"
],
"Image": "sha256:5b7833cf5df3837cb43ec5096f639f42341c5371e4338c6eb2f5f5fc37b4b248",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"DockerVersion": "20.10.7",
"Author": "",
"Config": {
"Hostname": "",
"Domainname": "",
"User": "",
"AttachStdin": false,
"AttachStdout": false,
"AttachStderr": false,
"ExposedPorts": {
"80/tcp": {}
},
"Tty": false,
"OpenStdin": false,
"StdinOnce": false,
"Env": [
"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin",
"NGINX_VERSION=1.21.6",
"NJS_VERSION=0.7.2",
"PKG_RELEASE=1"
],
"Cmd": [
"nginx",
"-g",
"daemon off;"
],
"Image": "sha256:5b7833cf5df3837cb43ec5096f639f42341c5371e4338c6eb2f5f5fc37b4b248",
"Volumes": null,
"WorkingDir": "",
"Entrypoint": [
"/docker-entrypoint.sh"
],
"OnBuild": null,
"Labels": {
"maintainer": "NGINX Docker Maintainers <docker-maint@nginx.com>"
},
"StopSignal": "SIGQUIT"
},
"Architecture": "amd64",
"Os": "linux",
"Size": 23434185,
"VirtualSize": 23434185,
"GraphDriver": {
"Data": {
"LowerDir": "/var/lib/docker/overlay2/a7a97dec7d2934007b3bca421475827c7741b36a07c8b46a4d6908f0d4155ec9/diff:/var/lib/docker/overlay2/989b2bfa24178498e3b550fa7023e91172aae1511e07fdd8650f6ed0e7c35e4c/diff:/var/lib/docker/overlay2/eac65a9d63b60a028c777263c3be9fd2dfb8a8ea16a162c2c0f0c4b768d048fd/diff:/var/lib/docker/overlay2/fd0ae684c2ec41a87f209d8594bffa6d96c9d35e278d32ffc6d3069f5fb585c9/diff:/var/lib/docker/overlay2/1a2c1bdce7de178f2a04280cf0281b08e0bbbe180363c9203e5c6dc5610cf20b/diff",
"MergedDir": "/var/lib/docker/overlay2/22f9c210ac0423a69c8fb71f3e660d4b043cd4d291e3f219ab797699c3cb40a1/merged",
"UpperDir": "/var/lib/docker/overlay2/22f9c210ac0423a69c8fb71f3e660d4b043cd4d291e3f219ab797699c3cb40a1/diff",
"WorkDir": "/var/lib/docker/overlay2/22f9c210ac0423a69c8fb71f3e660d4b043cd4d291e3f219ab797699c3cb40a1/work"
},
"Name": "overlay2"
},
"RootFS": {
"Type": "layers",
"Layers": [
"sha256:8d3ac3489996423f53d6087c81180006263b79f206d3fdec9e66f0e27ceb8759",
"sha256:67bae81de3dc5ccf5101dd4973e8e4b10ee3d5681feb9c30119e6acee1e12dd5",
"sha256:89f4d03665cee1ca943d0b55c086ea7577f4658c2cabe69eaf640f1dc47129f9",
"sha256:318191938fd7801d80ad617482e4312f0ced71e6c1d4bcb02e12d90a9d65eb11",
"sha256:a770f8eba3cb3840d7579e2c4925c9fa275813e8719fe5435905b887a9ee7674",
"sha256:6fda88393b8b02872c87c6626807e7bfac1f49e63f47a5ddba0cd11fae99b575"
]
},
"Metadata": {
"LastTagTime": "2021-12-27T23:30:07.206141383-05:00"
}
}
]
·······································································
#使用-f 指定获取特定参数
[root@virtual_host ~]# docker inspect nginx:alpine -f {{".Architecture"}}
amd64
8:使用history命令查看镜像历史
[root@virtual_host ~]# docker history nginx:alpine
IMAGE CREATED CREATED BY SIZE COMMENT
bef258acf10d Less than a second ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> Less than a second ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> Less than a second ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> Less than a second ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
<missing> Less than a second ago /bin/sh -c #(nop) COPY file:09a214a3e07c919a… 4.61kB
<missing> Less than a second ago /bin/sh -c #(nop) COPY file:0fd5fca330dcd6a7… 1.04kB
<missing> Less than a second ago /bin/sh -c #(nop) COPY file:0b866ff3fc1ef5b0… 1.96kB
<missing> Less than a second ago /bin/sh -c #(nop) COPY file:65504f71f5855ca0… 1.2kB
<missing> Less than a second ago /bin/sh -c set -x && addgroup -g 101 -S … 17.8MB
<missing> Less than a second ago /bin/sh -c #(nop) ENV PKG_RELEASE=1 0B
<missing> Less than a second ago /bin/sh -c #(nop) ENV NJS_VERSION=0.7.2 0B
<missing> Less than a second ago /bin/sh -c #(nop) ENV NGINX_VERSION=1.21.6 0B
<missing> Less than a second ago /bin/sh -c #(nop) LABEL maintainer=NGINX Do… 0B
<missing> 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/sh"] 0B
<missing> 4 weeks ago /bin/sh -c #(nop) ADD file:9233f6f2237d79659… 5.59MB
9:创建镜像
创建镜像的方法有以下3种方式:
(1)基于已有镜像的容器创建
(2)基于本地模板导入
(3)基于Dockerfile创建
(1)基于已有镜像的容器创建
命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
主要选项:
-a:作者信息
-m:提交消息
-c:提交的时候执行Docker指令
-p:提交时暂停容器运行
运行docker run后,进入到该容器中,我们做一些变更,比如安装一些东西,然后针对这个容器进行创建新的镜像
# 查看所有容器
[root@virtual_host ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cec08e21ac4b nginx:alpine "/docker-entrypoint.…" About a minute ago Exited (0) 3 seconds ago nginx
# 启动ID为c6a的容器,ID可简写为前3位
[root@virtual_host ~]# docker start cec
cec
# 进入cec容器
[root@virtual_host ~]# docker exec -it cec /bin/sh
/ #
# 写入测试网页
/ # echo "<a href="https://www.cnblogs.com/devopsdu"><h1>DevOpsdu</h1></a>" >/usr/share/nginx/html/index.html
# 退出容器
/ # exit
# 创建新的镜像
[root@virtual_host ~]# docker commit -m "devopsdu" -a "devops" nginx nginx:devopsdu
sha256:33459ba5bab2f8300948a344f2daf5b2223f565ad668726647ec60ea3a326e21
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx alpine bef258acf10d Less than a second ago 23.4MB
nginx v1 bef258acf10d Less than a second ago 23.4MB
nginx devopsdu 33459ba5bab2 3 seconds ago 23.4MB
(2)基于本地模板导入
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@virtual_host ~]# ls
anaconda-ks.cfg nginx.tar.gz
[root@virtual_host ~]# docker load < nginx.tar.gz
7d0ebbe3f5d2: Loading layer [==================================================>] 83.88MB/83.88MB
9a3a6af98e18: Loading layer [==================================================>] 62MB/62MB
9a94c4a55fe4: Loading layer [==================================================>] 3.072kB/3.072kB
6173b6fa63db: Loading layer [==================================================>] 4.096kB/4.096kB
235e04e3592a: Loading layer [==================================================>] 3.584kB/3.584kB
762b147902c0: Loading layer [==================================================>] 7.168kB/7.168kB
Loaded image: nginx:latest
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 Less than a second ago 142MB
(3)基于Dockerfile创建
基于nginx:alpine镜像构建一个自定义页面的新镜像
[root@virtual_host ~]# cat dockerfile
FROM nginx:latest
RUN echo "<a href="https://www.cnblogs.com/devopsdu"><h1>DevOpsdu</h1></a>" >/usr/share/nginx/html/index.html
# 构建
[root@virtual_host ~]# docker build -t nginx:devopsdu .
Sending build context to Docker daemon 145.9MB
Step 1/2 : FROM nginx:latest
---> c316d5a335a5
Step 2/2 : RUN echo "<a href="https://www.cnblogs.com/devopsdu"><h1>DevOpsdu</h1></a>" >/usr/share/nginx/html/index.html
---> Running in f3d652072ad4
Removing intermediate container f3d652072ad4
---> 094758ba18b8
Successfully built 094758ba18b8
Successfully tagged nginx:devopsdu
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest c316d5a335a5 Less than a second ago 142MB
nginx devopsdu 094758ba18b8 4 seconds ago 142MB
10:存出和载入镜像
#导出镜像到本地文件
[root@virtual_host ~]# docker save -o devopsdu.tar.gz nginx:devopsdu
[root@virtual_host ~]# ls
anaconda-ks.cfg devopsdu.tar.gz
#载入镜像
docker load -i < devopsdu.tar.gz
或者
docker load < devopsdu.tar.gz
11:上传镜像
# 这里我选择使用自建harbor
# 登录仓库
[root@virtual_host ~]# docker login registry.kubernetes.com
Username: admin
Password:
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-store
Login Succeeded
[root@virtual_host ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@virtual_host ~]# docker pull nginx:alpine
alpine: Pulling from library/nginx
59bf1c3509f3: Pull complete
8d6ba530f648: Pull complete
5288d7ad7a7f: Pull complete
39e51c61c033: Pull complete
ee6f71c6f4a8: Pull complete
f2303c6c8865: Pull complete
Digest: sha256:da9c94bec1da829ebd52431a84502ec471c8e548ffb2cedbf36260fd9bd1d4d3
Status: Downloaded newer image for nginx:alpine
docker.io/library/nginx:alpine
# 更改tag
[root@virtual_host ~]# docker tag nginx:alpine registry.kubernetes.com/library/nginx:alpine
# 推送镜像到仓库
[root@virtual_host ~]# docker push registry.kubernetes.com/library/nginx:alpine
The push refers to repository [registry.kubernetes.com/library/nginx]
6fda88393b8b: Pushed
a770f8eba3cb: Pushed
318191938fd7: Pushed
89f4d03665ce: Pushed
67bae81de3dc: Pushed
8d3ac3489996: Pushed
alpine: digest: sha256:050385609d832fae11b007fbbfba77d0bba12bf72bc0dca0ac03e09b1998580f size: 1568