大家好,我是沐风晓月,本文收录于沐风晓月的专栏《容器管理》,更多内容可以关注我的博客: https://blog.csdn.net/wisdom_futrue
今天我们主要探讨,docker镜像的使用,如果你还没有安装docker,参考:CentOS7操作系统离线安装docker
如果从概念上来看,基本上是这样的: 镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件。
对上面的概念的理解:
docker分层镜像机制:docker镜像是分层创建的,DockerFile中每一条指令都会新建一层;
为什么要采用镜像的分层结构?
主要是为了共享资源,有多个镜像都从相同的 base 镜像构建而来,那么 Docker Host 只需在磁盘上保存一份 base 镜像;同时内存中也只需加载一份 base 镜像,就可以为所有容器服务了。而且镜像的每一层都可以被共享。
如果多个容器共享一份基础镜像,当某个容器修改了基础镜像的内容,比如 /etc 下的文件,这时其他容器的 /etc 是否也会被修改?
不会,因为copy-on-write特性,修改会被限制在单个容器内。只有当需要修改时才复制一份数据,这种特性被称作 Copy-on-Write。
不分层的痛点: 我们拉取一个镜像,比如redis镜像需要100M, 下次我们要下载一个redis新版本,尽管两个版本的差异只是改了一行配置文件,但也要重新下载100M。这样就非常低效。
我们都知道备份中有个词叫:差异备份,那能不能让docker实现差异下载。 比如第一次下载的时候需要下载所有层,但第二次的时候前面几层下载过了就不要重新下载了。
比如: 第一次下载MySQL:
当第二次下载的时候:
可以看到前面的几层,全部都显示已经存在,不需要额外下载了 。
这种思想和我们常用的版本管理工具git也是一样的!
如果版本2是基于版本1的基础上,那么版本2不需要copy一份全量的数据,只需一份和版本1差异化的增量数据即可!
这样的最终好处是,可以体现在以下方面:
在默认情况下,docker拉取的镜像放在/var/lib/docker 的目录下:
[root@mufeng63 ~]# docker info |grep "Docker Root Dir"
Docker Root Dir: /var/lib/docker
[root@mufeng63 imagedb]# cd /var/lib/docker/
[root@mufeng63 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
redis 6.2 7614ae9453d1 15 months ago 113MB
redis latest 7614ae9453d1 15 months ago 113MB
mysql 5.7 c20987f18b13 15 months ago 448MB
mysql latest 3218b38490ce 15 months ago 516MB
[root@mufeng63 docker]# find . -name 3218b38490ce*
./image/overlay2/imagedb/content/sha256/3218b38490cec8d31976a40b92e09d61377359eab878db49f025e5d464367f3b
我们刚刚看到存储路径默认在/var/lib/docker中,如果想把路径改为: /data/docker
可以参考以下方法:
[root@mufeng63 ~]# mkdir -p /data/docker
[root@mufeng63 ~]# cd /etc/docker/
[root@mufeng63 docker]# vim daemon.json
[root@mufeng63 docker]# cat daemon.json
{
"registry-mirrors": ["https://ywrd8tun.mirror.aliyuncs.com"],
"data-root":"/data/docker"
}
[root@mufeng63 docker]# systemctl restart docker
[root@mufeng63 docker]# docker info |grep "Docker R"
Docker Root Dir: /data/docker
可以看到路径已经改为了/data/docker .
docker 提供了一个公有镜像仓库: Docker Hub 。 操作docker的时候,如果没有指定镜像仓库地址,默认使用的是官方的镜像仓库地址。
地址: https://hub.docker.com/
案例一: 拉取MySQL镜像
用docker search可以查看当前的可以下载镜像
[root@mufeng63 ~]# docker search mysql --limit 5
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14013 [OK]
mariadb MariaDB Server is a high performing open sou… 5345 [OK]
percona Percona Server is a fork of the MySQL relati… 603 [OK]
phpmyadmin phpMyAdmin - A web interface for MySQL and M… 777 [OK]
circleci/mysql MySQL is a widely used, open-source relation… 29
[root@mufeng63 ~]#
使用docker pull 拉取,如果不指定版本,默认拉取最新版本:
[root@mufeng63 ~]# docker pull mysql:5.7
如何查看自己的镜像是从哪里拉取呢?
可以用以下命令:
[root@mufeng63 ~]# docker info |tail
Docker Root Dir: /data/docker
Debug Mode: false
Registry: https://index.docker.io/v1/
Experimental: false
Insecure Registries:
127.0.0.0/8
Registry Mirrors:
https://ywrd8tun.mirror.aliyuncs.com/
Live Restore Enabled: false
// 搜索带 nginx 关键字的镜像
[root@mufeng63 ~]# docker search nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 18354 [OK]
bitnami/nginx Bitnami nginx Docker Image 155 [OK]
bitnami/nginx-ingress-controller Bitnami Docker Image for NGINX Ingress Contr… 23 [OK]
ubuntu/nginx Nginx, a high-performance reverse proxy & we… 84
kasmweb/nginx An Nginx image based off nginx:alpine
// 搜索官方提供的带 nginx 关键字的镜像
$ docker search --filter=is-official=true nginx
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
nginx Official build of Nginx. 16924 [OK]
// 搜索所有收藏数超过4的带 nginx 关键字的镜像
$ docker search --filter=stars=4 nginx
// 搜索自动创建的仓库(镜像)
$ docker search nginx --filter "is-automated=true"
// 搜索mysql 并只看前3个
[root@mufeng63 ~]# docker search mysql --limit 3
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 14013 [OK]
mariadb MariaDB Server is a high performing open sou… 5345 [OK]
percona Percona Server is a fork of the MySQL relati… 603 [OK]
这里返回的一些关键字:
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]# docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 15 months ago 448MB
同一个仓库源可以有多个TAG,代表这个仓库源的不同版本,我们使用镜像仓库源:镜像标签来定义不同的镜像
可以使用 inspect命令查看镜像的详细信息
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]# docker image inspect mysql:5.7
[
{
"Id": "sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76",
"RepoTags": [
"mysql:5.7"
],
"RepoDigests": [
"mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94"
],
"Parent": "",
"Comment": "",
"Created": "2021-12-21T02:56:51.419272329Z",
"Container": "6ab3c250aff0cce746e68539255208e6468cfe4a745272cd0d765394038caa18",
"ContainerConfig": {
"Hostname": "6ab3c250aff0",
使用history还可以查看历史镜像,也就是查看各个层具体内容是什么,各层的创建信息。
为了方便在后续工作中使用特定镜像,还可以使用 docker tag 命令来为本地镜像任
意添加新的标签。例如,添加一个新的 mufengmysql:latest 镜像标签:
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]# docker tag mysql:5.7 mufengmysql:latest
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mufengmysql latest c20987f18b13 15 months ago 448MB
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]#
-f
表示强制删除。[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mufengmysql latest c20987f18b13 15 months ago 448MB
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]# docker rmi mufengmysql:latest
Untagged: mufengmysql:latest
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mysql 5.7 c20987f18b13 15 months ago 448MB
[root@mufeng63 ~]# docker rmi c20987f18b13
Untagged: mysql:5.7
Untagged: mysql@sha256:f2ad209efe9c67104167fc609cca6973c8422939491c9345270175a300419f94
Deleted: sha256:c20987f18b130f9d144c9828df630417e2a9523148930dc3963e9d0dab302a76
Deleted: sha256:6567396b065ee734fb2dbb80c8923324a778426dfd01969f091f1ab2d52c7989
Deleted: sha256:0910f12649d514b471f1583a16f672ab67e3d29d9833a15dc2df50dd5536e40f
Deleted: sha256:6682af2fb40555c448b84711c7302d0f86fc716bbe9c7dc7dbd739ef9d757150
Deleted: sha256:5c062c3ac20f576d24454e74781511a5f96739f289edaadf2de934d06e910b92
Deleted: sha256:8805862fcb6ef9deb32d4218e9e6377f35fb351a8be7abafdf1da358b2b287ba
Deleted: sha256:872d2f24c4c64a6795e86958fde075a273c35c82815f0a5025cce41edfef50c7
Deleted: sha256:6fdb3143b79e1be7181d32748dd9d4a845056dfe16ee4c827410e0edef5ad3da
Deleted: sha256:b0527c827c82a8f8f37f706fcb86c420819bb7d707a8de7b664b9ca491c96838
Deleted: sha256:75147f61f29796d6528486d8b1f9fb5d122709ea35620f8ffcea0e0ad2ab0cd0
Deleted: sha256:2938c71ddf01643685879bf182b626f0a53b1356138ef73c40496182e84548aa
Deleted: sha256:ad6b69b549193f81b039a1d478bc896f6e460c77c1849a4374ab95f9a3d2cea2
[root@mufeng63 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@mufeng63 ~]#
# 停止所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker stop
# 删除所有容器
docker ps -a | grep "Exited" | awk '{print $1 }'|xargs docker rm
# 删除异常停止的docker容器
docker rm `docker ps -a | grep Exited | awk '{print $1}'`
# 可以删除所有名字中带 “none” 关键字的镜像
docker rmi $(docker images | grep "none" | awk '{print $3}')
# 删除所有镜像
docker image rm $(docker image ls -q) -f
# 删除所有镜像
docker rmi `docker images -q`
以上就是关于容器镜像的全部内容,关注我,一起学习和探讨。
好啦,这就是今天要分享给大家的全部内容了,我们下期再见!
博客主页:mufeng.blog.csdn.net
本文由沐风晓月原创,首发于CSDN博客
全力以赴,持续学习,不负如来不负卿,喜欢的话记得点赞收藏哦