参考资料:
https://docs.docker.com/
Docker镜像详解(分层理解)_dockerfile 镜像分层原理解释-CSDN博客
1.帮助命令:
docker version
docker info(看系统信息,启动的容器、镜像等信息)、
docker images(命令) --help 查看命令的用法
https://docs.docker.com/engine/reference/commandline/docker/
2.镜像命令
1. 查看所有镜像
docker images
docker images -a
查看所有镜像
docker images --q
查看镜像id
2.搜索镜像
docker search 镜像
docker search mysql 相当于在官方仓库中搜索
docker search mysql --filter=STARTS=3000 搜索STARTS大于等于3000的
3.下载镜像
docker pull :[tag]
不加版本号默认最新版
4.删除镜像
docker rmi -f 镜像名称或者id
docker rmi -f mysql:latest
docker rmi -f cd80881c4e0e
docker rmi -f $(docker images -aq)删除全部镜像 $(这里放要删除的参数)
3.容器命令
说明:有了镜像才能创建容器,镜像相当于类class,容器相当于1个对象
1.启动容器
docker run [可选参数] image
--name=“tomcat1” 指定容器名字,tomcat1,tomcat2
docker run -d --name nginx1 -p 443:80 nginx
-d 后台方式运行
-it 使用交互方式运行,进入容器查看内容
-p 指定端口
-p ip:主机端口:容器端口tomcat的端口
-p 主机端口:容器端口
-p 容器端口
-P(大p)随机分配端口
测试并启动交互式centos
┌──(root㉿z)-[~]
└─# docker run -it centos /bin/bash
[root@63e41c8a9f1d /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
[root@63e41c8a9f1d /]# exit
exit
┌──(root㉿z)-[~]
└─# ls
1.txt dayu.txt docker_arl Downloads Pictures Videos
Desktop Documents Music Public Templates vulhub
一个是kali,一个是centos
2.查看运行的容器
docker ps 查看正在运行的容器
docker ps -a 列出正在运行和曾经运行的容器
docker ps -a -n=2 列出最近运行的2个容器
3.退出容器
1.exit 停止容器
2.ctrl+p+q 退出容器但不停止
4.删除容器
docker rm -f 容器名称 强制删除容器(包括正在运行的)
docker rm -f $(docker ps -aq)强制删除所有容器(包括正在运行的)
5.其他常用的命令
1.linux对容器的命令
docker start 容器id 不是镜像id 用docker ps -a看
docker restart 容器id
docker stop 容器id
docker kill 容器id
2.查看容器日志
docker logs 容器id -tf --details -t是展示时间
└─# docker logs 7fb210685923 -tf --details
2024-01-31T12:19:56.322492380Z [root@7fb210685923 /]# ls
2024-01-31T12:19:56.335312258Z bin etc lib lost+found mnt proc run srv tmp var
2024-01-31T12:19:56.335397456Z dev home lib64 media opt root sbin sys usr
2024-01-31T12:19:58.930814996Z [root@7fb210685923 /]# exit
2024-01-31T12:19:58.930895194Z exit
2024-01-31T12:47:01.346371856Z [root@7fb210685923 /]# exit
3.查看容器进程
docker top 容器id
└─# docker top 2bf1b9bfb253
UID PID PPID C STIME TTY TIME CMD
root 707657 707620 0 21:02 pts/0 00:00:00 /bin/bash
4.查看容器的元数据(所有信息)
docker inspect 容器id
[
{
"Id": "2bf1b9bfb2533a52f31e3e8d9340ec3f13ac5e5e24f9998a077442ab1cce8c77",
"Created": "2024-01-31T13:02:15.346991778Z",
"Path": "/bin/bash",
"Args": [],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
......}}省略
5.进入正在运行的容器
1.docker exec -it 容器id execute执行
6.把容器内的文件拷贝到本地
docker cp 容器id:容器文件的地址 本地地址
docker cp 2bf1b9bfb253:/1.jar /root
4.实验
1.开启nginx服务
docker search nginx
docker pull nginx
docker run -d --name nginx1 -p 445:80 nginx #-d是后台运行,-name是容器名字,-p指定宿主机和容器端口 访问127.0.0.1:445,可得
5.docker的分层理解
一、Docker镜像加载原理
UnionFs (联合文件系统)
我们下载的时候看到分层的下载就是联合文件系统
UnionFs:是一种分层、轻量级并且高性能的文件系统,他支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下。Union文件系统是Docker镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的应用镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统叠加起来,这样最终的文件系统会包含所有底层的文件和目录。
Docker镜像加载原理
docker的镜像实际上由一层一层的文件系统组成,这种层级的文件系统UnionFS。
bootfs(boot file system)主要包含 bootloader和 Kernel, bootloader主要是引导加 kernel,Linux刚启动时会加bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由 bootfs转交给内核,此时系统也会卸bootfs。
rootfs(root file system)在 bootfs之上。包含的就是典型 Linux系统中的 /dev,/proc,/bin,/etc等标准目录和文件。rootfs就是各种不同的操作系统发行版,比如 Ubuntu,Centos等等。
平时我们安装进虚拟机的CentOS都是好几个G,为什么Docker这里才200M?
对于个精简的OS,rootfs可以很小,只需要包含最基本的命令,工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs就可以了。由此可见对于不同的Linux发行版, bootfs基本是一致的, rootfs会有差別,因此不同的发行版可以公用bootfs。
二、分层理解
所有的Docker镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之上,创建新的镜像层。分层时有文件更新直接替换,基础镜像一样时直接拿过来复用。
如redis下载时,第一层相同,直接复用,其他几层分层下载。
afb6ec6fdc1c: Already exists
608641ee4c3f: Pull complete
668ab9e1f4bc: Pull complete
78a12698914e: Pull complete
d056855f4300: Pull complete
618fdf7d0dec: Pull complete
举一个简单的例子,假如基于 Ubuntu16.04创建一个新的镜像,这就是新镜像的第一层。如果在该镜像中添加Python包,就会在基础镜像层之上创建第二个镜像层。如果继续添加一个安全补丁,就会创健第三个镜像层该像当前已经包含3个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。
在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合。一个简单的例子,每个镜像层包含3个文件,而镜像包含了来自两个镜像层的6个文件。
下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有6个文件,这是因为最上层中的文件7是文件5的一个更新版。上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新镜像层添加到镜像当中。
所有镜像层堆并合井,对外提供统一的视图。
Docker镜像都是只读的,当容器启动时,一个新的可写层加载到镜像的顶部。这一层就是我们通常说的容器层,容器之下的都叫镜像层。
6.提交容器成为镜像
docker commit 提交容器成为一个新的副本
# 命令和git原理类似
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
测试
# 1、启动一个默认的tomcat
docker run -d -p 8080:8080 tomcat
# 2、发现这个默认的tomcat是没有webapps应用,官方的镜像默认webapps下面是没有文件的
docker exec -it 容器id
# 3、拷贝文件进去
# 4、将操作过的容器通过commit提交为一个镜像。我们以后就使用我们修改过的镜像即可。
docker commit -m="描述信息" -a="作者" 容器id 目标镜像名:[TAG]
docker commit -a="jess" -m="add webapps app" 容器id tomcat02:1.0
7.容器数据卷
参考链接:https://blog.csdn.net/huangjhai/article/details/119860628
https://blog.csdn.net/huangjhai/article/details/119860628
1.数据卷介绍
Docker将运用与运行的环境打包形成容器运行, Docker容器产生的数据,如果不通过docker commit生成新的镜像,使得数据做为镜像的一部分保存下来, 那么当容器删除后,数据自然也就没有了。 为了能保存数据在Docker中我们使用卷。|
卷就是目录或文件,存在于一个或多个容器中,由Docker挂载到容器,但卷不属于联合文件系统(Union FileSystem),因此能够绕过联合文件系统提供一些用于持续存储或共享数据的特性:。
卷的设计目的就是数据的持久化,完全独立于容器的生存周期,因此Docker不会在容器删除时删除其挂载的数据卷。
数据卷命令
docker volume create my-volume 新建一个卷
docker volume ls 列出所有卷
docker volume rm my-volume 删除指定的卷
docker volume prune 删除所有卷
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
2.数据卷的特点:
数据卷可在容器之间共享或重用数据
卷中的更改可以直接生效
数据卷中的更改不会包含在镜像的更新中
数据卷的生命周期一直持续到没有容器使用它为止
3.命令
docker run -it -v 主机目录:容器目录 镜像名称 /bin/bash 用/bin/bash执行命令
主机和容器的数据同步,主机或容器修改数据都会影响对方
即使容器停止运行或者容器删除,仍然可以实现数据同步,本地的数据卷不会丢失。
docker inspect 容器id
4.匿名挂载和具名挂载
Docker所有的数据卷默认在/var/lib/docker/volumes/ 目录下
1.匿名挂载
docker run -d -P --name nginx1 -v /etc/nginx nginx
docker volume ls
---5cada4d619a9049e802dddfcbf9b4a1b7ca0a4892c6c07fc38ccb45352f48c19
2.具名挂载
docker run -d -P --name nginx2 -v havename_nginx:/etc/nginx nginx
5.设置权限
ro —— readonly 只读。设置了只读则只能操作宿主机的路径,不能操作容器中的对应路径。
rw ----- readwrite 可读可写
docker run -d -P --name nginx02 -v mynginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v mynginx:/etc/nginx:rw nginx
8.Dockerfile
使用docker-compose 需要在docker-compose.yml 目录下使用
docker-compose build
docker-compose up -d # 建立容器
docker-compose down # 停止容器